diff --git a/.gitignore b/.gitignore index 6d4c0aa06..f4204c22d 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,6 @@ pnpm-debug.log* # macOS-specific files .DS_Store + +# goland ide +.idea/ \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..28bb97cfc --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +src/scripts/prism.js \ No newline at end of file diff --git a/.prettierrc.mjs b/.prettierrc.mjs new file mode 100644 index 000000000..7e619305d --- /dev/null +++ b/.prettierrc.mjs @@ -0,0 +1,12 @@ +/** @type {import("prettier").Config} */ +export default { + plugins: ["prettier-plugin-astro"], + overrides: [ + { + files: "*.astro", + options: { + parser: "astro", + }, + }, + ], +}; diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..a4ae4da14 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "svg.preview.background": "transparent", + "cSpell.words": [ + "Axelar", + "Interchain" + ] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7ebd9f18c..0566bfeb1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,15 +1,19 @@ -## Contributing to Axelar +# Contributing to Axelar We appreciate your interest in contributing to Axelar! This document `CONTRIBUTING.md` provides a high-level overview of how you can get involved. -### Table of Contents +## Table of contents -- [Introduction](#introduction) -- [Getting Started](#getting-started) -- [How to Contribute](#how-to-contribute) -- [Code of Conduct](#code-of-conduct) +- [Contributing to Axelar](#contributing-to-axelar) + - [Table of contents](#table-of-contents) + - [Getting started](#getting-started) + - [How to contribute](#how-to-contribute) + - [Code of conduct](#code-of-conduct) + - [Standards](#standards) + - [Responsibilities](#responsibilities) + - [Project structure](#project-structure) -### Getting Started +## Getting started If you are new to the Axelar Network, we encourage you to read the [Axelar Documentation](https://docs.axelar.network/) to learn more about the Axelar Network and how to get started. @@ -17,25 +21,25 @@ If you are new to contributing to open-source projects, we encourage you to read --- -### How to Contribute +## How to contribute 1. Before you submit your Pull Request (PR), search the project for an open or closed PR related to your submission. You don't want to duplicate effort. -2. Fork the repository within your user and clone it to your local machine. -3. Install the dependencies for the project as indicated in the README.md -4. Create a new branch for your contribution with the following command: +1. Fork the repository within your user and clone it to your local machine. +1. Install the dependencies for the project as indicated in the README. +1. Create a new branch for your contribution with the following command: ```shell git checkout -b my-fix-branch ``` -5. Make your changes in the new git branch -6. Commit your changes. Your commit message should follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification. +1. Make your changes in the new git branch. +1. Commit your changes. Your commit message should follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification. ```shell git commit -a ``` - Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files. Push your branch to GitHub with the following command: + **Note:** the optional commit `-a` command line option will automatically "add" and "rm" edited files. Push your branch to GitHub with the following command: ```shell git push origin my-fix-branch @@ -43,22 +47,22 @@ If you are new to contributing to open-source projects, we encourage you to read Open a pull request from your forked repository to the original repository. -If we suggest changes then: +If we suggest changes: - Make the required updates and commit them to your branch. -- Wait for the project maintainer to review your changes and merge your Pull Request. +- Wait for the project maintainer to review your changes and merge your pull request. > If you find a bug in the source code or a mistake in the documentation, you can help us by submitting an issue. -When you open a new issue, please provide as much detail as possible, including steps to reproduce the problem and the expected behavior. Even better, you can submit a Pull Request with a fix. +When you open a new issue, please provide as much detail as possible, including steps to reproduce the problem and the expected behavior. Even better, you can submit a pull request with a fix. --- -### Code of Conduct +## Code of conduct We pledge to create a harassment-free experience for everyone in our project and community, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. -#### Our Standards: +### Standards We expect all participants to use welcoming and inclusive language, respect differing viewpoints and experiences, gracefully accept constructive criticism, focus on what's best for the community, and show empathy towards other members. @@ -70,8 +74,13 @@ Unacceptable behavior includes: - Publishing others' confidential information without explicit permission. - Any other conduct that could be considered inappropriate in a professional setting. -#### Our Responsibilities: +### Responsibilities As project maintainers, we clarify the standards of acceptable behavior and take appropriate corrective action in response to unacceptable behavior. We also reserve the right to remove or reject any contributions that do not align with this Code of Conduct or to temporarily or permanently ban any contributor who exhibits inappropriate, threatening, offensive, or harmful behavior. + +## Project structure + +- **`src/content/`**: All documentation content in Markdown format. +- **`src/layouts/navigation.ts`**: Defines the navigation structure for the documentation site. diff --git a/README.md b/README.md index 3377f3537..35b20ee41 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,12 @@ # Axelar Docs +- [Axelar Docs](#axelar-docs) + - [Updating Navigation](#updating-navigation) + - [How to Contribute to the Docs](#how-to-contribute-to-the-docs) + - [Here's what you need to know to contribute to the Axelar documentation:](#heres-what-you-need-to-know-to-contribute-to-the-axelar-documentation) + - [Short links](#short-links) + - [ITS](#its) + The official documentation website for [Axelar](https://github.com/axelarnetwork). The project uses [Astro](https://astro.build) and deploys via [Vercel](https://vercel.com). To develop it locally, clone this repository and run the following command to start the local dev server: @@ -14,3 +21,28 @@ And visit `localhost:3000` to preview your changes. ## Updating Navigation Site navigation is generated in TypeScript based on the section the user is currently browsing in. The navigation layout is managed in [`src/layouts/navigation.ts`](https://github.com/axelarnetwork/axelar-docs/blob/main/src/layouts/navigation.ts), with pages represented as a `title` and `href` in one of the `children` arrays. The site supports up to 3 levels of nested navigation, with the top level acting as navigation header. Each subsequent level is visually tabbed beneath its parent. + +## How to Contribute to the Docs + +### Here's what you need to know to contribute to the Axelar documentation: + +- Content Folder: Contributions are made by adding files to this [folder](/src/content/docs/). This folder structure defines the organization and links within the documentation. +- Creating a New Page: To add a new page, create a new Markdown file (.md or .mdx) inside the /docs/ folder. Use a descriptive filename that reflects the topic of your page (e.g., /src/content/docs/learn/security.mdx). +- Updating Navigation: Once you've created a new page, you need to update the navigation bar to include it. Edit the file [`src/layouts/navigation.ts`](https://github.com/axelarnetwork/axelar-docs/blob/main/src/layouts/navigation.ts). This file controls the navigation links throughout the Axelar docs website. Locate the appropriate section and add an entry for your new page, ensuring consistency with the existing navigation style. + +## Short links + +These links redirect to pages in the documentation whose slugs may otherwise be hard to remember. + +### ITS + +- **Introduction:** https://docs.axelar.dev/its/intro +- **No-Code ITS Setup:** https://docs.axelar.dev/dev/send-tokens/interchain-tokens/no-code/ +- **Create New Interchain Token:** https://docs.axelar.dev/dev/its/create-new-token/ +- **Upgrade Token:** https://docs.axelar.dev/its/upgrade-token +- **Integrate Custom Token:** https://docs.axelar.dev/dev/its/custom-token/ +- **Interchain Token Executable:** https://docs.axelar.dev/its/token-executable +- **Flow Limit:** https://docs.axelar.dev/its/flow-limit +- **Programmatically Create a Token:** https://docs.axelar.dev/its/create-token-tutorial +- **Programmatically Create a Canonical Token:** https://docs.axelar.dev/its/canonical-token-tutorial +- **Link Custom Tokens into Interchain Tokens:** https://docs.axelar.dev/its/link-token-tutorial diff --git a/STYLE-GUIDE.md b/STYLE-GUIDE.md index 9f12f47ad..bc7ebfcc4 100644 --- a/STYLE-GUIDE.md +++ b/STYLE-GUIDE.md @@ -1,4 +1,4 @@ -# Axelar developer documentation style guide +# Axelar Developer Documentation Style Guide Thank you for contributing to the Axelar documentation! We aim to provide clear, consistent information on how to build for the interchain future. Please refer to this guide when working on the docs. It will be updated regularly as Axelar grows and new standards come into place. @@ -9,6 +9,7 @@ This style guide is inspired by the [Google developer documentation style guide] - [Voice and tone](#voice-and-tone) - [Document structure](#document-structure) - [Content format](#content-format) +- [Wording](#wording) ## Voice and tone @@ -18,12 +19,14 @@ This style guide is inspired by the [Google developer documentation style guide] ### When addressing the reader - Address the reader directly by using the second-person "you." -- Do not use the word "I." When speaking on Axelar's behalf, use "we." +- Do not use the word "I." When speaking on Axelar's behalf (as a member of the Axelar team), use "we." +- Avoid using “we” to refer to Axelar as a project. Refer to Axelar by name or as “the project,” “the community,” “the ecosystem,” etc. | **Recommended** | **Not recommended** | | ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | | Hardhat and Foundry are local development platforms. Use Remix if you prefer an online editor. | Hardhat and Foundry are local development platforms. I'd use Remix if I preferred an online editor. | | We recommend using MetaMask for this tutorial. | I recommend using MetaMask for this tutorial. | +| We're launching a bunch of cool new Interchain features this month. | Axelar will have a bunch of cool new Interchain features this month. | ### When referring to a third party user or developer @@ -102,7 +105,7 @@ function sendToMany( `sendToMany` will need to get the address of a token from its symbol, send funds to another address, approve the gateway to spend funds, and encode the recipient addresses on the destination chain to ensure that they are `bytes`, since GMP messages must be of this type. It will have a list of `bytes` as output. -```solidity` +```solidity function sendToMany( string memory \_destChain, string memory \_destContractAddr, @@ -122,84 +125,133 @@ uint256 \_amount bytes memory recipientAddressesEncoded = abi.encode(_destinationAddrs); } - ``` ### Section headings -* Don't skip heading types. A subheading under a title should be an H1, the nested subheading under that one an H2, and so forth. +- Don't skip heading types. A subheading under a title should be an H1, the nested subheading under that one an H2, and so forth. ### Document titles -* Write in sentence case rather than capitalizing every letter of a new word. +- For **H1 headings** (headings with one "#" sign in front), use [title case](https://titlecaseconverter.com/) for all words longer than 3 characters. + +| **Recommended** | **Not recommended** | +| --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| Everything you Always Wanted to Know About Headings, but Were Afraid to Ask | Everything you always wanted to know about headings, but were afraid to ask | + +- For **H2 headings and below** (headings with two or more "#" signs in front), write in [sentence case](https://apastyle.apa.org/style-grammar-guidelines/capitalization/sentence-case) rather than capitalizing every letter of a new word. + +| **Recommended** | **Not recommended** | +| ----------------------------------- | ----------------------------------- | +| Set up your development environment | Set Up Your Development Environment | + +- Always use numerical numbers in all headings. + +| **Recommended** | **Not recommended** | +| ------------------------------- | ---------------------------------- | +| 5 Things to Know About Headings | Five Things to Know About Headings | -| **Recommended** | **Not recommended** | -| --- | --- | -| Set up your development environment | Set Up Your Development Environment | +- Never close a heading with a period. Exclamation points and question marks are OK. + +| **Recommended** | **Not recommended** | +| --------------------------- | -------------------------- | +| How to End a Heading Title. | How to End a Heading Title | ## Content format -* Use bold, italic, and code font when appropriate. -* Product names should not have any special font formatting. +- Always put parentheses after a method name. +- Use bold, italic, and code font when appropriate. +- Product names should not have any special font formatting. +- All links should be root-relative (`/dev/path/to/`, `validator/path/to`) and end with a `/`. + +### Method names + +- Method names should always include parentheses, so that they are not confused with properties. + +| **Recommended** | **Not recommended** | +| --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | +| Users can call `interchainTransfer()` on a token to transfer between blockchains. | Users can call `interchainTransfer` on a token to transfer between blockchains. | ### Bold font -* Use bold font for UX elements. +- Use bold font for UX elements. -| **Recommended** | **Not recommended** | -| --- | --- | -| In MetaMask, go to the **Tokens** tab and click **Import Tokens**. | In MetaMask, go to the “Tokens” tab and click “Import Tokens.” | +| **Recommended** | **Not recommended** | +| ------------------------------------------------------------------ | -------------------------------------------------------------- | +| In MetaMask, go to the **Tokens** tab and click **Import Tokens**. | In MetaMask, go to the “Tokens” tab and click “Import Tokens.” | ### Italic font -* Use italics when using a new concept or term for the first time. Do not italicize more than once. +- Use italics when using a new concept or term for the first time. Do not italicize more than once. -| **Recommended** | **Not recommended** | -| --- | --- | -| Axelar's __General Message Passing (GMP)__ enables a developer building on one chain to call any function on any other connected chain. | Axelar's **General Message Passing (GMP)** enables a developer building on one chain to call any function on any other connected chain. | -| Axelar's __General Message Passing (GMP)__ enables a developer building on one chain to call any function on any other connected chain. For GMP to work, chains A and B must be EVM or Cosmos with a deployed Axelar Gateway contract. | Axelar's __General Message Passing (GMP)__ enables a developer building on one chain to call any function on any other connected chain. For __GMP__ to work, chains A and B must be EVM or Cosmos with a deployed Axelar Gateway contract. | +| **Recommended** | **Not recommended** | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Axelar's **General Message Passing (GMP)** enables a developer building on one chain to call any function on any other connected chain. | Axelar's **General Message Passing (GMP)** enables a developer building on one chain to call any function on any other connected chain. | +| Axelar's **General Message Passing (GMP)** enables a developer building on one chain to call any function on any other connected chain. For GMP to work, chains A and B must be EVM or Cosmos with a deployed Axelar Gateway contract. | Axelar's **General Message Passing (GMP)** enables a developer building on one chain to call any function on any other connected chain. For **GMP** to work, chains A and B must be EVM or Cosmos with a deployed Axelar Gateway contract. | ### Underlined font -* Do not underline anything in the documentation. +- Do not underline anything in the documentation. ### Code font -* Use code font for text input, strings, and any names found in code, such as properties and methods. +- Use code font for text input, strings, and any names found in code, such as properties and methods. -| **Recommended** | **Not recommended** | -| --- | --- | -| If the prepaid gas is insufficient, you might see `NOT ENOUGH GAS` or other messages, such as `Insufficient gas for executing the transaction` and `intrinsic gas too low`. | If the prepaid gas is insufficient, you might see __NOT ENOUGH GAS__ or other messages, such as __Insufficient gas for executing the transaction__ and __intrinsic gas too low__. | -| `sendToMany()` takes many parameters, including `_destChain` and `_destContractAddr`. | **sendToMany()** takes many parameters, including **_destChain** and **_destContractAddr**. | -| Give your test wallet an alias, such as `My Sepolia test wallet`. | Give your test wallet an alias, such as "My Sepolia test wallet". | +| **Recommended** | **Not recommended** | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| If the prepaid gas is insufficient, you might see `NOT ENOUGH GAS` or other messages, such as `Insufficient gas for executing the transaction` and `intrinsic gas too low`. | If the prepaid gas is insufficient, you might see **NOT ENOUGH GAS** or other messages, such as **Insufficient gas for executing the transaction** and **intrinsic gas too low**. | +| `sendToMany()` takes many parameters, including `_destChain` and `_destContractAddr`. | **sendToMany()** takes many parameters, including **\_destChain** and **\_destContractAddr**. | +| Give your test wallet an alias, such as `My Sepolia test wallet`. | Give your test wallet an alias, such as "My Sepolia test wallet". | ### Hyperlinks -* Use descriptive hyperlink text rather than the word "here." +- Use descriptive hyperlink text rather than the word "here." -| **Recommended** | **Not recommended** | -| --- | --- | -| For more information on General Message Passing, check out [Axelar's YouTube channel](https://www.youtube.com/channel/UCf8GFg58fdp1iZwLAOV1Tgg). | For more information on General Message Passing, check out Axelar's YouTube channel [here](https://www.youtube.com/channel/UCf8GFg58fdp1iZwLAOV1Tgg). | +| **Recommended** | **Not recommended** | +| ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | +| For more information on General Message Passing, check out [Axelar's YouTube channel](https://www.youtube.com/channel/UCf8GFg58fdp1iZwLAOV1Tgg). | For more information on General Message Passing, check out Axelar's YouTube channel [here](https://www.youtube.com/channel/UCf8GFg58fdp1iZwLAOV1Tgg). | + +- Use the root-relative path instead of a relative one when linking in docs. This makes links less likely to break if a file is moved into another folder. + +| **Recommended** | **Not recommended** | +| -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `Make sure you've gone through the [Amplifier chain integration tutorial](/dev/amplifier/chain-integration/integrate-a-chain/).` | `Make sure you've gone through the [Amplifier chain integration tutorial](/dev/amplifier/chain-integration/integrate-a-chain).` | +| `Create a [custom token](/dev/glossary/#custom-token).` | `Create a [custom token](../../reference/glossary#custom-token).` | ### Lists -* When writing a list, either use complete sentences for all elements or no elements. Either every element has a period at the end, or none of them do. Do not mix and match. +- When writing a list, either use complete sentences for all elements or no elements. Either every element has a period at the end, or none of them do. Do not mix and match. **Recommended** Implement the following to send an interchain transaction with Axelar: -* `AxelarExecutable` – The contract to handle a message on the destination chain once a transaction has been sent to the Axelar network -* `IAxelarGateway` – The Axelar Gateway -* `IAxelarGasService` – The Axelar Gas Service -* `IERC20` – The ERC-20 token interface to access ERC-20-related functionality +- `AxelarExecutable` – The contract to handle a message on the destination chain once a transaction has been sent to the Axelar network +- `IAxelarGateway` – The Axelar Gateway +- `IAxelarGasService` – The Axelar Gas Service +- `IERC20` – The ERC-20 token interface to access ERC-20-related functionality **Not recommended** Implement the following to send an interchain transaction with Axelar: -* `AxelarExecutable` – This is a contract that handle a message on the destination chain once a transaction has been sent to the Axelar network. -* `IAxelarGateway` – The Axelar Gateway -* `IAxelarGasService` – The Axelar Gas Service -* `IERC20` – This represents the ERC-20 token interface to access ERC-20-related functionality. -``` +- `AxelarExecutable` – This is a contract that handle a message on the destination chain once a transaction has been sent to the Axelar network. +- `IAxelarGateway` – The Axelar Gateway +- `IAxelarGasService` – The Axelar Gas Service +- `IERC20` – This represents the ERC-20 token interface to access ERC-20-related functionality. + +## Wording + +- **General Message Passing**: Capitalize, since it is as a product name – “Axelar General Message Passing,” "GMP," or “Axelar GMP” (never "Axelar’s GMP"). If you’re looking for a generic description, use “arbitrary message passing.” +- **Interchain**: Wherever possible, use “interchain,” instead of “cross-chain,” “blockchain interoperability,” “chain-agnostic” or other synonyms. "Interchain" is only capitalized at the beginning of a sentence. +- **Interchain Tokens**: title case. Likewise Interchain Token Service, Interchain Token Portal, Canonical Interchain Token. +- **Network**: “Axelar network,” not “Axelar Network.” +- **Proof-of-stake**: Only capitalize the first word in titles and at the beginning of sentences. Always hyphenate. +- **Web**, **Web2**, **Web3**: Capitalized everywhere, as in “the decentralized Web,” “the Web,” and any other context referring to the World Wide Web. “Web2” and “Web3” are also capitalized and written as one word. +- **Mint/Burn**, not **mint/burn**. +- **Lock/Unlock**, not **lock/unlock**. +- **Token manager** is not a proper noun, unless specifying the `TokenManager` object (in which case it should be code font). +- Refer to Axelar's Gas Service as **Axelar Gas Service**, **the Gas Service**, or **the `AxelarGasService` contract**, not as "Gas Services" or "the `GasService` contract." +- Time format is always in [UTC](https://en.wikipedia.org/wiki/Coordinated_Universal_Time). +- **dApp**: Lowercase d, uppercase A. +- **Mainnet, testnet, devnet**: All one word. Capitalized at the beginning of a sentence, else lowercase. diff --git a/astro.config.mjs b/astro.config.mjs index bcc0de64f..5aeaf9f90 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,46 +1,108 @@ -import { defineConfig } from "astro/config"; -import react from "@astrojs/react"; import mdx from "@astrojs/mdx"; -import remarkToc from "remark-toc"; -import { rehypeHeadingIds } from "@astrojs/markdown-remark"; -import rehypeSlug from "rehype-slug"; -import rehypeAutolinkHeadings from "rehype-autolink-headings"; -import { h, s } from "hastscript"; +import partytown from "@astrojs/partytown"; +import react from "@astrojs/react"; import sitemap from "@astrojs/sitemap"; -const DEFAULT_LAYOUT = "/src/layouts/Section.astro"; -function setDefaultLayout() { - return function (_, file) { - const { - frontmatter - } = file.data.astro; - if (!frontmatter.layout) frontmatter.layout = DEFAULT_LAYOUT; - }; -} - +import tailwind from "@astrojs/tailwind"; +import expressiveCode from "astro-expressive-code"; +import { defineConfig } from "astro/config"; +import { h } from "hastscript"; +import rehypeAutolinkHeadings from "rehype-autolink-headings"; +import rehypeSlug from "rehype-slug"; +import remarkDirective from "remark-directive"; +import remarkToc from "remark-toc"; +import { visit } from "unist-util-visit"; +// https://astro.build/config export default defineConfig({ - integrations: [react(), mdx(), sitemap()], - site: 'https://docs.axelar.dev/', + integrations: [ + expressiveCode({ + themes: ["vitesse-dark", "light-plus"], + useDarkModeMediaQuery: true, + themeCssSelector: (theme) => `[data-theme='${theme.name}']`, + }), + react(), + mdx(), + sitemap({ + priority: 0.9, + changefreq: "daily", + lastmod: new Date(), + filter: (page) => { + const excludeUrls = [ + "/controller/deploy-token/", + "/controller/add-evm-chain/", + "/dev/indexers/subquery/", + "/dev/indexers/overview/", + "/node/join-old/", + ]; + + return !excludeUrls.some((url) => page.endsWith(url)); + }, + }), + tailwind(), + partytown({ + config: { + forward: ["dataLayer.push"], + }, + }), + ], + site: "https://docs.axelar.dev/", + trailingSlash: "always", + devToolbar: { + enabled: false, + }, markdown: { - remarkPlugins: [setDefaultLayout, [remarkToc, { - heading: "contents" - }]], - rehypePlugins: [rehypeSlug, [rehypeAutolinkHeadings, { - behavior: "append", - content: [h("span", { - ariaHidden: "true", - class: "anchor-icon" - }, h("svg", { - width: 16, - height: 16, - version: 1.1, - viewBox: "0 0 16 16", - xlmns: "http://www.w3.org/2000/svg" - }, h("path", { - fillRule: "evenodd", - fill: "black", - d: "M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" - })))] - }]], - syntaxHighlight: false - } -}); \ No newline at end of file + remarkPlugins: [ + remarkDirective, + [ + remarkToc, + { + heading: "contents", + }, + ], + ], + rehypePlugins: [ + rehypeSlug, + [ + rehypeAutolinkHeadings, + { + behavior: "append", + + content: [ + h( + "span", + { + ariaHidden: "true", + class: "link", + }, + h( + "svg", + { + width: 16, + height: 16, + version: 1.1, + viewBox: "0 0 16 16", + xlmns: "http://www.w3.org/2000/svg", + }, + h("path", { + fillRule: "evenodd", + fill: "currentcolor", + d: "M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z", + }), + ), + ), + ], + }, + ], + () => (tree) => { + visit(tree, "element", (node) => { + if (["h1", "h2", "h3", "h4", "h5", "h6"].includes(node.tagName)) { + node.properties = node.properties || {}; + node.properties.className = [ + ...(node.properties.className || []), + "header-links", + ]; + } + }); + }, + ], + }, +}); diff --git a/generate-search-index.js b/generate-search-index.js index e6df1fd7f..5cf6bb442 100644 --- a/generate-search-index.js +++ b/generate-search-index.js @@ -10,6 +10,7 @@ import strip from "strip-markdown"; import { exit } from "process"; const client = algoliasearch("ECUG3H1E0M", process.env.ALGOLIA_KEY); +const CONTENT_PATH = "src/content/docs"; if (!process.env.ALGOLIA_KEY) { console.error("ALGOLIA_KEY not set"); @@ -36,10 +37,10 @@ function walk(dir) { ) { // remove file extension, order matters here const url = filepath - .replace("src/pages", "") - .replace(".astro", "") - .replace(".mdx", "") - .replace(".md", ""); + .replace(CONTENT_PATH, "") + .replace(".astro", "/") + .replace(".mdx", "/") + .replace(".md", "/"); const mtime = stats.mtime.toISOString(); const sha = crypto.createHash("sha256"); sha.update(url); @@ -72,6 +73,11 @@ function walk(dir) { if (filepath.indexOf(".astro" > -1)) { content = stripTags(content); } + // Remove callout + content = content.replace( + /import\s*{\s*Callout\s*}\s*from\s*['"][^"']*['"]\s*;?/g, + "", + ); // Fix newlines content = content.replace(/\n/g, " "); @@ -112,9 +118,9 @@ function walk(dir) { } } -walk("src/pages"); +walk(CONTENT_PATH); -//console.dir(sitemap, { maxArrayLength: null }); +// console.dir(sitemap, { maxArrayLength: null }); try { index diff --git a/package-lock.json b/package-lock.json index 3a7d81951..59b52a8de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,23 +9,30 @@ "version": "0.0.1", "license": "MIT", "dependencies": { - "@astrojs/markdown-remark": "^3.2.0", - "@astrojs/mdx": "^1.1.0", - "@astrojs/react": "^3.0.2", - "@astrojs/sitemap": "^3.0.0", + "@astrojs/markdown-remark": "^5.2.0", + "@astrojs/mdx": "^3.1.3", + "@astrojs/partytown": "^2.1.2", + "@astrojs/react": "^3.6.2", + "@astrojs/sitemap": "^3.1.6", + "@astrojs/tailwind": "^5.1.0", + "@docsearch/react": "^3.6.1", "@headlessui/react": "^1.7.2", "@redux-devtools/extension": "^3.2.3", "@typeform/embed-react": "^1.21.0", "@types/react": "^18.2.14", "@types/react-dom": "^18.2.6", "algoliasearch": "^4.20.0", - "astro": "^3.1.4", + "astro": "^4.13.3", + "astro-expressive-code": "^0.36.1", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", "crypto": "^1.0.1", "gray-matter": "^4.0.3", "instantsearch.js": "^4.56.9", "lodash": "^4.17.21", + "lucide-react": "^0.441.0", "markdown-to-jsx": "^7.1.7", - "next": "^13.5.6", + "next": "^14.1.1", "next-secure-headers": "^2.2.0", "postcss-flexbugs-fixes": "^5.0.2", "postcss-import": "^15.0.0", @@ -38,21 +45,74 @@ "react-syntax-highlighter": "^15.5.0", "redux": "^4.2.1", "rehype-autolink-headings": "^6.1.1", + "rehype-raw": "^7.0.0", "rehype-slug": "^5.1.0", "remark": "^14.0.3", + "remark-directive": "^3.0.0", "remark-toc": "^8.0.1", "remove-markdown": "^0.5.0", "sass": "^1.63.6", + "sharp": "^0.33.5", "strip-markdown": "^5.0.1", + "tailwindcss": "^3.4.11", + "unist-util-visit": "^5.0.0", "web3": "^1.8.0" }, "devDependencies": { - "dart-linkcheck": "^2.0.15" + "@tailwindcss/typography": "^0.5.15", + "dart-linkcheck": "^2.0.15", + "prettier": "^3.3.3", + "prettier-plugin-astro": "^0.14.1" }, "engines": { "node": ">=18.14.1" } }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, "node_modules/@algolia/cache-browser-local-storage": { "version": "4.20.0", "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz", @@ -187,50 +247,63 @@ "resolved": "https://registry.npmjs.org/@algolia/ui-components-shared/-/ui-components-shared-1.2.1.tgz", "integrity": "sha512-a7mYHf/GVQfhAx/HRiMveKkFvHspQv/REdG+C/FIOosiSmNZxX7QebDwJkrGSmDWdXO12D0Qv1xn3AytFcEDlQ==" }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@astrojs/compiler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.1.0.tgz", - "integrity": "sha512-Mp+qrNhly+27bL/Zq8lGeUY+YrdoU0eDfIlAeGIPrzt0PnI/jGpvPUdCaugv4zbCrDkOUScFfcbeEiYumrdJnw==" + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.10.2.tgz", + "integrity": "sha512-bvH+v8AirwpRWCkYJEyWYdc5Cs/BjG2ZTxIJzttHilXgfKJAdW2496KsUQKzf5j2tOHtaHXKKn9hb9WZiBGpEg==" }, "node_modules/@astrojs/internal-helpers": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.2.0.tgz", - "integrity": "sha512-NQ4ppp1CM0HNkKbJNM4saVSfmUYzGlRalF6wx7F6T/MYHYSWGuojY89/oFTy4t8VlOGUCUijlsVNNeziWaUo5g==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.1.tgz", + "integrity": "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==" }, "node_modules/@astrojs/markdown-remark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-3.2.0.tgz", - "integrity": "sha512-jigyLfefUZPKgVmmraCkVpdUuFH1R3SrpgQO13axsgwLDBgkggaQpNR5Ag4O9PDualeBtbdt30aYSfvnBKx9Hg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-5.2.0.tgz", + "integrity": "sha512-vWGM24KZXz11jR3JO+oqYU3T2qpuOi4uGivJ9SQLCAI01+vEkHC60YJMRvHPc+hwd60F7euNs1PeOEixIIiNQw==", "dependencies": { - "@astrojs/prism": "^3.0.0", + "@astrojs/prism": "3.1.0", "github-slugger": "^2.0.0", - "import-meta-resolve": "^3.0.0", + "hast-util-from-html": "^2.0.1", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.1.0", "mdast-util-definitions": "^6.0.0", - "rehype-raw": "^6.1.1", - "rehype-stringify": "^9.0.4", - "remark-gfm": "^3.0.1", - "remark-parse": "^10.0.2", - "remark-rehype": "^10.1.0", - "remark-smartypants": "^2.0.0", - "shiki": "^0.14.3", - "unified": "^10.1.2", - "unist-util-visit": "^4.1.2", - "vfile": "^5.3.7" - }, - "peerDependencies": { - "astro": "^3.1.0" + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.0", + "remark-gfm": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.0", + "remark-smartypants": "^3.0.2", + "shiki": "^1.10.3", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1", + "vfile": "^6.0.2" } }, "node_modules/@astrojs/markdown-remark/node_modules/@types/mdast": { @@ -260,409 +333,913 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/@astrojs/markdown-remark/node_modules/mdast-util-definitions/node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "node_modules/@astrojs/markdown-remark/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", "dependencies": { + "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.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" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/@astrojs/markdown-remark/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "node_modules/@astrojs/markdown-remark/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dependencies": { - "@types/unist": "^3.0.0" + "@types/mdast": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/@astrojs/markdown-remark/node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "node_modules/@astrojs/markdown-remark/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@astrojs/mdx": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-1.1.0.tgz", - "integrity": "sha512-rmLZBw3CUCkp+5blBJloV2EqJGRaJTraJygWMfCvrLcCA3vzhwzACnVQKdUDlts8EEr6V6+HXYVqi46AVEfobg==", - "dependencies": { - "@astrojs/markdown-remark": "3.2.0", - "@mdx-js/mdx": "^2.3.0", - "acorn": "^8.10.0", - "es-module-lexer": "^1.3.0", - "estree-util-visit": "^1.2.1", - "github-slugger": "^2.0.0", - "gray-matter": "^4.0.3", - "hast-util-to-html": "^8.0.4", - "kleur": "^4.1.4", - "rehype-raw": "^6.1.1", - "remark-gfm": "^3.0.1", - "remark-smartypants": "^2.0.0", - "source-map": "^0.7.4", - "unist-util-visit": "^4.1.2", - "vfile": "^5.3.7" - }, - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "astro": "^3.1.0" + "@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" + } + }, + "node_modules/@astrojs/markdown-remark/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/@astrojs/markdown-remark/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@astrojs/prism": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.0.0.tgz", - "integrity": "sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==", + "node_modules/@astrojs/markdown-remark/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "prismjs": "^1.29.0" - }, - "engines": { - "node": ">=18.14.1" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@astrojs/react": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-3.0.2.tgz", - "integrity": "sha512-aooNIuQxTg+IWGMZPuIEwBeBi4/TCPCMsr3714zuLjAjukVd5ZrX/bCNxJqDWU4HNwUm4XFU1OhcEvYOHa5uMQ==", + "node_modules/@astrojs/markdown-remark/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@vitejs/plugin-react": "^4.0.4", - "ultrahtml": "^1.3.0" - }, - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "@types/react": "^17.0.50 || ^18.0.21", - "@types/react-dom": "^17.0.17 || ^18.0.6", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@astrojs/sitemap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.0.0.tgz", - "integrity": "sha512-qm7npHuUW4q3OOmulqhJ1g69jEQu0Sdc6P8NbOzqIoosj/L+3v4i8dtKBnp6n1UQ4Sx8H8Vdi3Z/On7i9/ZJhw==", + "node_modules/@astrojs/markdown-remark/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "sitemap": "^7.1.1", - "zod": "3.21.1" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@astrojs/telemetry": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.0.2.tgz", - "integrity": "sha512-ef+jqCkqopCzjGfsMsr+8p56Nj6F9ZzouWcWZt+dKsqbRccI3c8K3jfkLcdq4AyfFZtKBDB6N4ZuI68g33oiOg==", + "node_modules/@astrojs/markdown-remark/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "ci-info": "^3.8.0", - "debug": "^4.3.4", - "dlv": "^1.1.3", - "dset": "^3.1.2", - "is-docker": "^3.0.0", - "is-wsl": "^3.0.0", - "undici": "^5.23.0", - "which-pm-runs": "^1.1.0" - }, - "engines": { - "node": ">=18.14.1" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", - "engines": { - "node": ">=6.9.0" + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/@babel/core": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", - "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.17", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.17", - "@babel/types": "^7.22.17", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "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" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/@astrojs/markdown-remark/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/@astrojs/markdown-remark/node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", "dependencies": { - "@babel/types": "^7.22.5" + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "node_modules/@astrojs/markdown-remark/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dependencies": { - "@babel/types": "^7.22.15" + "@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" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "node_modules/@astrojs/markdown-remark/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" + "@types/unist": "^3.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "node_modules/@astrojs/markdown-remark/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", "dependencies": { - "@babel/types": "^7.22.5" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@astrojs/markdown-remark/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "@babel/types": "^7.22.5" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "node_modules/@astrojs/mdx": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-3.1.3.tgz", + "integrity": "sha512-hOM4dMM4RfJI254d3p/AnOZuk2VyKszRtuY5FBm+Xc4XdhIpGrR56OXMNEcWchtwz4HQyPe/eJSgvBjSROcQIQ==", + "dependencies": { + "@astrojs/markdown-remark": "5.2.0", + "@mdx-js/mdx": "^3.0.1", + "acorn": "^8.12.1", + "es-module-lexer": "^1.5.4", + "estree-util-visit": "^2.0.0", + "github-slugger": "^2.0.0", + "gray-matter": "^4.0.3", + "hast-util-to-html": "^9.0.1", + "kleur": "^4.1.5", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.0", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.4", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, "engines": { - "node": ">=6.9.0" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + }, + "peerDependencies": { + "astro": "^4.8.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } + "node_modules/@astrojs/mdx/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "engines": { - "node": ">=6.9.0" + "node_modules/@astrojs/mdx/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "node_modules/@astrojs/mdx/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "node_modules/@astrojs/mdx/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "bin": { - "parser": "bin/babel-parser.js" + "node_modules/@astrojs/partytown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@astrojs/partytown/-/partytown-2.1.2.tgz", + "integrity": "sha512-1a9T5lqxtnrw0qLPo1KwliUvaaUzPNPtWucD8VxdwT7zqcpODFk1RzGgAgqVo+YhutFrTu/qclbtnOfXBuskjw==", + "license": "MIT", + "dependencies": { + "@builder.io/partytown": "^0.10.2", + "mrmime": "^2.0.0" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.1.0.tgz", + "integrity": "sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==", + "dependencies": { + "prismjs": "^1.29.0" }, "engines": { - "node": ">=6.0.0" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "node_modules/@astrojs/react": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-3.6.2.tgz", + "integrity": "sha512-fK29lYI7zK/KG4ZBy956x4dmauZcZ18osFkuyGa8r3gmmCQa2NZ9XNu9WaVYEUm0j89f4Gii4tbxLoyM8nk2MA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@vitejs/plugin-react": "^4.3.1", + "ultrahtml": "^1.5.3" }, "engines": { - "node": ">=6.9.0" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "@types/react": "^17.0.50 || ^18.0.21", + "@types/react-dom": "^17.0.17 || ^18.0.6", + "react": "^17.0.2 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0-beta" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.1.6.tgz", + "integrity": "sha512-1Qp2NvAzVImqA6y+LubKi1DVhve/hXXgFvB0szxiipzh7BvtuKe4oJJ9dXSqaubaTkt4nMa6dv6RCCAYeB6xaQ==", + "dependencies": { + "sitemap": "^7.1.2", + "stream-replace-string": "^2.0.0", + "zod": "^3.23.8" + } + }, + "node_modules/@astrojs/tailwind": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/tailwind/-/tailwind-5.1.0.tgz", + "integrity": "sha512-BJoCDKuWhU9FT2qYg+fr6Nfb3qP4ShtyjXGHKA/4mHN94z7BGcmauQK23iy+YH5qWvTnhqkd6mQPQ1yTZTe9Ig==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.15", + "postcss": "^8.4.28", + "postcss-load-config": "^4.0.2" + }, + "peerDependencies": { + "astro": "^3.0.0 || ^4.0.0", + "tailwindcss": "^3.0.24" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.1.0.tgz", + "integrity": "sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==", + "dependencies": { + "ci-info": "^4.0.0", + "debug": "^4.3.4", + "dlv": "^1.1.3", + "dset": "^3.1.3", + "is-docker": "^3.0.0", + "is-wsl": "^3.0.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "dependencies": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", - "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -672,11 +1249,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", - "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -686,11 +1263,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", - "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -711,32 +1288,29 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -744,18 +1318,30 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@builder.io/partytown": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@builder.io/partytown/-/partytown-0.10.2.tgz", + "integrity": "sha512-A9U+4PREWcS+CCYzKGIPovtGB/PBgnH/8oQyCE6Nr9drDJk6cMPpLQIEajpGPmG9tYF7N3FkRvhXm/AS9+0iKg==", + "license": "MIT", + "bin": { + "partytown": "bin/partytown.cjs" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@csstools/postcss-cascade-layers": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", @@ -1021,10 +1607,82 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@ctrl/tinycolor": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.1.0.tgz", + "integrity": "sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.1.tgz", + "integrity": "sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.1.tgz", + "integrity": "sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.1", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", - "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -1037,9 +1695,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", - "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -1052,9 +1710,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", - "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -1067,9 +1725,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", - "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -1082,9 +1740,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", - "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -1097,9 +1755,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", - "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -1112,9 +1770,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", - "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -1127,9 +1785,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", - "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -1142,9 +1800,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", - "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -1157,9 +1815,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", - "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -1172,9 +1830,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", - "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -1187,9 +1845,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", - "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -1202,9 +1860,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", - "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -1217,9 +1875,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", - "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -1232,9 +1890,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", - "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -1247,9 +1905,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", - "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -1262,9 +1920,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", - "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -1277,9 +1935,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", - "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -1292,9 +1950,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", - "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -1307,9 +1965,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", - "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -1322,9 +1980,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", - "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -1337,9 +1995,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", - "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -1753,1115 +2411,2576 @@ "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", - "engines": { - "node": ">=14" + "node_modules/@expressive-code/core": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.36.1.tgz", + "integrity": "sha512-9Y+vLlDEQeRQiPKTtab0NRmnUwS8GkJxobwvsXKoqWrRTWyVjV0VLI7BwXFUVVbbuuvMnwXpzfxY2mC64n3Jow==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" } }, - "node_modules/@headlessui/react": { - "version": "1.7.15", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz", - "integrity": "sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw==", + "node_modules/@expressive-code/core/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", "dependencies": { - "client-only": "^0.0.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" + "@types/unist": "*" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@expressive-code/core/node_modules/hastscript": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", + "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@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" }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } + "node_modules/@expressive-code/core/node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "node_modules/@expressive-code/plugin-frames": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.36.1.tgz", + "integrity": "sha512-HAWH5gcX7avdtKhwSp/RLtqqEq04/JFOIQ6enAClHY8Kbr3c5T+C0Ki6G/3IVKnIjy2y0U7E6b9dOqzKSsanxw==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.36.1" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.36.1.tgz", + "integrity": "sha512-nmzJ2TUHBDtYgOzDONTKt27n2B9S++hmvPxlPM1HZtjwO+2fhGGGW7M3VfO//6FIlcD4X36jy38DfPB4T9/m3Q==", + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@expressive-code/core": "^0.36.1", + "shiki": "^1.14.1" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.36.1.tgz", + "integrity": "sha512-CNxkTuXmQtRWMQZcRRsLEfZIYStMdRMPzbisNU2a/RTgovqDsOQiyh1abnewxz0y7VuXW330D+etcEHjFWXU/A==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.36.1" + } }, - "node_modules/@mdx-js/mdx": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz", - "integrity": "sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==", + "node_modules/@headlessui/react": { + "version": "1.7.15", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz", + "integrity": "sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw==", "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/mdx": "^2.0.0", - "estree-util-build-jsx": "^2.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "estree-util-to-js": "^1.1.0", - "estree-walker": "^3.0.0", - "hast-util-to-estree": "^2.0.0", - "markdown-extensions": "^1.0.0", - "periscopic": "^3.0.0", - "remark-mdx": "^2.0.0", - "remark-parse": "^10.0.0", - "remark-rehype": "^10.0.0", - "unified": "^10.0.0", - "unist-util-position-from-estree": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0" + "client-only": "^0.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" } }, - "node_modules/@next/env": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.6.tgz", - "integrity": "sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==" - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.6.tgz", - "integrity": "sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==", + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" } }, - "node_modules/@next/swc-darwin-x64": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.6.tgz", - "integrity": "sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==", + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" } }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.6.tgz", - "integrity": "sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==", + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.6.tgz", - "integrity": "sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==", + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.6.tgz", - "integrity": "sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==", + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.6.tgz", - "integrity": "sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==", + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" } }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.6.tgz", - "integrity": "sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==", + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" } }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.6.tgz", - "integrity": "sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==", + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", "cpu": [ - "ia32" + "s390x" ], + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" } }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.6.tgz", - "integrity": "sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==", + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" } }, - "node_modules/@redux-devtools/extension": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@redux-devtools/extension/-/extension-3.2.5.tgz", - "integrity": "sha512-UhyDF7WmdnCrN1s++YC4sdQCo0z6YUnoB2eCh15nXDDq3QH1jDju1144UNRU6Nvi4inxhaIum4m9BXVYWVC1ng==", + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, "dependencies": { - "@babel/runtime": "^7.20.7", - "immutable": "^4.2.2" + "@emnapi/runtime": "^1.2.0" }, - "peerDependencies": { - "redux": "^3.1.0 || ^4.0.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { - "node": ">=10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "url": "https://opencollective.com/libvips" } }, - "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=14.16" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@typeform/embed": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/@typeform/embed/-/embed-1.38.0.tgz", - "integrity": "sha512-qYxtwckEcRt++F1sUeILb/qmUFQ3PwcUxKedCBSseC8lFo1ukD1wmsBf+Il8YSRPKPqhTrGUG5WPaJg83n1xuw==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "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" + }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/@typeform/embed-react": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@typeform/embed-react/-/embed-react-1.21.0.tgz", - "integrity": "sha512-nZi7OD5mxZUKQjkzxAll05JU6QNWuHuCE+L/S1Vagy7fgb/rdx4iEIfvqFogTcrVw61bCS6TaAJ+ateD7vR7sw==", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { - "@typeform/embed": "1.38.0", - "fast-deep-equal": "^3.1.3" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, - "peerDependencies": { - "react": ">=16.8.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/acorn": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@types/estree": "*" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dependencies": { - "@babel/types": "^7.0.0" + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", - "dependencies": { - "@babel/types": "^7.20.7" - } + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, - "node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { - "@types/node": "*" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "node_modules/@mdx-js/mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", + "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" + "@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-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "node_modules/@mdx-js/mdx/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { - "@types/ms": "*" + "@types/unist": "*" } }, - "node_modules/@types/dom-speech-recognition": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.1.tgz", - "integrity": "sha512-udCxb8DvjcDKfk1WTBzDsxFbLgYxmQGKrE/ricoMqHRNjSlSUCcamVTA5lIQqzY10mY5qCY0QDwBfFEwhfoDPw==" - }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", - "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", + "node_modules/@mdx-js/mdx/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dependencies": { - "@types/estree": "*" + "@types/unist": "*" } }, - "node_modules/@types/extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/extend/-/extend-3.0.1.tgz", - "integrity": "sha512-R1g/VyKFFI2HLC1QGAeTtCBWCo6n75l41OnsVYNbmKG+kempOESaodf6BeJyUM3Q0rKa/NQcTHbB2+66lNnxLw==" - }, - "node_modules/@types/google.maps": { - "version": "3.53.4", - "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.53.4.tgz", - "integrity": "sha512-IiDAYTONQEKCBssPtoM0XqWF8YIIk2leba4NOf9qVQ/d8l5gLuS3QT87TrX6/u8rMonQAXC9KEDmM4q7sT6MWg==" + "node_modules/@mdx-js/mdx/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "node_modules/@mdx-js/mdx/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", "dependencies": { - "@types/unist": "*" + "@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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@types/hogan.js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/hogan.js/-/hogan.js-3.0.1.tgz", - "integrity": "sha512-D03i/2OY7kGyMq9wdQ7oD8roE49z/ZCZThe/nbahtvuqCNZY9T2MfedOWyeBdbEpY2W8Gnh/dyJLdFtUCOkYbg==" - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "node_modules/@mdx-js/mdx/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@types/hoist-non-react-statics/node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "node_modules/@mdx-js/mdx/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "react-is": "^16.7.0" + "@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" + } + }, + "node_modules/@mdx-js/mdx/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/@mdx-js/mdx/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "node_modules/@types/json5": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz", - "integrity": "sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "node_modules/@mdx-js/mdx/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/node": "*" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@types/mdast": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", - "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "node_modules/@mdx-js/mdx/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/unist": "*" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@types/mdx": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.5.tgz", - "integrity": "sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg==" - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - }, - "node_modules/@types/nlcst": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-1.0.0.tgz", - "integrity": "sha512-3TGCfOcy8R8mMQ4CNSNOe3PG66HttvjcLzCoOpvXvDtfWOTi+uT/rxeOKm/qEwbM4SNe1O/PjdiBK2YcTjU4OQ==", + "node_modules/@mdx-js/mdx/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/unist": "*" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@types/node": { - "version": "20.3.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.2.tgz", - "integrity": "sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw==" - }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "node_modules/@mdx-js/mdx/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/node": "*" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/react": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", - "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", + "node_modules/@mdx-js/mdx/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@types/react-dom": { - "version": "18.2.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.6.tgz", - "integrity": "sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==", + "node_modules/@mdx-js/mdx/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/react": "*" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "node_modules/@mdx-js/mdx/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/node": "*" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@types/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", + "node_modules/@mdx-js/mdx/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/node": "*" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, - "node_modules/@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "node_modules/@mdx-js/mdx/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/node": "*" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", - "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", + "node_modules/@mdx-js/mdx/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/core": "^7.22.9", - "@babel/plugin-transform-react-jsx-self": "^7.22.5", - "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0" + "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" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "node_modules/@mdx-js/mdx/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" + "node_modules/@mdx-js/mdx/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@mdx-js/mdx/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node_modules/@mdx-js/mdx/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@mdx-js/mdx/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/algoliasearch": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz", - "integrity": "sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==", + "node_modules/@mdx-js/mdx/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@algolia/cache-browser-local-storage": "4.20.0", - "@algolia/cache-common": "4.20.0", - "@algolia/cache-in-memory": "4.20.0", - "@algolia/client-account": "4.20.0", - "@algolia/client-analytics": "4.20.0", - "@algolia/client-common": "4.20.0", - "@algolia/client-personalization": "4.20.0", - "@algolia/client-search": "4.20.0", - "@algolia/logger-common": "4.20.0", - "@algolia/logger-console": "4.20.0", - "@algolia/requester-browser-xhr": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/requester-node-http": "4.20.0", - "@algolia/transporter": "4.20.0" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/algoliasearch-helper": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.14.0.tgz", - "integrity": "sha512-gXDXzsSS0YANn5dHr71CUXOo84cN4azhHKUbg71vAWnH+1JBiR4jf7to3t3JHXknXkbV0F7f055vUSBKrltHLQ==", + "node_modules/@mdx-js/mdx/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/@mdx-js/mdx/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/@mdx-js/mdx/node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", "dependencies": { - "@algolia/events": "^4.0.1" + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "node_modules/@mdx-js/mdx/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" + "@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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@mdx-js/mdx/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/@mdx-js/mdx/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", "dependencies": { - "ansi-regex": "^5.0.1" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" + "node_modules/@mdx-js/mdx/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==" + "node_modules/@next/env": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.1.tgz", + "integrity": "sha512-7CnQyD5G8shHxQIIg3c7/pSeYFeMhsNbpU/bmvH7ZnDql7mNRgg8O2JZrhrc/soFnfBnKP4/xXNiiSIPn2w8gA==" }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.1.tgz", + "integrity": "sha512-yDjSFKQKTIjyT7cFv+DqQfW5jsD+tVxXTckSe1KIouKk75t1qZmj/mV3wzdmFb0XHVGtyRjDMulfVG8uCKemOQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4" + "node": ">= 10" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.1.tgz", + "integrity": "sha512-KCQmBL0CmFmN8D64FHIZVD9I4ugQsDBBEJKiblXGgwn7wBCSe8N4Dx47sdzl4JAg39IkSN5NNrr8AniXLMb3aw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 8" + "node": ">= 10" } }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/array-iterate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", - "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.1.tgz", + "integrity": "sha512-YDQfbWyW0JMKhJf/T4eyFr4b3tceTorQ5w2n7I0mNVTFOvu6CGEzfwT3RSAQGTi/FFMTFcuspPec/7dFHuP7Eg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.1.tgz", + "integrity": "sha512-fiuN/OG6sNGRN/bRFxRvV5LyzLB8gaL8cbDH5o3mEiVwfcMzyE5T//ilMmaTrnA8HLMS6hoz4cHOu6Qcp9vxgQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.1.tgz", + "integrity": "sha512-rv6AAdEXoezjbdfp3ouMuVqeLjE1Bin0AuE6qxE6V9g3Giz5/R3xpocHoAi7CufRR+lnkuUjRBn05SYJ83oKNQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.8" + "node": ">= 10" } }, - "node_modules/astring": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", - "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", - "bin": { - "astring": "bin/astring" - } - }, - "node_modules/astro": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/astro/-/astro-3.1.4.tgz", - "integrity": "sha512-MKGJXHkkYK4QpqYHydPu+eeLBGU3cHx9Xdrtk6RFvu3dVkxuJsYm6L+lgIeH0hrTF9qlaDih/KbNnTKrCXdidw==", - "dependencies": { - "@astrojs/compiler": "^2.1.0", - "@astrojs/internal-helpers": "0.2.0", - "@astrojs/markdown-remark": "3.2.0", - "@astrojs/telemetry": "3.0.2", - "@babel/core": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/parser": "^7.22.10", - "@babel/plugin-transform-react-jsx": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10", - "@types/babel__core": "^7.20.1", - "acorn": "^8.10.0", - "boxen": "^7.1.1", - "chokidar": "^3.5.3", - "ci-info": "^3.8.0", - "clsx": "^2.0.0", - "common-ancestor-path": "^1.0.1", - "cookie": "^0.5.0", - "debug": "^4.3.4", - "devalue": "^4.3.2", - "diff": "^5.1.0", - "es-module-lexer": "^1.3.0", - "esbuild": "^0.19.2", - "estree-walker": "^3.0.3", - "execa": "^8.0.1", - "fast-glob": "^3.3.1", - "github-slugger": "^2.0.0", - "gray-matter": "^4.0.3", - "html-escaper": "^3.0.3", - "http-cache-semantics": "^4.1.1", - "js-yaml": "^4.1.0", - "kleur": "^4.1.4", - "magic-string": "^0.30.3", - "mime": "^3.0.0", - "ora": "^7.0.1", - "p-limit": "^4.0.0", - "path-to-regexp": "^6.2.1", - "preferred-pm": "^3.1.2", - "probe-image-size": "^7.2.3", - "prompts": "^2.4.2", - "rehype": "^12.0.1", - "resolve": "^1.22.4", - "semver": "^7.5.4", - "server-destroy": "^1.0.1", - "shiki": "^0.14.3", - "string-width": "^6.1.0", - "strip-ansi": "^7.1.0", - "tsconfig-resolver": "^3.0.1", - "undici": "^5.23.0", - "unist-util-visit": "^4.1.2", - "vfile": "^5.3.7", - "vite": "^4.4.9", - "vitefu": "^0.2.4", - "which-pm": "^2.1.1", - "yargs-parser": "^21.1.1", - "zod": "3.21.1" - }, - "bin": { - "astro": "astro.js" - }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.1.tgz", + "integrity": "sha512-YAZLGsaNeChSrpz/G7MxO3TIBLaMN8QWMr3X8bt6rCvKovwU7GqQlDu99WdvF33kI8ZahvcdbFsy4jAFzFX7og==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.14.1", - "npm": ">=6.14.0" - }, - "optionalDependencies": { - "sharp": "^0.32.5" + "node": ">= 10" } }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.1.tgz", + "integrity": "sha512-1L4mUYPBMvVDMZg1inUYyPvFSduot0g73hgfD9CODgbr4xiTYe0VOMTZzaRqYJYBA9mana0x4eaAaypmWo1r5A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" ], - "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 10" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.1.tgz", + "integrity": "sha512-jvIE9tsuj9vpbbXlR5YxrghRfMuG0Qm/nZ/1KDHc+y6FpnZ/apsgh+G6t15vefU0zp3WSpTMIdXRUsNl/7RSuw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.1.tgz", + "integrity": "sha512-S6K6EHDU5+1KrBDLko7/c1MNy/Ya73pIAmvKeFwsF4RmBFJSO7/7YeD4FnZ4iBdzE69PpQ4sOMU9ORKeNuxe8A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "optional": true - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dependencies": { - "safe-buffer": "^5.0.1" + "node": ">= 10" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, "engines": { - "node": "*" + "node": ">= 8" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=14" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@redux-devtools/extension": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@redux-devtools/extension/-/extension-3.2.5.tgz", + "integrity": "sha512-UhyDF7WmdnCrN1s++YC4sdQCo0z6YUnoB2eCh15nXDDq3QH1jDju1144UNRU6Nvi4inxhaIum4m9BXVYWVC1ng==", "dependencies": { - "ms": "2.0.0" + "@babel/runtime": "^7.20.7", + "immutable": "^4.2.2" + }, + "peerDependencies": { + "redux": "^3.1.0 || ^4.0.0" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] }, - "node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dependencies": { - "ansi-align": "^3.0.1", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.17.7.tgz", + "integrity": "sha512-ZnIDxFu/yvje3Q8owSHaEHd+bu/jdWhHAaJ17ggjXofHx5rc4bhpCSW+OjC6smUBi5s5dd023jWtZ1gzMu/yrw==", + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "1.17.7", + "@shikijs/engine-oniguruma": "1.17.7", + "@shikijs/types": "1.17.7", + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.2" + } + }, + "node_modules/@shikijs/core/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.17.7.tgz", + "integrity": "sha512-wwSf7lKPsm+hiYQdX+1WfOXujtnUG6fnN4rCmExxa4vo+OTmvZ9B1eKauilvol/LHUPrQgW12G3gzem7pY5ckw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.17.7", + "@shikijs/vscode-textmate": "^9.2.2", + "oniguruma-to-js": "0.4.3" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.17.7.tgz", + "integrity": "sha512-pvSYGnVeEIconU28NEzBXqSQC/GILbuNbAHwMoSfdTBrobKAsV1vq2K4cAgiaW1TJceLV9QMGGh18hi7cCzbVQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.17.7", + "@shikijs/vscode-textmate": "^9.2.2" + } + }, + "node_modules/@shikijs/types": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.17.7.tgz", + "integrity": "sha512-+qA4UyhWLH2q4EFd+0z4K7GpERDU+c+CN2XYD3sC+zjvAr5iuwD1nToXZMt1YODshjkEGEDV86G7j66bKjqDdg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/types/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.2.2.tgz", + "integrity": "sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.15.tgz", + "integrity": "sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20" + } + }, + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@typeform/embed": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/@typeform/embed/-/embed-1.38.0.tgz", + "integrity": "sha512-qYxtwckEcRt++F1sUeILb/qmUFQ3PwcUxKedCBSseC8lFo1ukD1wmsBf+Il8YSRPKPqhTrGUG5WPaJg83n1xuw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@typeform/embed-react": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@typeform/embed-react/-/embed-react-1.21.0.tgz", + "integrity": "sha512-nZi7OD5mxZUKQjkzxAll05JU6QNWuHuCE+L/S1Vagy7fgb/rdx4iEIfvqFogTcrVw61bCS6TaAJ+ateD7vR7sw==", + "dependencies": { + "@typeform/embed": "1.38.0", + "fast-deep-equal": "^3.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" + }, + "node_modules/@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/dom-speech-recognition": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.1.tgz", + "integrity": "sha512-udCxb8DvjcDKfk1WTBzDsxFbLgYxmQGKrE/ricoMqHRNjSlSUCcamVTA5lIQqzY10mY5qCY0QDwBfFEwhfoDPw==" + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/extend/-/extend-3.0.1.tgz", + "integrity": "sha512-R1g/VyKFFI2HLC1QGAeTtCBWCo6n75l41OnsVYNbmKG+kempOESaodf6BeJyUM3Q0rKa/NQcTHbB2+66lNnxLw==" + }, + "node_modules/@types/google.maps": { + "version": "3.53.4", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.53.4.tgz", + "integrity": "sha512-IiDAYTONQEKCBssPtoM0XqWF8YIIk2leba4NOf9qVQ/d8l5gLuS3QT87TrX6/u8rMonQAXC9KEDmM4q7sT6MWg==" + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/hogan.js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/hogan.js/-/hogan.js-3.0.1.tgz", + "integrity": "sha512-D03i/2OY7kGyMq9wdQ7oD8roE49z/ZCZThe/nbahtvuqCNZY9T2MfedOWyeBdbEpY2W8Gnh/dyJLdFtUCOkYbg==" + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/hoist-non-react-statics/node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "22.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", + "integrity": "sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/react": { + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", + "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.6.tgz", + "integrity": "sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "node_modules/@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", + "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" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/algoliasearch": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz", + "integrity": "sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.20.0", + "@algolia/cache-common": "4.20.0", + "@algolia/cache-in-memory": "4.20.0", + "@algolia/client-account": "4.20.0", + "@algolia/client-analytics": "4.20.0", + "@algolia/client-common": "4.20.0", + "@algolia/client-personalization": "4.20.0", + "@algolia/client-search": "4.20.0", + "@algolia/logger-common": "4.20.0", + "@algolia/logger-console": "4.20.0", + "@algolia/requester-browser-xhr": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/requester-node-http": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.14.0.tgz", + "integrity": "sha512-gXDXzsSS0YANn5dHr71CUXOo84cN4azhHKUbg71vAWnH+1JBiR4jf7to3t3JHXknXkbV0F7f055vUSBKrltHLQ==", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astring": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/astro": { + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/astro/-/astro-4.13.3.tgz", + "integrity": "sha512-MyhmM0v5sphiVwxAm5jjKxWeuPZijWPJ8Ajdign9QzEmLWSH8vUYIJWx/dWRQ6vF1I0jXrksoj3wtw5nzXt9nw==", + "dependencies": { + "@astrojs/compiler": "^2.10.1", + "@astrojs/internal-helpers": "0.4.1", + "@astrojs/markdown-remark": "5.2.0", + "@astrojs/telemetry": "3.1.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/traverse": "^7.25.3", + "@babel/types": "^7.25.2", + "@types/babel__core": "^7.20.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.12.1", + "aria-query": "^5.3.0", + "axobject-query": "^4.1.0", + "boxen": "7.1.1", + "ci-info": "^4.0.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^0.6.0", + "cssesc": "^3.0.0", + "debug": "^4.3.6", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.0.0", + "diff": "^5.2.0", + "dlv": "^1.1.3", + "dset": "^3.1.3", + "es-module-lexer": "^1.5.4", + "esbuild": "^0.21.5", + "estree-walker": "^3.0.3", + "execa": "^8.0.1", + "fast-glob": "^3.3.2", + "flattie": "^1.1.1", + "github-slugger": "^2.0.0", + "gray-matter": "^4.0.3", + "html-escaper": "^3.0.3", + "http-cache-semantics": "^4.1.1", + "js-yaml": "^4.1.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.11", + "mrmime": "^2.0.0", + "ora": "^8.0.1", + "p-limit": "^6.1.0", + "p-queue": "^8.0.1", + "path-to-regexp": "^6.2.2", + "preferred-pm": "^4.0.0", + "prompts": "^2.4.2", + "rehype": "^13.0.1", + "semver": "^7.6.3", + "shiki": "^1.12.1", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "tsconfck": "^3.1.1", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2", + "vite": "^5.3.5", + "vitefu": "^0.2.5", + "which-pm": "^3.0.0", + "yargs-parser": "^21.1.1", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.2" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "optionalDependencies": { + "sharp": "^0.33.3" + } + }, + "node_modules/astro-expressive-code": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.36.1.tgz", + "integrity": "sha512-D2nmBQ56wfnS/CBqCWoEGqIivNqaKJoACIK8eNa7TeDUwHzEWNSNoj5yK+wUJzpC7gI9XKPDh0Q/j8Dy7s84vA==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.36.1" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^3.3.0" + } + }, + "node_modules/astro/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/astro/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/astro/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/astro/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/astro/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "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" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==" + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dependencies": { + "ansi-align": "^3.0.1", "camelcase": "^7.0.1", "chalk": "^5.2.0", "cli-boxes": "^3.0.0", @@ -2870,6256 +4989,15483 @@ "widest-line": "^4.0.1", "wrap-ansi": "^8.1.0" }, - "engines": { - "node": ">=14.16" + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/bufferutil": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/ci-info": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "engines": { + "node": ">=4.0.0", + "npm": ">=3.0.0" + } + }, + "node_modules/cids/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/cids/node_modules/multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "buffer": "^5.6.0", + "varint": "^5.0.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk/" + } + }, + "node_modules/class-variance-authority/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "dependencies": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", + "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "dependencies": { + "node-fetch": "^2.6.11" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-selector-parser": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.0.5.tgz", + "integrity": "sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/cssdb": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.6.0.tgz", + "integrity": "sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ] + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dart-linkcheck": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/dart-linkcheck/-/dart-linkcheck-2.0.15.tgz", + "integrity": "sha512-ZMvxkAyEpBTvBFk+DPjcK0ObNy8GM4gmrGG1qIu0EXb/zj25vjRWNnhLHKZw4JlOLo02oWlwDeqo98GuBlJcIg==", + "dev": true, + "bin": { + "linkcheck": "bin/linkcheck", + "linkcheck-linux": "bin/linkcheck-linux", + "linkcheck-win": "bin/linkcheck-win" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.0.0.tgz", + "integrity": "sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/dset": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", + "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.6.tgz", + "integrity": "sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "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" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esniff/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "dependencies": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + } + }, + "node_modules/eth-ens-namehash/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/ethereum-bloom-filters": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "dependencies": { + "js-sha3": "^0.8.0" + } + }, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ethereumjs-util/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "dependencies": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/expressive-code": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.36.1.tgz", + "integrity": "sha512-/cEqiBUMJXe9PJ74MFupcChi1quO7+kqFcKiG/29yBZ6G09V4s6d3X53wIOBlNYmQI+5YLDPdyB/aDSTP+MxPA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.36.1", + "@expressive-code/plugin-frames": "^0.36.1", + "@expressive-code/plugin-shiki": "^0.36.1", + "@expressive-code/plugin-text-markers": "^0.36.1" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "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" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "dependencies": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "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" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", + "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-from-html/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/hast-util-from-html/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-from-parse5/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/hast-util-from-parse5/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz", + "integrity": "sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-heading-rank": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-2.1.1.tgz", + "integrity": "sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz", + "integrity": "sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.4.tgz", + "integrity": "sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-raw/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/hast-util-raw/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.2.tgz", + "integrity": "sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==", + "license": "MIT", + "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", + "not": "^0.1.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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-select/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/hast-util-select/node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select/node_modules/hast-util-to-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.0.tgz", + "integrity": "sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", + "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-to-html/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz", + "integrity": "sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-to-text/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/hast-util-to-text/node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", + "dependencies": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "bin": { + "hulk": "bin/hulk" + } + }, + "node_modules/hogan.js/node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "engines": { + "node": "*" + } + }, + "node_modules/htm": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", + "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==" + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "dependencies": { + "punycode": "2.1.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/idna-uts46-hx/node_modules/punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/instantsearch.js": { + "version": "4.56.9", + "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.56.9.tgz", + "integrity": "sha512-jyRbByRUPm/ISVdRknCUDenZh65IDO2KE3GMP+RLSpcl3PV9TRfqFCbzoaSAwholbZW7sm3InBP7isCWyQMPlw==", + "dependencies": { + "@algolia/events": "^4.0.1", + "@algolia/ui-components-highlight-vdom": "^1.2.1", + "@algolia/ui-components-shared": "^1.2.1", + "@types/dom-speech-recognition": "^0.0.1", + "@types/google.maps": "^3.45.3", + "@types/hogan.js": "^3.0.0", + "@types/qs": "^6.5.3", + "algoliasearch-helper": "3.14.0", + "hogan.js": "^3.0.2", + "htm": "^3.0.0", + "preact": "^10.10.0", + "qs": "^6.5.1 < 6.10", + "search-insights": "^2.6.0" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/instantsearch.js/node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unicode-supported": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", + "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/keccak": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz", + "integrity": "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==", + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.27.0", + "lightningcss-darwin-x64": "1.27.0", + "lightningcss-freebsd-x64": "1.27.0", + "lightningcss-linux-arm-gnueabihf": "1.27.0", + "lightningcss-linux-arm64-gnu": "1.27.0", + "lightningcss-linux-arm64-musl": "1.27.0", + "lightningcss-linux-x64-gnu": "1.27.0", + "lightningcss-linux-x64-musl": "1.27.0", + "lightningcss-win32-arm64-msvc": "1.27.0", + "lightningcss-win32-x64-msvc": "1.27.0" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz", + "integrity": "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz", + "integrity": "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz", + "integrity": "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz", + "integrity": "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz", + "integrity": "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz", + "integrity": "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz", + "integrity": "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz", + "integrity": "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz", + "integrity": "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz", + "integrity": "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/load-yaml-file/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lowlight/node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.441.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.441.0.tgz", + "integrity": "sha512-0vfExYtvSDhkC2lqg0zYVW1Uu9GsI4knuV9GP9by5z0Xhc4Zi5RejTxfz9LsjRmCyWVzHCJvxGKZWcRyvQCWVg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/markdown-to-jsx": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.2.1.tgz", + "integrity": "sha512-9HrdzBAo0+sFz9ZYAGT5fB8ilzTW+q6lPocRxrIesMO+aB40V9MgFfbfMXxlGjf22OpRy+IXlvVaQenicdpgbg==", + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-directive/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive/node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "license": "MIT", + "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-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-directive/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-directive/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "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-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-footnote/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "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-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-gfm-table/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "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-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-table/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "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-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-gfm/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm/node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "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-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "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" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/mdast-util-mdx-expression/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "@types/unist": "*" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "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" }, - "engines": { - "node": ">=12" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", "dependencies": { - "fill-range": "^7.0.1" + "@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-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "node_modules/mdast-util-mdx-expression/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@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" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "node_modules/mdast-util-mdx-expression/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "node_modules/mdast-util-mdx-expression/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "base-x": "^3.0.2" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "node_modules/mdast-util-mdx-expression/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, - "node_modules/bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "hasInstallScript": true, + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "engines": { - "node": ">=10.6.0" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-decode-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001508", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", - "integrity": "sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==", + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ] }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", "funding": [ { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], "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" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" + "micromark-util-types": "^2.0.0" } }, - "node_modules/cids/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/cids/node_modules/multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "buffer": "^5.6.0", - "varint": "^5.0.0" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + "node_modules/mdast-util-mdx-expression/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "engines": { - "node": ">=10" + "node_modules/mdast-util-mdx-expression/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/cli-cursor": { + "node_modules/mdast-util-mdx-expression/node_modules/unist-util-stringify-position": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", - "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", - "engines": { - "node": ">=6" + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", "dependencies": { - "mimic-response": "^1.0.0" + "@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-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "optional": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/color/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "optional": true, + "node_modules/mdast-util-mdx-jsx/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/unist": "*" } }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "optional": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "node_modules/mdast-util-mdx-jsx/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" } }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "node_modules/mdast-util-mdx-jsx/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-mdx-jsx/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "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" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/mdast-util-mdx-jsx/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dependencies": { - "safe-buffer": "5.2.1" + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "node_modules/mdast-util-mdx-jsx/node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" + "@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-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" + "node_modules/mdast-util-mdx-jsx/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" + "node_modules/mdast-util-mdx-jsx/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "toggle-selection": "^1.0.6" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" } }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.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" } }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "node-fetch": "^2.6.11" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + ], "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", - "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." - }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" } }, - "node_modules/cssdb": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.6.0.tgz", - "integrity": "sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w==", + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "github", - "url": "https://github.com/sponsors/csstools" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ] }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/dart-linkcheck": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/dart-linkcheck/-/dart-linkcheck-2.0.15.tgz", - "integrity": "sha512-ZMvxkAyEpBTvBFk+DPjcK0ObNy8GM4gmrGG1qIu0EXb/zj25vjRWNnhLHKZw4JlOLo02oWlwDeqo98GuBlJcIg==", - "dev": true, - "bin": { - "linkcheck": "bin/linkcheck", - "linkcheck-linux": "bin/linkcheck-linux", - "linkcheck-win": "bin/linkcheck-win" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" + "micromark-util-types": "^2.0.0" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "engines": { - "node": ">=0.10" - } + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/decompress-response": { + "node_modules/mdast-util-mdx-jsx/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-is": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "optional": true, - "engines": { - "node": ">=4.0.0" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" + "node_modules/mdast-util-mdx-jsx/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" + "node_modules/mdast-util-mdx/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } + "node_modules/mdast-util-mdx/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" + "node_modules/mdast-util-mdx/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node_modules/mdast-util-mdx/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", - "optional": true, - "engines": { - "node": ">=8" + "node_modules/mdast-util-mdx/node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "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-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/devalue": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", - "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==" - }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "engines": { - "node": ">=0.3.1" + "node_modules/mdast-util-mdx/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "node_modules/dset": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", - "integrity": "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==", - "engines": { - "node": ">=4" + "node_modules/mdast-util-mdx/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-mdx/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-mdx/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "node_modules/mdast-util-mdx/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.441", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.441.tgz", - "integrity": "sha512-LlCgQ8zgYZPymf5H4aE9itwiIWH4YlCiv1HFLmmcBeFYi5E+3eaIFnjHzYtcFQbaKfAW+CqZ9pgxo33DZuoqPg==" - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "node_modules/mdast-util-mdx/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/emoji-regex": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", - "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" + "node_modules/mdast-util-mdx/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/mdast-util-mdx/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "once": "^1.4.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" } }, - "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" - }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, + "node_modules/mdast-util-mdx/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "node_modules/mdast-util-mdx/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + "node_modules/mdast-util-mdx/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "node_modules/mdast-util-mdx/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/esbuild": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", - "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.2", - "@esbuild/android-arm64": "0.19.2", - "@esbuild/android-x64": "0.19.2", - "@esbuild/darwin-arm64": "0.19.2", - "@esbuild/darwin-x64": "0.19.2", - "@esbuild/freebsd-arm64": "0.19.2", - "@esbuild/freebsd-x64": "0.19.2", - "@esbuild/linux-arm": "0.19.2", - "@esbuild/linux-arm64": "0.19.2", - "@esbuild/linux-ia32": "0.19.2", - "@esbuild/linux-loong64": "0.19.2", - "@esbuild/linux-mips64el": "0.19.2", - "@esbuild/linux-ppc64": "0.19.2", - "@esbuild/linux-riscv64": "0.19.2", - "@esbuild/linux-s390x": "0.19.2", - "@esbuild/linux-x64": "0.19.2", - "@esbuild/netbsd-x64": "0.19.2", - "@esbuild/openbsd-x64": "0.19.2", - "@esbuild/sunos-x64": "0.19.2", - "@esbuild/win32-arm64": "0.19.2", - "@esbuild/win32-ia32": "0.19.2", - "@esbuild/win32-x64": "0.19.2" + "node_modules/mdast-util-mdx/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" + "node_modules/mdast-util-mdx/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "node_modules/mdast-util-mdx/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } + "node_modules/mdast-util-mdx/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" + "node_modules/mdast-util-mdx/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/estree-util-attach-comments": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz", - "integrity": "sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==", + "node_modules/mdast-util-mdx/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-types": "^2.0.0" } }, - "node_modules/estree-util-build-jsx": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz", - "integrity": "sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==", + "node_modules/mdast-util-mdx/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/estree-jsx": "^1.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "estree-walker": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/estree-util-is-identifier-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz", - "integrity": "sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/mdast-util-mdx/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/estree-util-to-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz", - "integrity": "sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==", + "node_modules/mdast-util-mdx/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-mdx/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-mdx/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/estree-util-visit": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.1.tgz", - "integrity": "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==", + "node_modules/mdast-util-mdx/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" + "@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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eth-ens-namehash/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" - }, - "node_modules/eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "node_modules/mdast-util-mdxjs-esm/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" + "@types/unist": "*" } }, - "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "node_modules/mdast-util-mdxjs-esm/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dependencies": { - "js-sha3": "^0.8.0" + "@types/unist": "*" } }, - "node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } + "node_modules/mdast-util-mdxjs-esm/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "@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" }, - "engines": { - "node": ">=10.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ethereumjs-util/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" - }, - "node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" + "@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-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" + "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "optional": true, - "engines": { - "node": ">=6" + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "ms": "2.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" } }, - "node_modules/express/node_modules/ms": { + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-factory-whitespace": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "type": "^2.7.2" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "optional": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "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" - }, - "engines": { - "node": ">=8.6.0" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "reusify": "^1.0.4" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "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" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "ms": "2.0.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/finalhandler/node_modules/ms": { + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-resolve-all": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "micromark-util-types": "^2.0.0" } }, - "node_modules/find-yarn-workspace-root2": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", - "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "is-callable": "^1.1.3" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">= 0.12" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/form-data-encoder": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" + "node_modules/mdast-util-mdxjs-esm/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "engines": { - "node": "*" + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "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" }, "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" + "node_modules/mdast-util-to-hast/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "optional": true - }, - "node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "node_modules/mdast-util-to-hast/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@types/unist": "*" } }, - "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "node_modules/mdast-util-to-hast/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "minipass": "^2.6.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" + "node_modules/mdast-util-to-hast/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "node_modules/mdast-util-to-hast/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" + "node_modules/mdast-util-to-hast/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "node_modules/mdast-util-to-hast/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" + "node_modules/mdast-util-to-hast/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", "dependencies": { - "assert-plus": "^1.0.0" + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "optional": true - }, - "node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" }, - "engines": { - "node": ">= 6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/mdast-util-toc": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-6.1.1.tgz", + "integrity": "sha512-Er21728Kow8hehecK2GZtb7Ny3omcoPUVrmObiSUwmoRYVZaXLR751QROEFjR8W/vAQdHMLj49Lz20J55XaNpw==", "dependencies": { - "get-intrinsic": "^1.1.3" + "@types/extend": "^3.0.0", + "@types/mdast": "^3.0.0", + "extend": "^3.0.0", + "github-slugger": "^2.0.0", + "mdast-util-to-string": "^3.1.0", + "unist-util-is": "^5.0.0", + "unist-util-visit": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "node_modules/mdast-util-toc/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", "dependencies": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=14.16" + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" }, "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "node_modules/mdast-util-toc/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { - "node": ">=6.0" + "node": ">= 0.6" } }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "sprintf-js": "~1.0.2" + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" } }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/micromark-extension-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.1.tgz", + "integrity": "sha512-VGV2uxUzhEZmaP7NSFo2vtq7M2nUD+WfmYQD+d8i/1nHbzE+rMy9uzTvUybBbNiVbrhOZibg3gbyoARGqgDWyg==", + "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "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" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/har-schema": { + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/micromark-extension-directive/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" + "node_modules/micromark-extension-directive/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "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" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "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" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "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" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/hast-util-from-parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", - "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "hastscript": "^7.0.0", - "property-information": "^6.0.0", - "vfile": "^5.0.0", - "vfile-location": "^4.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/hast-util-has-property": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz", - "integrity": "sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/hast-util-heading-rank": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-2.1.1.tgz", - "integrity": "sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/hast-util-is-element": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz", - "integrity": "sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/hast-util-parse-selector": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", - "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/hast-util-raw": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", - "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/hast": "^2.0.0", - "@types/parse5": "^6.0.0", - "hast-util-from-parse5": "^7.0.0", - "hast-util-to-parse5": "^7.0.0", - "html-void-elements": "^2.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/hast-util-to-estree": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz", - "integrity": "sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "estree-util-attach-comments": "^2.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "mdast-util-mdx-expression": "^1.0.0", - "mdast-util-mdxjs-esm": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.1", - "unist-util-position": "^4.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/hast-util-to-html": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", - "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^7.0.0", - "hast-util-whitespace": "^2.0.0", - "html-void-elements": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/hast-util-to-parse5": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", - "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-types": "^2.0.0" } }, - "node_modules/hast-util-to-string": { + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-sanitize-uri": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz", - "integrity": "sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/hast-util-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", - "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/hastscript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", - "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^3.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" + "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" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "engines": { - "node": "*" + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/hogan.js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", - "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "mkdirp": "0.3.0", - "nopt": "1.0.10" - }, - "bin": { - "hulk": "bin/hulk" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/hogan.js/node_modules/mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "engines": { - "node": "*" + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" } }, - "node_modules/htm": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", - "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==" + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/html-void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", - "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "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" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-errors": { + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" + "micromark-util-types": "^2.0.0" }, - "engines": { - "node": ">=10.19.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" - } + "node_modules/micromark-extension-gfm-tagfilter/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "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" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "punycode": "2.1.0" - }, - "engines": { - "node": ">=4.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/idna-uts46-hx/node_modules/punycode": { + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", - "engines": { - "node": ">=6" + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ] }, - "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" - }, - "node_modules/import-meta-resolve": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", - "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/micromark-extension-gfm/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/micromark-extension-gfm/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "optional": true + "node_modules/micromark-extension-gfm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + "node_modules/micromark-extension-gfm/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/instantsearch.js": { - "version": "4.56.9", - "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.56.9.tgz", - "integrity": "sha512-jyRbByRUPm/ISVdRknCUDenZh65IDO2KE3GMP+RLSpcl3PV9TRfqFCbzoaSAwholbZW7sm3InBP7isCWyQMPlw==", + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@algolia/events": "^4.0.1", - "@algolia/ui-components-highlight-vdom": "^1.2.1", - "@algolia/ui-components-shared": "^1.2.1", - "@types/dom-speech-recognition": "^0.0.1", - "@types/google.maps": "^3.45.3", - "@types/hogan.js": "^3.0.0", - "@types/qs": "^6.5.3", - "algoliasearch-helper": "3.14.0", - "hogan.js": "^3.0.2", - "htm": "^3.0.0", - "preact": "^10.10.0", - "qs": "^6.5.1 < 6.10", - "search-insights": "^2.6.0" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" + "@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" } }, - "node_modules/instantsearch.js/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "@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-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "optional": true + "node_modules/micromark-extension-mdx-jsx/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/is-binary-path": { + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } - ], - "engines": { - "node": ">=4" - } + ] }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" + "node_modules/micromark-extension-mdx-jsx/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "node_modules/micromark-extension-mdx-jsx/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "has": "^1.0.3" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "dependencies": { + "micromark-util-types": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/micromark-extension-mdx-md/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/is-fullwidth-code-point": { + "node_modules/micromark-extension-mdxjs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "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" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", "dependencies": { - "is-extglob": "^2.1.1" + "@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" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } + "node_modules/micromark-extension-mdxjs-esm/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/is-hexadecimal": { + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-core-commonmark": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { + "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" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-factory-destination": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/is-reference": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.1.tgz", - "integrity": "sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==", + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/estree": "*" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/isexe": { + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-html-tag-name": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">=0.6.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/keccak": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", - "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "hasInstallScript": true, + "node_modules/micromark-extension-mdxjs-esm/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, - "engines": { - "node": ">=10.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "node_modules/micromark-extension-mdxjs/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "json-buffer": "3.0.1" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" + "node_modules/micromark-extension-mdxjs/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" - } + "node_modules/micromark-extension-mdxjs/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/load-yaml-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", - "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "node_modules/micromark-extension-mdxjs/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.13.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/load-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "sprintf-js": "~1.0.2" + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" } }, - "node_modules/load-yaml-file/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", + "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "@types/estree": "^1.0.0", + "devlop": "^1.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" } }, - "node_modules/load-yaml-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } + "node_modules/micromark-factory-mdx-expression/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "node_modules/micromark-factory-mdx-expression/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node_modules/micromark-factory-mdx-expression/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/lowlight": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/lowlight/node_modules/fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "yallist": "^3.0.2" + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/magic-string": { - "version": "0.30.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", - "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/markdown-extensions": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz", - "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==", - "engines": { - "node": ">=0.10.0" + "@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" } }, - "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/micromark-util-events-to-acorn/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/markdown-to-jsx": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.2.1.tgz", - "integrity": "sha512-9HrdzBAo0+sFz9ZYAGT5fB8ilzTW+q6lPocRxrIesMO+aB40V9MgFfbfMXxlGjf22OpRy+IXlvVaQenicdpgbg==", - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "react": ">= 0.14.0" - } + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "node_modules/micromark-util-events-to-acorn/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-find-and-replace": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", - "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "node_modules/micromark-util-events-to-acorn/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "@types/mdast": "^3.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/mdast-util-gfm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", - "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-gfm-autolink-literal": "^1.0.0", - "mdast-util-gfm-footnote": "^1.0.0", - "mdast-util-gfm-strikethrough": "^1.0.0", - "mdast-util-gfm-table": "^1.0.0", - "mdast-util-gfm-task-list-item": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-types": "^1.0.0" } }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/mdast": "^3.0.0", - "ccount": "^2.0.0", - "mdast-util-find-and-replace": "^2.0.0", - "micromark-util-character": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/mdast-util-gfm-footnote": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", - "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-util-normalize-identifier": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" } }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", - "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" } }, - "node_modules/mdast-util-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", - "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "@types/mdast": "^3.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.3.0" + "mime-db": "1.52.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.6" } }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", - "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mdast-util-mdx": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz", - "integrity": "sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==", - "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-mdx-expression": "^1.0.0", - "mdast-util-mdx-jsx": "^2.0.0", - "mdast-util-mdxjs-esm": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" } }, - "node_modules/mdast-util-mdx-expression": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz", - "integrity": "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==", + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "dom-walk": "^0.1.0" } }, - "node_modules/mdast-util-mdx-jsx": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz", - "integrity": "sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==", + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "ccount": "^2.0.0", - "mdast-util-from-markdown": "^1.1.0", - "mdast-util-to-markdown": "^1.3.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^4.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz", - "integrity": "sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, - "node_modules/mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "minipass": "^2.9.0" } }, - "node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "node_modules/mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", "dependencies": { - "@types/mdast": "^3.0.0" + "mkdirp": "*" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=4" } }, - "node_modules/mdast-util-toc": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-6.1.1.tgz", - "integrity": "sha512-Er21728Kow8hehecK2GZtb7Ny3omcoPUVrmObiSUwmoRYVZaXLR751QROEFjR8W/vAQdHMLj49Lz20J55XaNpw==", - "dependencies": { - "@types/extend": "^3.0.0", - "@types/mdast": "^3.0.0", - "extend": "^3.0.0", - "github-slugger": "^2.0.0", - "mdast-util-to-string": "^3.1.0", - "unist-util-is": "^5.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "node_modules/multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" + "node_modules/multibase/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "varint": "^5.0.0" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" + "node_modules/multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "dependencies": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" } }, - "node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "node_modules/multihashes/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ], "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "node_modules/multihashes/node_modules/multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/micromark-extension-gfm": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", - "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^1.0.0", - "micromark-extension-gfm-footnote": "^1.0.0", - "micromark-extension-gfm-strikethrough": "^1.0.0", - "micromark-extension-gfm-table": "^1.0.0", - "micromark-extension-gfm-tagfilter": "^1.0.0", - "micromark-extension-gfm-task-list-item": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" } }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", - "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "node_modules/next": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/next/-/next-14.1.1.tgz", + "integrity": "sha512-McrGJqlGSHeaz2yTRPkEucxQKe5Zq7uPwyeHNmJaZNY4wx9E9QdxmTp310agFRoMuIYgQrCrT3petg13fSVOww==", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@next/env": "14.1.1", + "@swc/helpers": "0.5.2", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.1.1", + "@next/swc-darwin-x64": "14.1.1", + "@next/swc-linux-arm64-gnu": "14.1.1", + "@next/swc-linux-arm64-musl": "14.1.1", + "@next/swc-linux-x64-gnu": "14.1.1", + "@next/swc-linux-x64-musl": "14.1.1", + "@next/swc-win32-arm64-msvc": "14.1.1", + "@next/swc-win32-ia32-msvc": "14.1.1", + "@next/swc-win32-x64-msvc": "14.1.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "sass": { + "optional": true + } } }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", - "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", - "dependencies": { - "micromark-core-commonmark": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/next-secure-headers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/next-secure-headers/-/next-secure-headers-2.2.0.tgz", + "integrity": "sha512-C7OfZ9JdSJyYMz2ZBMI/WwNbt0qNjlFWX9afUp8nEUzbz6ez3JbeopdyxSZJZJAzVLIAfyk6n73rFpd4e22jRg==", + "engines": { + "node": ">=10.0.0" } }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", - "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "@types/nlcst": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", - "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", - "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", "dependencies": { - "micromark-util-types": "^1.0.0" + "abbrev": "1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" } }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", - "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-extension-mdx-expression": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz", - "integrity": "sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "micromark-factory-mdx-expression": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-events-to-acorn": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } + "node_modules/not": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz", + "integrity": "sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==" }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz", - "integrity": "sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==", + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "micromark-factory-mdx-expression": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-extension-mdx-md": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz", - "integrity": "sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==", - "dependencies": { - "micromark-util-types": "^1.0.0" + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-extension-mdxjs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz", - "integrity": "sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^1.0.0", - "micromark-extension-mdx-jsx": "^1.0.0", - "micromark-extension-mdx-md": "^1.0.0", - "micromark-extension-mdxjs-esm": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" + "boolbase": "^1.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz", - "integrity": "sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==", + "node_modules/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", "dependencies": { - "@types/estree": "^1.0.0", - "micromark-core-commonmark": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-events-to-acorn": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-position-from-estree": "^1.1.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" } }, - "node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/micromark-factory-mdx-expression": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz", - "integrity": "sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", "dependencies": { - "@types/estree": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-events-to-acorn": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-position-from-estree": "^1.0.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" + "http-https": "^1.0.0" } }, - "node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "wrappy": "1" } }, - "node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/oniguruma-to-js": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", + "integrity": "sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==", + "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "regex": "^4.3.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/ora": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", + "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz", + "integrity": "sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/p-queue": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", + "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] + "node_modules/p-queue/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, - "node_modules/micromark-util-events-to-acorn": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz", - "integrity": "sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/p-timeout": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", + "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", "@types/unist": "^2.0.0", - "estree-util-visit": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0", - "vfile-message": "^3.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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/parse-latin/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/parse-latin/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/parse-latin/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", "dependencies": { - "micromark-util-types": "^1.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/parse-latin/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "engines": { - "node": ">=8.6" + "node": ">=8" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "bin": { - "mime": "cli.js" + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { - "node": ">= 0.6" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dependencies": { - "mime-db": "1.52.0" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" }, "engines": { - "node": ">= 0.6" + "node": ">=0.12" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { - "node": ">=12" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, "engines": { - "node": ">=4" + "node": "^10 || ^12 || >=14" } }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", "dependencies": { - "dom-walk": "^0.1.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" } }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=10" + "node": "^12 || ^14 || >=16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "optional": true - }, - "node_modules/mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", "dependencies": { - "mkdirp": "*" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/mock-fs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", - "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "engines": { - "node": ">=4" + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/multibase/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" } }, - "node_modules/multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", "dependencies": { - "varint": "^5.0.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", "dependencies": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" } }, - "node_modules/multihashes/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/multihashes/node_modules/multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "optional": true - }, - "node_modules/needle": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", - "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 4.4.x" + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "peerDependencies": { + "postcss": "^8.1.4" } }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, "engines": { - "node": ">= 0.6" + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/next": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/next/-/next-13.5.6.tgz", - "integrity": "sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==", + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", "dependencies": { - "@next/env": "13.5.6", - "@swc/helpers": "0.5.2", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.31", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0" - }, - "bin": { - "next": "dist/bin/next" + "postcss-selector-parser": "^6.0.9" }, "engines": { - "node": ">=16.14.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "13.5.6", - "@next/swc-darwin-x64": "13.5.6", - "@next/swc-linux-arm64-gnu": "13.5.6", - "@next/swc-linux-arm64-musl": "13.5.6", - "@next/swc-linux-x64-gnu": "13.5.6", - "@next/swc-linux-x64-musl": "13.5.6", - "@next/swc-win32-arm64-msvc": "13.5.6", - "@next/swc-win32-ia32-msvc": "13.5.6", - "@next/swc-win32-x64-msvc": "13.5.6" + "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "sass": { - "optional": true - } + "postcss": "^8.4" } }, - "node_modules/next-secure-headers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/next-secure-headers/-/next-secure-headers-2.2.0.tgz", - "integrity": "sha512-C7OfZ9JdSJyYMz2ZBMI/WwNbt0qNjlFWX9afUp8nEUzbz6ez3JbeopdyxSZJZJAzVLIAfyk6n73rFpd4e22jRg==", - "engines": { - "node": ">=10.0.0" + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } }, - "node_modules/nlcst-to-string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz", - "integrity": "sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==", + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", "dependencies": { - "@types/nlcst": "^1.0.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/node-abi": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", - "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", - "optional": true, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dependencies": { - "semver": "^7.3.5" + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" }, "engines": { - "node": ">=10" + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", "dependencies": { - "abbrev": "1" + "camelcase-css": "^2.0.1" }, - "bin": { - "nopt": "bin/nopt.js" + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "*" + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", "engines": { - "node": ">=0.10.0" + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", "engines": { - "node": ">=10" + "node": ">=10.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "postcss-selector-parser": "^6.1.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.2.14" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, "engines": { - "node": ">=12" + "node": "^12 || ^14 || >=16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" + "type": "opencollective", + "url": "https://opencollective.com/csstools" }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], "engines": { - "node": "*" + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "node": "^12 || ^14 || >=16" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dependencies": { - "http-https": "^1.0.0" + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "peerDependencies": { + "postcss": "^8" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", "dependencies": { - "ee-first": "1.1.1" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.8" + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", "dependencies": { - "wrappy": "1" + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", "dependencies": { - "mimic-fn": "^4.0.0" + "postcss-selector-parser": "^6.0.10" }, "engines": { - "node": ">=12" + "node": "^12 || ^14 || >=16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/ora": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", - "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" + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" }, "engines": { - "node": ">=16" + "node": "^12 || ^14 || >=16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=4" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "engines": { - "node": ">=12.20" + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/preact": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", + "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" } }, - "node_modules/p-limit": { + "node_modules/preferred-pm": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.0.0.tgz", + "integrity": "sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==", "dependencies": { - "yocto-queue": "^1.0.0" + "find-up-simple": "^1.0.0", + "find-yarn-workspace-root2": "1.2.16", + "which-pm": "^3.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18.12" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/prettier-plugin-astro": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.14.1.tgz", + "integrity": "sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==", + "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "@astrojs/compiler": "^2.9.1", + "prettier": "^3.0.0", + "sass-formatter": "^0.7.6" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/p-locate/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { - "node": ">=6" + "node": ">= 0.6.0" } }, - "node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "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" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">= 6" } }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } }, - "node_modules/parse-latin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-5.0.1.tgz", - "integrity": "sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dependencies": { - "nlcst-to-string": "^3.0.0", - "unist-util-modify-children": "^3.0.0", - "unist-util-visit-children": "^2.0.0" - }, + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=0.12" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "engines": { - "node": ">=8.6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "engines": { - "node": ">=6" + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dependencies": { - "p-locate": "^4.1.0" + "loose-envify": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/react-copy-to-clipboard": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": "^15.3.0 || 16 || 17 || 18" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dependencies": { - "p-limit": "^2.2.0" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": "^18.2.0" } }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "node_modules/react-icons": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", + "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", + "peerDependencies": { + "react": "*" } }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-redux": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.1.tgz", + "integrity": "sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA==", "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" }, "peerDependencies": { - "postcss": "^8.2" + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4 || ^5.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } } }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "node_modules/react-redux/node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "react-is": "^16.7.0" + } + }, + "node_modules/react-redux/node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" + "node": ">=0.10.0" } }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "node_modules/react-syntax-highlighter": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", + "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "lowlight": "^1.17.0", + "prismjs": "^1.27.0", + "refractor": "^3.6.0" }, "peerDependencies": { - "postcss": "^8.2" + "react": ">= 0.14.0" } }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">=0.10.0" } }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "postcss-value-parser": "^4.2.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">= 6" } }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { - "postcss-value-parser": "^4.2.0" + "picomatch": "^2.2.1" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" + "node": ">=8.10.0" } }, - "node_modules/postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "@babel/runtime": "^7.9.2" } }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, + "node_modules/refractor/node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, + "node_modules/refractor/node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "node_modules/refractor/node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/postcss-flexbugs-fixes": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "peerDependencies": { - "postcss": "^8.1.4" + "node_modules/refractor/node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "node_modules/refractor/node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/refractor/node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "node_modules/refractor/node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "peerDependencies": { - "postcss": "^8.1.0" + "node_modules/refractor/node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "engines": { - "node": "^12 || ^14 || >=16" - }, + "node_modules/refractor/node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "node_modules/refractor/node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, + "node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", "engines": { - "node": ">=14.0.0" + "node": ">=6" + } + }, + "node_modules/refractor/node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" }, - "peerDependencies": { - "postcss": "^8.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "peerDependencies": { - "postcss": "^8.0.0" + "node_modules/refractor/node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regex": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.2.tgz", + "integrity": "sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz", + "integrity": "sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/unified" } }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "engines": { - "node": "^12 || ^14 || >=16" + "node_modules/rehype-autolink-headings": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-6.1.1.tgz", + "integrity": "sha512-NMYzZIsHM3sA14nC5rAFuUPIOfg+DFmf9EY1YMhaNlB7+3kK/ZlE6kqPfuxr1tsJ1XWkTrMtMoyHosU70d35mA==", + "dependencies": { + "@types/hast": "^2.0.0", + "extend": "^3.0.0", + "hast-util-has-property": "^2.0.0", + "hast-util-heading-rank": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "engines": { - "node": ">=10.0.0" + "node_modules/rehype-autolink-headings/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "node_modules/rehype-autolink-headings/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/unified" } }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.2" + "node_modules/rehype-expressive-code": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.36.1.tgz", + "integrity": "sha512-q5TFftM8m64vYIou1tcJ2oHHDox2dWAa/x6uFw+v55xsyCNicJhVN86LHBnktTPxXvOuUA7ovk1GIG9sjLA6Aw==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.36.1" } }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "node_modules/rehype-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", + "integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/unified" } }, - "node_modules/postcss-page-break": { + "node_modules/rehype-parse/node_modules/@types/hast": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "peerDependencies": { - "postcss": "^8" + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" } }, - "node_modules/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "node_modules/rehype-parse/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/rehype-parse/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@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" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/unified" } }, - "node_modules/postcss-preset-env": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", - "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "node_modules/rehype-parse/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "@csstools/postcss-cascade-layers": "^1.1.1", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.13", - "browserslist": "^4.21.4", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.1.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.10", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.2.0", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" + "@types/unist": "^3.0.0" }, - "engines": { - "node": "^12 || ^14 || >=16" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/unified" } }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "node_modules/rehype-parse/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" }, - "peerDependencies": { - "postcss": "^8.2" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "peerDependencies": { - "postcss": "^8.0.3" + "node_modules/rehype-raw/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" } }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "node_modules/rehype-raw/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/rehype-raw/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/unified" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "node_modules/rehype-raw/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/preact": { - "version": "10.15.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", - "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==", + "node_modules/rehype-raw/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/preact" + "url": "https://opencollective.com/unified" } }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "optional": true, + "node_modules/rehype-slug": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-5.1.0.tgz", + "integrity": "sha512-Gf91dJoXneiorNEnn+Phx97CO7oRMrpi+6r155tTxzGuLtm+QrI4cTwCa9e1rtePdL4i9tSO58PeSS6HWfgsiw==", "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" + "@types/hast": "^2.0.0", + "github-slugger": "^2.0.0", + "hast-util-has-property": "^2.0.0", + "hast-util-heading-rank": "^2.0.0", + "hast-util-to-string": "^2.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" }, - "bin": { - "prebuild-install": "bin.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-slug/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/prebuild-install/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "optional": true, + "node_modules/rehype-slug/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/prebuild-install/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, + "node_modules/rehype-stringify": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.0.tgz", + "integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/prebuild-install/node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, + "node_modules/rehype-stringify/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "@types/unist": "*" } }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "optional": true, + "node_modules/rehype-stringify/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/rehype-stringify/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "@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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "optional": true, + "node_modules/rehype-stringify/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/preferred-pm": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.2.tgz", - "integrity": "sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==", + "node_modules/rehype-stringify/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", "dependencies": { - "find-up": "^5.0.0", - "find-yarn-workspace-root2": "1.2.16", - "path-exists": "^4.0.0", - "which-pm": "2.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/preferred-pm/node_modules/which-pm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", - "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "node_modules/rehype-stringify/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "load-yaml-file": "^0.2.0", - "path-exists": "^4.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, - "engines": { - "node": ">=8.15" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "engines": { - "node": ">=6" + "node_modules/rehype/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/rehype/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/rehype/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/probe-image-size": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", - "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", + "node_modules/rehype/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "lodash.merge": "^4.6.2", - "needle": "^2.5.2", - "stream-parser": "~0.3.1" + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" + "node_modules/rehype/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/rehype/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, - "engines": { - "node": ">= 6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/prompts/node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" + "node_modules/remark": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/remark/-/remark-14.0.3.tgz", + "integrity": "sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew==", + "dependencies": { + "@types/mdast": "^3.0.0", + "remark-parse": "^10.0.0", + "remark-stringify": "^10.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "node_modules/remark-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", + "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/property-information": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", - "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/remark-directive/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/remark-directive/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/remark-directive/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "@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" }, - "engines": { - "node": ">= 0.10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/remark-directive/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" + "node_modules/remark-directive/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/remark-directive/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "@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" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/remark-gfm/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "optional": true + "node_modules/remark-gfm/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" + "node_modules/remark-gfm/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "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" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/remark-gfm/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/remark-gfm/node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "@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-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" }, - "engines": { - "node": ">= 0.8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, + "node_modules/remark-gfm/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "@types/mdast": "^4.0.0" }, - "bin": { - "rc": "cli.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "node_modules/remark-gfm/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/remark-gfm/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/remark-gfm/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/react-copy-to-clipboard": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", - "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", + "node_modules/remark-gfm/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "copy-to-clipboard": "^3.3.1", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "react": "^15.3.0 || 16 || 17 || 18" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "node_modules/remark-gfm/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/react-icons": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", - "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", - "peerDependencies": { - "react": "*" + "node_modules/remark-gfm/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" } }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-redux": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.1.tgz", - "integrity": "sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA==", - "dependencies": { - "@babel/runtime": "^7.12.1", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/use-sync-external-store": "^0.0.3", - "hoist-non-react-statics": "^3.3.2", - "react-is": "^18.0.0", - "use-sync-external-store": "^1.0.0" - }, - "peerDependencies": { - "@types/react": "^16.8 || ^17.0 || ^18.0", - "@types/react-dom": "^16.8 || ^17.0 || ^18.0", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0", - "react-native": ">=0.59", - "redux": "^4 || ^5.0.0-beta.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true + "node_modules/remark-gfm/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, - "redux": { - "optional": true + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } + ], + "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" } }, - "node_modules/react-redux/node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "node_modules/remark-gfm/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "react-is": "^16.7.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/react-redux/node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-redux/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "engines": { - "node": ">=0.10.0" + "node_modules/remark-gfm/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/react-syntax-highlighter": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", - "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "node_modules/remark-gfm/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/runtime": "^7.3.1", - "highlight.js": "^10.4.1", - "lowlight": "^1.17.0", - "prismjs": "^1.27.0", - "refractor": "^3.6.0" - }, - "peerDependencies": { - "react": ">= 0.14.0" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "node_modules/remark-gfm/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "pify": "^2.3.0" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" + "node_modules/remark-gfm/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/remark-gfm/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "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" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/remark-gfm/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/remark-gfm/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/remark-gfm/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "node_modules/remark-gfm/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@babel/runtime": "^7.9.2" + "micromark-util-types": "^2.0.0" } }, - "node_modules/refractor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", - "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "node_modules/remark-gfm/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "hastscript": "^6.0.0", - "parse-entities": "^2.0.0", - "prismjs": "~1.27.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/refractor/node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/remark-gfm/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/refractor/node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/remark-gfm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/refractor/node_modules/comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/remark-gfm/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/refractor/node_modules/hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "node_modules/remark-gfm/node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "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" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/refractor/node_modules/hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "node_modules/remark-gfm/node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/refractor/node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "node_modules/remark-gfm/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" + "@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" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/refractor/node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "node_modules/remark-gfm/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" + "@types/unist": "^3.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", - "engines": { - "node": ">=6" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/refractor/node_modules/property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "node_modules/remark-gfm/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "xtend": "^4.0.0" + "@types/unist": "^3.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/rehype": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.1.tgz", - "integrity": "sha512-ey6kAqwLM3X6QnMDILJthGvG1m1ULROS9NT4uG9IDCuv08SFyLlreSuvOa//DgEvbXx62DS6elGVqusWhRUbgw==", + "node_modules/remark-gfm/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", "dependencies": { - "@types/hast": "^2.0.0", - "rehype-parse": "^8.0.0", - "rehype-stringify": "^9.0.0", - "unified": "^10.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-autolink-headings": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-6.1.1.tgz", - "integrity": "sha512-NMYzZIsHM3sA14nC5rAFuUPIOfg+DFmf9EY1YMhaNlB7+3kK/ZlE6kqPfuxr1tsJ1XWkTrMtMoyHosU70d35mA==", + "node_modules/remark-gfm/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "@types/hast": "^2.0.0", - "extend": "^3.0.0", - "hast-util-has-property": "^2.0.0", - "hast-util-heading-rank": "^2.0.0", - "hast-util-is-element": "^2.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", + "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-parse": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.4.tgz", - "integrity": "sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==", + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^7.0.0", - "parse5": "^6.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", "unified": "^10.0.0" }, "funding": { @@ -9127,135 +20473,174 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-raw": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", - "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-raw": "^7.2.0", - "unified": "^10.0.0" + "@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" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-slug": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-5.1.0.tgz", - "integrity": "sha512-Gf91dJoXneiorNEnn+Phx97CO7oRMrpi+6r155tTxzGuLtm+QrI4cTwCa9e1rtePdL4i9tSO58PeSS6HWfgsiw==", + "node_modules/remark-rehype/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { - "@types/hast": "^2.0.0", - "github-slugger": "^2.0.0", - "hast-util-has-property": "^2.0.0", - "hast-util-heading-rank": "^2.0.0", - "hast-util-to-string": "^2.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" + "@types/unist": "*" + } + }, + "node_modules/remark-rehype/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-rehype/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/remark-rehype/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "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" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-stringify": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.4.tgz", - "integrity": "sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ==", + "node_modules/remark-rehype/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-to-html": "^8.0.0", - "unified": "^10.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/remark/-/remark-14.0.3.tgz", - "integrity": "sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew==", + "node_modules/remark-rehype/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", "dependencies": { - "@types/mdast": "^3.0.0", - "remark-parse": "^10.0.0", - "remark-stringify": "^10.0.0", - "unified": "^10.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-gfm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", - "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "node_modules/remark-rehype/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-gfm": "^2.0.0", - "micromark-extension-gfm": "^2.0.0", - "unified": "^10.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-mdx": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz", - "integrity": "sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==", + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-smartypants/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/remark-smartypants/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dependencies": { - "mdast-util-mdx": "^2.0.0", - "micromark-extension-mdxjs": "^1.0.0" + "@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" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "node_modules/remark-smartypants/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-rehype": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "node_modules/remark-smartypants/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-smartypants": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-2.0.0.tgz", - "integrity": "sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==", + "node_modules/remark-smartypants/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "retext": "^8.1.0", - "retext-smartypants": "^5.1.0", - "unist-util-visit": "^4.1.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/remark-stringify": { @@ -9339,141 +20724,325 @@ "uuid": "bin/uuid" } }, - "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/responselike/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/retext-latin/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.1.0.tgz", + "integrity": "sha512-LDPXg95346bqFZnDMHo0S7Rq5p64+B+N8Vz733+wPMDtwb9rCOs9LIdIEhrUOU+TAywX9St+ocQWJt8wrzivcQ==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + "node_modules/retext-stringify/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "node_modules/retext-stringify/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dependencies": { - "lowercase-keys": "^2.0.0" + "@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" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/responselike/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/restore-cursor": { + "node_modules/retext-stringify/node_modules/unist-util-stringify-position": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" + "node_modules/retext-stringify/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/retext-stringify/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "node_modules/retext/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/retext": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/retext/-/retext-8.1.0.tgz", - "integrity": "sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==", + "node_modules/retext/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dependencies": { - "@types/nlcst": "^1.0.0", - "retext-latin": "^3.0.0", - "retext-stringify": "^3.0.0", - "unified": "^10.0.0" + "@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" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/retext-latin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-3.1.0.tgz", - "integrity": "sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==", + "node_modules/retext/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "@types/nlcst": "^1.0.0", - "parse-latin": "^5.0.0", - "unherit": "^3.0.0", - "unified": "^10.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/retext-smartypants": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-5.2.0.tgz", - "integrity": "sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==", + "node_modules/retext/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", "dependencies": { - "@types/nlcst": "^1.0.0", - "nlcst-to-string": "^3.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/retext-stringify": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-3.1.0.tgz", - "integrity": "sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==", + "node_modules/retext/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "@types/nlcst": "^1.0.0", - "nlcst-to-string": "^3.0.0", - "unified": "^10.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", @@ -9515,17 +21084,36 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/rollup": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.1.tgz", - "integrity": "sha512-c+ebvQz0VIH4KhhCpDsI+Bik0eT8ZFEVZEYw0cGMVqIP8zc+gnwl7iXCamTw7vzv2MeuZFZfdx5JJIq+ehzDlg==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", "fsevents": "~2.3.2" } }, @@ -9551,6 +21139,13 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/s.color": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz", + "integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==", + "dev": true, + "license": "MIT" + }, "node_modules/sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", @@ -9602,10 +21197,20 @@ "node": ">=14.0.0" } }, + "node_modules/sass-formatter": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.9.tgz", + "integrity": "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "suf-log": "^2.5.3" + } + }, "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, "node_modules/scheduler": { "version": "0.23.0", @@ -9655,35 +21260,13 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -9750,11 +21333,6 @@ "node": ">= 0.8.0" } }, - "node_modules/server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" - }, "node_modules/servify": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", @@ -9793,57 +21371,53 @@ } }, "node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", "hasInstallScript": true, - "optional": true, + "license": "Apache-2.0", "dependencies": { "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" + "detect-libc": "^2.0.3", + "semver": "^7.6.3" }, "engines": { - "node": ">=14.15.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp/node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "optional": true - }, - "node_modules/sharp/node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/shebang-command": { @@ -9866,20 +21440,26 @@ } }, "node_modules/shiki": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", - "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.17.7.tgz", + "integrity": "sha512-Zf6hNtWhFyF4XP5OOsXkBTEx9JFPiN0TQx4wSe+Vqeuczewgk2vT4IZhF4gka55uelm052BD5BaHavNqUNZd+A==", + "license": "MIT", "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" + "@shikijs/core": "1.17.7", + "@shikijs/engine-javascript": "1.17.7", + "@shikijs/engine-oniguruma": "1.17.7", + "@shikijs/types": "1.17.7", + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4" } }, - "node_modules/shiki/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + "node_modules/shiki/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } }, "node_modules/side-channel": { "version": "1.0.4", @@ -9949,7 +21529,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "optional": true, "dependencies": { "is-arrayish": "^0.3.1" } @@ -9960,9 +21539,9 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", @@ -9991,9 +21570,33 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -10045,39 +21648,20 @@ } }, "node_modules/stdin-discarder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", - "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", - "dependencies": { - "bl": "^5.0.0" - }, + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stream-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", - "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", - "dependencies": { - "debug": "2" - } - }, - "node_modules/stream-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/stream-parser/node_modules/ms": { + "node_modules/stream-replace-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==" }, "node_modules/streamsearch": { "version": "1.1.0", @@ -10087,16 +21671,6 @@ "node": ">=10.0.0" } }, - "node_modules/streamx": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", - "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", - "optional": true, - "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - } - }, "node_modules/strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -10105,34 +21679,76 @@ "node": ">=0.10.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, - "node_modules/string-width": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", - "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^10.2.1", - "strip-ansi": "^7.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -10156,14 +21772,36 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -10195,15 +21833,6 @@ "npm": ">=3" } }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-markdown": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/strip-markdown/-/strip-markdown-5.0.1.tgz", @@ -10219,9 +21848,9 @@ } }, "node_modules/style-to-object": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", - "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", "dependencies": { "inline-style-parser": "0.1.1" } @@ -10248,6 +21877,38 @@ } } }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "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" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/suf-log": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", + "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", + "dev": true, + "license": "MIT", + "dependencies": { + "s.color": "0.0.15" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10382,6 +22043,64 @@ "node": ">=8" } }, + "node_modules/tailwindcss": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.11.tgz", + "integrity": "sha512-qhEuBcLemjSJk5ajccN9xJFtM/h0AVCPaA6C92jNP+M2J8kX+eMJHI7R2HFKUvvAsMpcfLILMCFYSeDwpMmlUg==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/tar": { "version": "4.4.19", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", @@ -10399,37 +22118,64 @@ "node": ">=4.5" } }, - "node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "node_modules/tar/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/terser": { + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.1.tgz", + "integrity": "sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==", + "license": "BSD-2-Clause", "optional": true, + "peer": true, "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT", "optional": true, + "peer": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "any-promise": "^1.0.0" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", "dependencies": { - "minimist": "^1.2.6" + "thenify": ">= 3.1.0 < 4" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=0.8" } }, "node_modules/timed-out": { @@ -10507,31 +22253,29 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/tsconfig-resolver": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tsconfig-resolver/-/tsconfig-resolver-3.0.1.tgz", - "integrity": "sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==", - "dependencies": { - "@types/json5": "^0.0.30", - "@types/resolve": "^1.17.0", - "json5": "^2.1.3", - "resolve": "^1.17.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.13.1" - }, - "funding": { - "url": "https://github.com/sponsors/ifiokjr" - } + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" }, - "node_modules/tsconfig-resolver/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "node_modules/tsconfck": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", + "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, "engines": { - "node": ">=10" + "node": "^18 || >=20" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/tslib": { @@ -10592,34 +22336,20 @@ } }, "node_modules/ultrahtml": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.2.tgz", - "integrity": "sha512-qh4mBffhlkiXwDAOxvSGxhL0QEQsTbnP9BozOK3OYPEGvPvdWzvAUaXNtUSMdNsKDtuyjEbyVUPFZ52SSLhLqw==" + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz", + "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==" }, "node_modules/ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, - "node_modules/undici": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.0.tgz", - "integrity": "sha512-l3ydWhlhOJzMVOYkymLykcRRXqbUaQriERtR70B9LzNkZ4bX52Fc8wbTDneMiwo8T+AemZXvXaTx+9o5ROxrXg==", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/unherit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-3.0.1.tgz", - "integrity": "sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" }, "node_modules/unified": { "version": "10.1.2", @@ -10639,10 +22369,31 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/unist-util-find-after/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -10661,11 +22412,11 @@ } }, "node_modules/unist-util-modify-children": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-3.1.1.tgz", - "integrity": "sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", "dependencies": { - "@types/unist": "^2.0.0", + "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" }, "funding": { @@ -10673,12 +22424,17 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-modify-children/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, "node_modules/unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "dependencies": { - "@types/unist": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", @@ -10686,30 +22442,45 @@ } }, "node_modules/unist-util-position-from-estree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz", - "integrity": "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", "dependencies": { - "@types/unist": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-position-from-estree/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/unist-util-position/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, "node_modules/unist-util-remove-position": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz", - "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-remove-position/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, "node_modules/unist-util-stringify-position": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", @@ -10723,13 +22494,14 @@ } }, "node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, "funding": { "type": "opencollective", @@ -10737,24 +22509,68 @@ } }, "node_modules/unist-util-visit-children": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-2.0.2.tgz", - "integrity": "sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", "dependencies": { - "@types/unist": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-visit-children/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, "node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/unist-util-visit-parents/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/unist-util-visit/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", @@ -10778,9 +22594,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -10796,8 +22612,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -10928,492 +22744,179 @@ "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", - "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", - "dependencies": { - "@types/unist": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", - "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } + "node_modules/vfile-location/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" + "node_modules/vfile-location/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "node_modules/vfile-location/node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "node_modules/vfile-location/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "hasInstallScript": true, + "node_modules/vite": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", + "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.40", + "rollup": "^4.13.0" + }, "bin": { - "esbuild": "bin/esbuild" + "vite": "bin/vite.js" }, "engines": { - "node": ">=12" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/vitefu": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", - "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "fsevents": "~2.3.3" + }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" }, "peerDependenciesMeta": { - "vite": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { "optional": true } } }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==" - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==" - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "node_modules/vite/node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { - "node": ">=10.13.0" + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } } }, "node_modules/web-namespaces": { @@ -11834,15 +23337,14 @@ } }, "node_modules/which-pm": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.1.1.tgz", - "integrity": "sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-3.0.0.tgz", + "integrity": "sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==", "dependencies": { - "load-yaml-file": "^0.2.0", - "path-exists": "^4.0.0" + "load-yaml-file": "^0.2.0" }, "engines": { - "node": ">=8.15" + "node": ">=18.12" } }, "node_modules/which-pm-runs": { @@ -11923,6 +23425,98 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -12029,6 +23623,18 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, + "node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", @@ -12038,9 +23644,9 @@ } }, "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "engines": { "node": ">=12.20" }, @@ -12049,13 +23655,21 @@ } }, "node_modules/zod": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.1.tgz", - "integrity": "sha512-+dTu2m6gmCbO9Ahm4ZBDapx2O6ZY9QSPXst2WXjcznPMwf2YNpn3RevLx4KkZp1OPW/ouFcoBtBzFz/LeY69oA==", + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, + "node_modules/zod-to-json-schema": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.2.tgz", + "integrity": "sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==", + "peerDependencies": { + "zod": "^3.23.3" + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index 8c497790c..0cb0d473e 100644 --- a/package.json +++ b/package.json @@ -15,23 +15,30 @@ "generate-search-index": "node ./generate-search-index.js" }, "dependencies": { - "@astrojs/markdown-remark": "^3.2.0", - "@astrojs/mdx": "^1.1.0", - "@astrojs/react": "^3.0.2", - "@astrojs/sitemap": "^3.0.0", + "@astrojs/markdown-remark": "^5.2.0", + "@astrojs/mdx": "^3.1.3", + "@astrojs/partytown": "^2.1.2", + "@astrojs/react": "^3.6.2", + "@astrojs/sitemap": "^3.1.6", + "@astrojs/tailwind": "^5.1.0", + "@docsearch/react": "^3.6.1", "@headlessui/react": "^1.7.2", "@redux-devtools/extension": "^3.2.3", "@typeform/embed-react": "^1.21.0", "@types/react": "^18.2.14", "@types/react-dom": "^18.2.6", "algoliasearch": "^4.20.0", - "astro": "^3.1.4", + "astro": "^4.13.3", + "astro-expressive-code": "^0.36.1", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", "crypto": "^1.0.1", "gray-matter": "^4.0.3", "instantsearch.js": "^4.56.9", "lodash": "^4.17.21", + "lucide-react": "^0.441.0", "markdown-to-jsx": "^7.1.7", - "next": "^13.5.6", + "next": "^14.1.1", "next-secure-headers": "^2.2.0", "postcss-flexbugs-fixes": "^5.0.2", "postcss-import": "^15.0.0", @@ -44,15 +51,23 @@ "react-syntax-highlighter": "^15.5.0", "redux": "^4.2.1", "rehype-autolink-headings": "^6.1.1", + "rehype-raw": "^7.0.0", "rehype-slug": "^5.1.0", "remark": "^14.0.3", + "remark-directive": "^3.0.0", "remark-toc": "^8.0.1", "remove-markdown": "^0.5.0", "sass": "^1.63.6", + "sharp": "^0.33.5", "strip-markdown": "^5.0.1", + "tailwindcss": "^3.4.11", + "unist-util-visit": "^5.0.0", "web3": "^1.8.0" }, "devDependencies": { - "dart-linkcheck": "^2.0.15" + "@tailwindcss/typography": "^0.5.15", + "dart-linkcheck": "^2.0.15", + "prettier": "^3.3.3", + "prettier-plugin-astro": "^0.14.1" } } diff --git a/public/backgrounds/404/grid-1.svg b/public/backgrounds/404/grid-1.svg new file mode 100644 index 000000000..0ba984986 --- /dev/null +++ b/public/backgrounds/404/grid-1.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/backgrounds/404/grid-2.svg b/public/backgrounds/404/grid-2.svg new file mode 100644 index 000000000..c0caf3778 --- /dev/null +++ b/public/backgrounds/404/grid-2.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/backgrounds/worldmapdark.webp b/public/backgrounds/worldmapdark.webp new file mode 100644 index 000000000..165a3bf20 Binary files /dev/null and b/public/backgrounds/worldmapdark.webp differ diff --git a/public/backgrounds/worldmaplight.webp b/public/backgrounds/worldmaplight.webp new file mode 100644 index 000000000..337e8bb98 Binary files /dev/null and b/public/backgrounds/worldmaplight.webp differ diff --git a/public/images/assets/amplifier_diagram-light.svg b/public/images/assets/amplifier_diagram-light.svg new file mode 100644 index 000000000..9b345aa2c --- /dev/null +++ b/public/images/assets/amplifier_diagram-light.svg @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/amplifier_diagram.svg b/public/images/assets/amplifier_diagram.svg new file mode 100644 index 000000000..79137b267 --- /dev/null +++ b/public/images/assets/amplifier_diagram.svg @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/axelar_amplifier-introduction-diagram_dark.svg b/public/images/assets/axelar_amplifier-introduction-diagram_dark.svg new file mode 100644 index 000000000..688f3dfbc --- /dev/null +++ b/public/images/assets/axelar_amplifier-introduction-diagram_dark.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/assets/axelar_amplifier-introduction-diagram_light.svg b/public/images/assets/axelar_amplifier-introduction-diagram_light.svg new file mode 100644 index 000000000..3d01c88c9 --- /dev/null +++ b/public/images/assets/axelar_amplifier-introduction-diagram_light.svg @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/assets/btsg.svg b/public/images/assets/btsg.svg new file mode 100644 index 000000000..4848012b1 --- /dev/null +++ b/public/images/assets/btsg.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/assets/c4e.svg b/public/images/assets/c4e.svg new file mode 100644 index 000000000..77e4838af --- /dev/null +++ b/public/images/assets/c4e.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/images/assets/evm-relayer-flow-light.svg b/public/images/assets/evm-relayer-flow-light.svg new file mode 100644 index 000000000..755cc0cff --- /dev/null +++ b/public/images/assets/evm-relayer-flow-light.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/evm-relayer-flow.svg b/public/images/assets/evm-relayer-flow.svg new file mode 100644 index 000000000..2d93a5360 --- /dev/null +++ b/public/images/assets/evm-relayer-flow.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/express-light.svg b/public/images/assets/express-light.svg new file mode 100644 index 000000000..76fabc60e --- /dev/null +++ b/public/images/assets/express-light.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/express.svg b/public/images/assets/express.svg new file mode 100644 index 000000000..59a22ef67 --- /dev/null +++ b/public/images/assets/express.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/fpi.png b/public/images/assets/fpi.png new file mode 100755 index 000000000..6b7a044be Binary files /dev/null and b/public/images/assets/fpi.png differ diff --git a/public/images/assets/fpi.svg b/public/images/assets/fpi.svg new file mode 100755 index 000000000..ee02c74f7 --- /dev/null +++ b/public/images/assets/fpi.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + diff --git a/public/images/assets/fxs.png b/public/images/assets/fxs.png new file mode 100755 index 000000000..1c0f8239c Binary files /dev/null and b/public/images/assets/fxs.png differ diff --git a/public/images/assets/fxs.svg b/public/images/assets/fxs.svg new file mode 100755 index 000000000..62fd4e7fa --- /dev/null +++ b/public/images/assets/fxs.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + diff --git a/public/images/assets/general-message-overview-light.svg b/public/images/assets/general-message-overview-light.svg new file mode 100644 index 000000000..4f16b5639 --- /dev/null +++ b/public/images/assets/general-message-overview-light.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/general-message-overview.svg b/public/images/assets/general-message-overview.svg new file mode 100644 index 000000000..d0312e99b --- /dev/null +++ b/public/images/assets/general-message-overview.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/huahua.png b/public/images/assets/huahua.png new file mode 100644 index 000000000..ca597c812 Binary files /dev/null and b/public/images/assets/huahua.png differ diff --git a/public/images/assets/huahua.svg b/public/images/assets/huahua.svg new file mode 100644 index 000000000..73ba4ad46 --- /dev/null +++ b/public/images/assets/huahua.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/assets/islm.svg b/public/images/assets/islm.svg new file mode 100644 index 000000000..d20d983d8 --- /dev/null +++ b/public/images/assets/islm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/images/assets/lava.svg b/public/images/assets/lava.svg new file mode 100644 index 000000000..be8b33179 --- /dev/null +++ b/public/images/assets/lava.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/images/assets/lvn.svg b/public/images/assets/lvn.svg new file mode 100644 index 000000000..60ed4f85b --- /dev/null +++ b/public/images/assets/lvn.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/assets/mee.svg b/public/images/assets/mee.svg new file mode 100644 index 000000000..5ae191794 --- /dev/null +++ b/public/images/assets/mee.svg @@ -0,0 +1,871 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/assets/metal.svg b/public/images/assets/metal.svg new file mode 100644 index 000000000..acd9cf90f --- /dev/null +++ b/public/images/assets/metal.svg @@ -0,0 +1 @@ +MTL_Token300 \ No newline at end of file diff --git a/public/images/assets/milktia.svg b/public/images/assets/milktia.svg new file mode 100644 index 000000000..f711e9f68 --- /dev/null +++ b/public/images/assets/milktia.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/images/assets/move.png b/public/images/assets/move.png new file mode 100644 index 000000000..99ce4cae3 Binary files /dev/null and b/public/images/assets/move.png differ diff --git a/public/images/assets/move.svg b/public/images/assets/move.svg new file mode 100644 index 000000000..8c38e5500 --- /dev/null +++ b/public/images/assets/move.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/assets/network-flow-light.svg b/public/images/assets/network-flow-light.svg new file mode 100644 index 000000000..34e9d4546 --- /dev/null +++ b/public/images/assets/network-flow-light.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/network-flow.svg b/public/images/assets/network-flow.svg new file mode 100644 index 000000000..25bf7e160 --- /dev/null +++ b/public/images/assets/network-flow.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/nftl.png b/public/images/assets/nftl.png new file mode 100644 index 000000000..9b828f975 Binary files /dev/null and b/public/images/assets/nftl.png differ diff --git a/public/images/assets/nftl.svg b/public/images/assets/nftl.svg new file mode 100644 index 000000000..eef981b97 --- /dev/null +++ b/public/images/assets/nftl.svg @@ -0,0 +1,36 @@ + + + + + + + + + + diff --git a/public/images/assets/nls.svg b/public/images/assets/nls.svg new file mode 100644 index 000000000..dc04c02f5 --- /dev/null +++ b/public/images/assets/nls.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/assets/nolus.svg b/public/images/assets/nolus.svg new file mode 100644 index 000000000..a1b79ed88 --- /dev/null +++ b/public/images/assets/nolus.svg @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/public/images/assets/ntrn.svg b/public/images/assets/ntrn.svg new file mode 100644 index 000000000..7ae7e86cc --- /dev/null +++ b/public/images/assets/ntrn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/images/assets/om.svg b/public/images/assets/om.svg new file mode 100644 index 000000000..574656b89 --- /dev/null +++ b/public/images/assets/om.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/assets/op.png b/public/images/assets/op.png new file mode 100644 index 000000000..cd81f362c Binary files /dev/null and b/public/images/assets/op.png differ diff --git a/public/images/assets/op.svg b/public/images/assets/op.svg new file mode 100644 index 000000000..2e5ce3103 --- /dev/null +++ b/public/images/assets/op.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/assets/ox.png b/public/images/assets/ox.png new file mode 100644 index 000000000..79bae10de Binary files /dev/null and b/public/images/assets/ox.png differ diff --git a/public/images/assets/ox.svg b/public/images/assets/ox.svg new file mode 100644 index 000000000..d7213f9b5 --- /dev/null +++ b/public/images/assets/ox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/assets/saga.png b/public/images/assets/saga.png new file mode 100644 index 000000000..f653d075b Binary files /dev/null and b/public/images/assets/saga.png differ diff --git a/public/images/assets/saga.svg b/public/images/assets/saga.svg new file mode 100644 index 000000000..1d76fc7c2 --- /dev/null +++ b/public/images/assets/saga.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/assets/scrt.svg b/public/images/assets/scrt.svg new file mode 100644 index 000000000..02f9b9058 --- /dev/null +++ b/public/images/assets/scrt.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/images/assets/seilor.svg b/public/images/assets/seilor.svg new file mode 100644 index 000000000..76de19844 --- /dev/null +++ b/public/images/assets/seilor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/assets/stars.svg b/public/images/assets/stars.svg new file mode 100644 index 000000000..aac32423e --- /dev/null +++ b/public/images/assets/stars.svg @@ -0,0 +1,9 @@ + + + Shape + + + + + + \ No newline at end of file diff --git a/public/images/assets/sttia.svg b/public/images/assets/sttia.svg new file mode 100644 index 000000000..10bd37de9 --- /dev/null +++ b/public/images/assets/sttia.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/assets/tori.png b/public/images/assets/tori.png new file mode 100644 index 000000000..a9e9c69be Binary files /dev/null and b/public/images/assets/tori.png differ diff --git a/public/images/assets/tori.svg b/public/images/assets/tori.svg new file mode 100644 index 000000000..f44cc70a4 --- /dev/null +++ b/public/images/assets/tori.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/assets/usdy.png b/public/images/assets/usdy.png new file mode 100644 index 000000000..010d70648 Binary files /dev/null and b/public/images/assets/usdy.png differ diff --git a/public/images/assets/usdy.svg b/public/images/assets/usdy.svg new file mode 100644 index 000000000..f8733a9c5 --- /dev/null +++ b/public/images/assets/usdy.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/images/assets/usk.png b/public/images/assets/usk.png new file mode 100644 index 000000000..f62a277dd Binary files /dev/null and b/public/images/assets/usk.png differ diff --git a/public/images/assets/usk.svg b/public/images/assets/usk.svg new file mode 100644 index 000000000..fab66155d --- /dev/null +++ b/public/images/assets/usk.svg @@ -0,0 +1,18 @@ + + + usk + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/verifier-light.svg b/public/images/assets/verifier-light.svg new file mode 100644 index 000000000..b4dd1b83b --- /dev/null +++ b/public/images/assets/verifier-light.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/verifier.svg b/public/images/assets/verifier.svg new file mode 100644 index 000000000..4e03866c7 --- /dev/null +++ b/public/images/assets/verifier.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/voting-flow-light.svg b/public/images/assets/voting-flow-light.svg new file mode 100644 index 000000000..7b699167f --- /dev/null +++ b/public/images/assets/voting-flow-light.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/voting-flow.svg b/public/images/assets/voting-flow.svg new file mode 100644 index 000000000..8a2eea8a5 --- /dev/null +++ b/public/images/assets/voting-flow.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/assets/wmnt.svg b/public/images/assets/wmnt.svg new file mode 100644 index 000000000..e1ee4cb90 --- /dev/null +++ b/public/images/assets/wmnt.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/assets/xion.svg b/public/images/assets/xion.svg new file mode 100644 index 000000000..c388d021e --- /dev/null +++ b/public/images/assets/xion.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/assets/xprt.png b/public/images/assets/xprt.png new file mode 100644 index 000000000..0d65d4609 Binary files /dev/null and b/public/images/assets/xprt.png differ diff --git a/public/images/assets/xprt.svg b/public/images/assets/xprt.svg new file mode 100644 index 000000000..124730d6b --- /dev/null +++ b/public/images/assets/xprt.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/images/assets/yum.svg b/public/images/assets/yum.svg new file mode 100644 index 000000000..91dfcc194 --- /dev/null +++ b/public/images/assets/yum.svg @@ -0,0 +1,526 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/axelar-mds-diagram.jpg b/public/images/axelar-mds-diagram.jpg new file mode 100644 index 000000000..e44f64fdf Binary files /dev/null and b/public/images/axelar-mds-diagram.jpg differ diff --git a/public/images/chains/babylon.svg b/public/images/chains/babylon.svg new file mode 100644 index 000000000..e8942d12b --- /dev/null +++ b/public/images/chains/babylon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/chains/blast.svg b/public/images/chains/blast.svg new file mode 100644 index 000000000..2a8931494 --- /dev/null +++ b/public/images/chains/blast.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/chains/chain4energy.png b/public/images/chains/chain4energy.png new file mode 100644 index 000000000..b0e03c208 Binary files /dev/null and b/public/images/chains/chain4energy.png differ diff --git a/public/images/chains/chain4energy.svg b/public/images/chains/chain4energy.svg new file mode 100644 index 000000000..a3c0c3078 --- /dev/null +++ b/public/images/chains/chain4energy.svg @@ -0,0 +1,1999 @@ + + + + diff --git a/public/images/chains/chihuahua.png b/public/images/chains/chihuahua.png new file mode 100644 index 000000000..ca597c812 Binary files /dev/null and b/public/images/chains/chihuahua.png differ diff --git a/public/images/chains/chihuahua.svg b/public/images/chains/chihuahua.svg new file mode 100644 index 000000000..73ba4ad46 --- /dev/null +++ b/public/images/chains/chihuahua.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/chains/dymension.svg b/public/images/chains/dymension.svg new file mode 100644 index 000000000..d13c50d84 --- /dev/null +++ b/public/images/chains/dymension.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/chains/flow.png b/public/images/chains/flow.png new file mode 100644 index 000000000..eea57abf6 Binary files /dev/null and b/public/images/chains/flow.png differ diff --git a/public/images/chains/flow.svg b/public/images/chains/flow.svg new file mode 100644 index 000000000..88d400ba7 --- /dev/null +++ b/public/images/chains/flow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/chains/fraxtal.svg b/public/images/chains/fraxtal.svg new file mode 100644 index 000000000..880a40b5d --- /dev/null +++ b/public/images/chains/fraxtal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/chains/fxcore.svg b/public/images/chains/fxcore.svg new file mode 100644 index 000000000..6aa15a409 --- /dev/null +++ b/public/images/chains/fxcore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/chains/lava.svg b/public/images/chains/lava.svg new file mode 100644 index 000000000..be8b33179 --- /dev/null +++ b/public/images/chains/lava.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/images/chains/mantra.svg b/public/images/chains/mantra.svg new file mode 100644 index 000000000..15a2d9811 --- /dev/null +++ b/public/images/chains/mantra.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/public/images/chains/moonbase.png b/public/images/chains/moonbase.png index 4e15a2a6e..42ed211bc 100644 Binary files a/public/images/chains/moonbase.png and b/public/images/chains/moonbase.png differ diff --git a/public/images/chains/moonbeam.png b/public/images/chains/moonbeam.png index f391954fe..42ed211bc 100644 Binary files a/public/images/chains/moonbeam.png and b/public/images/chains/moonbeam.png differ diff --git a/public/images/chains/moonbeam.svg b/public/images/chains/moonbeam.svg index 4869c7741..de27d9a1f 100644 --- a/public/images/chains/moonbeam.svg +++ b/public/images/chains/moonbeam.svg @@ -1,6 +1,13 @@ - - - - - - \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/public/images/chains/nibiru.svg b/public/images/chains/nibiru.svg new file mode 100644 index 000000000..0dc977565 --- /dev/null +++ b/public/images/chains/nibiru.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/images/chains/nillion.png b/public/images/chains/nillion.png new file mode 100644 index 000000000..a79e4dd6d Binary files /dev/null and b/public/images/chains/nillion.png differ diff --git a/public/images/chains/nillion.svg b/public/images/chains/nillion.svg new file mode 100644 index 000000000..3190bcdd1 --- /dev/null +++ b/public/images/chains/nillion.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/chains/sui.jpg b/public/images/chains/sui.jpg new file mode 100644 index 000000000..991be743a Binary files /dev/null and b/public/images/chains/sui.jpg differ diff --git a/public/images/chains/warden.png b/public/images/chains/warden.png new file mode 100644 index 000000000..4e4768f25 Binary files /dev/null and b/public/images/chains/warden.png differ diff --git a/public/images/chains/warden.svg b/public/images/chains/warden.svg new file mode 100644 index 000000000..f3d0807a0 --- /dev/null +++ b/public/images/chains/warden.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/cosmos/click-transact.png b/public/images/cosmos/click-transact.png new file mode 100644 index 000000000..0d6989f58 Binary files /dev/null and b/public/images/cosmos/click-transact.png differ diff --git a/public/images/cosmos/compile-contract.png b/public/images/cosmos/compile-contract.png new file mode 100644 index 000000000..a9854109f Binary files /dev/null and b/public/images/cosmos/compile-contract.png differ diff --git a/public/images/cosmos/contract-address.png b/public/images/cosmos/contract-address.png new file mode 100644 index 000000000..26ecfadda Binary files /dev/null and b/public/images/cosmos/contract-address.png differ diff --git a/public/images/cosmos/copy-address.png b/public/images/cosmos/copy-address.png new file mode 100644 index 000000000..96e8c16a6 Binary files /dev/null and b/public/images/cosmos/copy-address.png differ diff --git a/public/images/cosmos/deploy-contract.png b/public/images/cosmos/deploy-contract.png new file mode 100644 index 000000000..72bf5c77e Binary files /dev/null and b/public/images/cosmos/deploy-contract.png differ diff --git a/public/images/cosmos/insert-gas.png b/public/images/cosmos/insert-gas.png new file mode 100644 index 000000000..a276ea379 Binary files /dev/null and b/public/images/cosmos/insert-gas.png differ diff --git a/public/images/cosmos/read-message-from-evm.png b/public/images/cosmos/read-message-from-evm.png new file mode 100644 index 000000000..c19be9403 Binary files /dev/null and b/public/images/cosmos/read-message-from-evm.png differ diff --git a/public/images/cosmos/transact.png b/public/images/cosmos/transact.png new file mode 100644 index 000000000..ab9f88c69 Binary files /dev/null and b/public/images/cosmos/transact.png differ diff --git a/public/images/evm-relayer-flow.png b/public/images/evm-relayer-flow.png new file mode 100644 index 000000000..b3c8d1cad Binary files /dev/null and b/public/images/evm-relayer-flow.png differ diff --git a/public/images/ext-flow-port-stake-pending.png b/public/images/ext-flow-port-stake-pending.png new file mode 100644 index 000000000..12dc3deaf Binary files /dev/null and b/public/images/ext-flow-port-stake-pending.png differ diff --git a/public/images/icon-search-dark.svg b/public/images/icon-search-dark.svg new file mode 100644 index 000000000..45ab97b73 --- /dev/null +++ b/public/images/icon-search-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/icon-search-light.svg b/public/images/icon-search-light.svg new file mode 100644 index 000000000..b1d05b09d --- /dev/null +++ b/public/images/icon-search-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/intent-diagram.png b/public/images/intent-diagram.png new file mode 100644 index 000000000..d82539ed5 Binary files /dev/null and b/public/images/intent-diagram.png differ diff --git a/public/images/its-deployment-diagram-light.svg b/public/images/its-deployment-diagram-light.svg new file mode 100644 index 000000000..b5fac6bb6 --- /dev/null +++ b/public/images/its-deployment-diagram-light.svg @@ -0,0 +1,468 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + target="_blank" + + + target="_blank" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/its-deployment-diagram.svg b/public/images/its-deployment-diagram.svg new file mode 100644 index 000000000..32933a2c4 --- /dev/null +++ b/public/images/its-deployment-diagram.svg @@ -0,0 +1,470 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/its-hub/amplifier-to-its-dark.svg b/public/images/its-hub/amplifier-to-its-dark.svg new file mode 100644 index 000000000..2b7508449 --- /dev/null +++ b/public/images/its-hub/amplifier-to-its-dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/its-hub/amplifier-to-its-light.svg b/public/images/its-hub/amplifier-to-its-light.svg new file mode 100644 index 000000000..216413333 --- /dev/null +++ b/public/images/its-hub/amplifier-to-its-light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/its-hub/consensus-to-its-dark.svg b/public/images/its-hub/consensus-to-its-dark.svg new file mode 100644 index 000000000..8f94decfb --- /dev/null +++ b/public/images/its-hub/consensus-to-its-dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/its-hub/consensus-to-its-light.svg b/public/images/its-hub/consensus-to-its-light.svg new file mode 100644 index 000000000..a1c06dc7c --- /dev/null +++ b/public/images/its-hub/consensus-to-its-light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/its-hub/its-hub-routing-dark.svg b/public/images/its-hub/its-hub-routing-dark.svg new file mode 100644 index 000000000..ab66b9850 --- /dev/null +++ b/public/images/its-hub/its-hub-routing-dark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/images/its-hub/its-hub-routing-light.svg b/public/images/its-hub/its-hub-routing-light.svg new file mode 100644 index 000000000..a4a925344 --- /dev/null +++ b/public/images/its-hub/its-hub-routing-light.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/images/its-hub/its-to-amplifier-dark.svg b/public/images/its-hub/its-to-amplifier-dark.svg new file mode 100644 index 000000000..781f02f67 --- /dev/null +++ b/public/images/its-hub/its-to-amplifier-dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/its-hub/its-to-amplifier-light.svg b/public/images/its-hub/its-to-amplifier-light.svg new file mode 100644 index 000000000..1f22e4d58 --- /dev/null +++ b/public/images/its-hub/its-to-amplifier-light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/its-transfer-light.svg b/public/images/its-transfer-light.svg new file mode 100644 index 000000000..27480b120 --- /dev/null +++ b/public/images/its-transfer-light.svg @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/its-transfer.svg b/public/images/its-transfer.svg new file mode 100644 index 000000000..ac8270d9d --- /dev/null +++ b/public/images/its-transfer.svg @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/learn-security-decentralization-light.svg b/public/images/learn-security-decentralization-light.svg new file mode 100644 index 000000000..7ce51b8ec --- /dev/null +++ b/public/images/learn-security-decentralization-light.svg @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/learn-security-decentralization.svg b/public/images/learn-security-decentralization.svg new file mode 100644 index 000000000..5aa5f429c --- /dev/null +++ b/public/images/learn-security-decentralization.svg @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/learn-security-quadratic-voting-light.svg b/public/images/learn-security-quadratic-voting-light.svg new file mode 100644 index 000000000..6e37323f6 --- /dev/null +++ b/public/images/learn-security-quadratic-voting-light.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/learn-security-quadratic-voting.svg b/public/images/learn-security-quadratic-voting.svg new file mode 100644 index 000000000..c7b88c241 --- /dev/null +++ b/public/images/learn-security-quadratic-voting.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/learn-tech-stack-light.svg b/public/images/learn-tech-stack-light.svg new file mode 100644 index 000000000..b79bb17cf --- /dev/null +++ b/public/images/learn-tech-stack-light.svg @@ -0,0 +1,321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/learn-tech-stack.svg b/public/images/learn-tech-stack.svg new file mode 100644 index 000000000..0ab1ad36e --- /dev/null +++ b/public/images/learn-tech-stack.svg @@ -0,0 +1,321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/stellar/compile-contract.png b/public/images/stellar/compile-contract.png new file mode 100644 index 000000000..ce20f8d1c Binary files /dev/null and b/public/images/stellar/compile-contract.png differ diff --git a/public/images/stellar/connect-wallet.png b/public/images/stellar/connect-wallet.png new file mode 100644 index 000000000..f6eacb24b Binary files /dev/null and b/public/images/stellar/connect-wallet.png differ diff --git a/public/images/stellar/copy-evm-address.png b/public/images/stellar/copy-evm-address.png new file mode 100644 index 000000000..a23fc83a2 Binary files /dev/null and b/public/images/stellar/copy-evm-address.png differ diff --git a/public/images/stellar/deploy-contract-tab.png b/public/images/stellar/deploy-contract-tab.png new file mode 100644 index 000000000..d10e4d2dd Binary files /dev/null and b/public/images/stellar/deploy-contract-tab.png differ diff --git a/public/images/stellar/deploy-contract.png b/public/images/stellar/deploy-contract.png new file mode 100644 index 000000000..94d6a074c Binary files /dev/null and b/public/images/stellar/deploy-contract.png differ diff --git a/public/images/stellar/remix-home.png b/public/images/stellar/remix-home.png new file mode 100644 index 000000000..2abe7ba6e Binary files /dev/null and b/public/images/stellar/remix-home.png differ diff --git a/public/images/stellar/result.png b/public/images/stellar/result.png new file mode 100644 index 000000000..ee348dfc2 Binary files /dev/null and b/public/images/stellar/result.png differ diff --git a/public/images/verifier-rewards-contract-architecture.png b/public/images/verifier-rewards-contract-architecture.png new file mode 100644 index 000000000..bb18441cd Binary files /dev/null and b/public/images/verifier-rewards-contract-architecture.png differ diff --git a/public/images/verifier-rewards-signing-flow.png b/public/images/verifier-rewards-signing-flow.png new file mode 100644 index 000000000..435416747 Binary files /dev/null and b/public/images/verifier-rewards-signing-flow.png differ diff --git a/public/images/verifier-rewards-voting-flow.png b/public/images/verifier-rewards-voting-flow.png new file mode 100644 index 000000000..509a2c666 Binary files /dev/null and b/public/images/verifier-rewards-voting-flow.png differ diff --git a/public/open-graph.webp b/public/open-graph.webp new file mode 100644 index 000000000..85524d7a5 Binary files /dev/null and b/public/open-graph.webp differ diff --git a/public/robots.txt b/public/robots.txt index 605135ecf..6245d94ed 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,3 +1,4 @@ User-agent: * Allow: / -Disallow: \ No newline at end of file +Sitemap: https://docs.axelar.dev/sitemap-0.xml + diff --git a/public/samples/gmp-senderreceiver.sol b/public/samples/gmp-senderreceiver.sol index cbbf8895d..8515d5814 100644 --- a/public/samples/gmp-senderreceiver.sol +++ b/public/samples/gmp-senderreceiver.sol @@ -26,10 +26,11 @@ contract SenderReceiver is AxelarExecutable { msg.sender ); - gateway.callContract(destinationChain,destinationAddress,payload); + gateway().callContract(destinationChain,destinationAddress,payload); } function _execute( + bytes32 commandId, string calldata sourceChain, string calldata sourceAddress, bytes calldata payload_ diff --git a/public/samples/interchain-token-custom.sol b/public/samples/interchain-token-custom.sol index f33f86c2b..54cb3bee7 100644 --- a/public/samples/interchain-token-custom.sol +++ b/public/samples/interchain-token-custom.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -// more suited than OZ ERC20 for proxying because it doesn't require constructor parameters +// more suited than OZ ERC-20 for proxying because it doesn't require constructor parameters import {ERC20} from "@axelar-network/interchain-token-service/contracts/token-implementations/ERC20.sol"; import {IERC20BurnableMintable} from "@axelar-network/interchain-token-service/interfaces/IERC20BurnableMintable.sol"; diff --git a/public/samples/interchain-token-iinterchaintoken.sol b/public/samples/interchain-token-iinterchaintoken.sol index b69d4c507..3c231f8b9 100644 --- a/public/samples/interchain-token-iinterchaintoken.sol +++ b/public/samples/interchain-token-iinterchaintoken.sol @@ -3,11 +3,12 @@ pragma solidity ^0.8.0; import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; import {ITokenManager} from "@axelar-network/interchain-token-service/contracts/interfaces/ITokenManager.sol"; import {ITokenManagerType} from "@axelar-network/interchain-token-service/contracts/interfaces/ITokenManagerType.sol"; import {IInterchainToken} from "@axelar-network/interchain-token-service/contracts/interfaces/IInterchainToken.sol"; import {IInterchainTokenService} from "@axelar-network/interchain-token-service/contracts/interfaces/IInterchainTokenService.sol"; -import {AddressBytesUtils} from "@axelar-network/interchain-token-service/contracts/libraries/AddressBytesUtils.sol"; +import {AddressBytes} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/libs/AddressBytes.sol"; /** * This is sample code only and has not been audited. @@ -15,45 +16,56 @@ import {AddressBytesUtils} from "@axelar-network/interchain-token-service/contra * and security of your smart contracts before using * in production. */ -contract MyInterchainToken is ERC20, Ownable { - using AddressBytesUtils for address; +contract MyInterchainToken is ERC20, AccessControl { + using AddressBytes for address; + + address public creator; + bytes32 public tokenId; + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); ITokenManager public tokenManager; IInterchainTokenService public service = - IInterchainTokenService(0xF786e21509A9D50a9aFD033B5940A2b7D872C208); - - address public creator; + IInterchainTokenService(0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C); constructor() ERC20("MyInterchainToken", "MITKN") { // Mint 1,000 tokens to the creator creator = msg.sender; _mint(creator, 1000 * 10**18); + _grantRole(MINTER_ROLE, msg.sender); // Register this token (could also be done 1-time smart contract invocation) - // Not a good practice beacuse it can't go to non-EVM chains + // Not a good practice because it can't go to non-EVM chains deployTokenManager(""); } - function mint(address to, uint256 amount) external onlyOwner { + function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) { _mint(to, amount); } - function burn(address from, uint256 amount) external onlyOwner { + function burn(address from, uint256 amount) external onlyRole(MINTER_ROLE) { _burn(from, amount); } function deployTokenManager(bytes32 salt) internal { - bytes memory params = service.getParamsMintBurn( + require(msg.value > 0, "Gas payment is required"); + + bytes memory params = tokenManager.params( msg.sender.toBytes(), address(this) ); - bytes32 tokenId = service.deployCustomTokenManager( + + service.deployTokenManager( salt, + "", // This field remains empty if the token manager is deployed on the local chain; however, you need to specify it when deploying on a remote chain. ITokenManagerType.TokenManagerType.MINT_BURN, - params + params, + msg.value // gasValue + ); + + tokenId = service.interchainTokenId( + msg.sender, + salt ); - tokenManager = ITokenManager(service.getTokenManagerAddress(tokenId)); - transferOwnership(address(tokenManager)); } function myCustomFunction() public { @@ -62,23 +74,21 @@ contract MyInterchainToken is ERC20, Ownable { _mint(creator, 1000 * 10**18); } - /* - * Deploy this token, then register it with the Interchain Token Service - * You'll be given a TokenManager which you can set here, allowing the - * local send methods to function. - */ - function setTokenManager(address _tokenManager) public onlyOwner { - tokenManager = ITokenManager(_tokenManager); + function transferMintership(address newMinter) public { + require(hasRole(MINTER_ROLE, msg.sender), "Caller is not a minter"); + + _revokeRole(MINTER_ROLE, msg.sender); + _grantRole(MINTER_ROLE, newMinter); } /** - * @notice Implementation of the interchainTransfer method - * @dev We chose to either pass `metadata` as raw data on a remote contract call, or, if no data is passed, just do a transfer. - * A different implementation could have `metadata` that tells this function which function to use or that it is used for anything else as well. + * @notice Implementation of the interchainTransfer method. + * @dev We chose to either pass `metadata` as raw data on a remote contract call, or if no data is passed, just do a transfer. + * A different implementation could use metadata to specify a function to invoke, or for other purposes as well. * @param destinationChain The destination chain identifier. * @param recipient The bytes representation of the address of the recipient. - * @param amount The amount of token to be transfered. - * @param metadata Either empty, to just facilitate an interchain transfer, or the data can be passed for an interchain contract call with transfer as per semantics defined by the token service. + * @param amount The amount of token to be transferred. + * @param metadata Optional metadata for the call for additional effects (such as calling a destination contract). */ function interchainTransfer( string calldata destinationChain, @@ -86,11 +96,10 @@ contract MyInterchainToken is ERC20, Ownable { uint256 amount, bytes calldata metadata ) external payable { - address sender = msg.sender; - // Metadata semantics are defined by the token service and thus should be passed as-is. - tokenManager.transmitInterchainTransfer{value: msg.value}( - sender, + service.transmitInterchainTransfer{ value: msg.value }( + tokenId, + address(this), destinationChain, recipient, amount, @@ -101,12 +110,12 @@ contract MyInterchainToken is ERC20, Ownable { /** * @notice Implementation of the interchainTransferFrom method * @dev We chose to either pass `metadata` as raw data on a remote contract call, or, if no data is passed, just do a transfer. - * A different implementation could have `metadata` that tells this function which function to use or that it is used for anything else as well. - * @param sender the sender of the tokens. They need to have approved `msg.sender` before this is called. - * @param destinationChain the string representation of the destination chain. - * @param recipient the bytes representation of the address of the recipient. - * @param amount the amount of token to be transfered. - * @param metadata either empty, to just facilitate a cross-chain transfer, or the data to be passed to a cross-chain contract call and transfer. + * A different implementation could use metadata to specify a function to invoke, or for other purposes as well. + * @param sender The sender of the tokens. They need to have approved `msg.sender` before this is called. + * @param destinationChain The string representation of the destination chain. + * @param recipient The bytes representation of the address of the recipient. + * @param amount The amount of token to be transferred. + * @param metadata Optional metadata for the call for additional effects (such as calling a destination contract.) */ function interchainTransferFrom( address sender, @@ -121,8 +130,9 @@ contract MyInterchainToken is ERC20, Ownable { _approve(sender, msg.sender, _allowance - amount); } - tokenManager.transmitInterchainTransfer{value: msg.value}( - sender, + service.transmitInterchainTransfer{ value: msg.value }( + tokenId, + address(this), destinationChain, recipient, amount, diff --git a/public/samples/on-chain-gas-estimate.sol b/public/samples/on-chain-gas-estimate.sol new file mode 100644 index 000000000..cc6354e1f --- /dev/null +++ b/public/samples/on-chain-gas-estimate.sol @@ -0,0 +1,62 @@ +pragma solidity ^0.8.12; + +import { AxelarExecutable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol'; +import { IAxelarGateway } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol'; +import { IAxelarGasService } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol'; +import { IInterchainGasEstimation } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IInterchainGasEstimation.sol'; + + +contract SenderReceiver is AxelarExecutable { + IAxelarGasService public immutable gasService; + IInterchainGasEstimation public immutable estimator; + string public message; + + constructor(address gateway_, address gasService_) AxelarExecutable(gateway_) { + gasService = IAxelarGasService(gasService_); + estimator = IInterchainGasEstimation(gasService_); + } + + function sendMessage( + string calldata destinationChain, + string calldata destinationAddress, + string calldata message_ + ) external payable { + bytes memory payload = abi.encode(message_); + + uint256 estimate = estimator.estimateGasFee(destinationChain, destinationAddress, payload, 200000, ''); + + + gasService.payGas{value: estimate} ( + address(this), + destinationChain, + destinationAddress, + payload, + 200000, + true, + msg.sender, + '' + ); + + uint256 refund = msg.value - estimate; + payable(msg.sender).transfer(refund); + + gateway.callContract(destinationChain,destinationAddress,payload); + } + + function _execute( + bytes32 commandId, + string calldata sourceChain, + string calldata sourceAddress, + bytes calldata payload_ + ) internal override { + message = abi.decode(payload_, (string)); + } + + function getEstimate( + string calldata destinationChain, + string calldata destinationAddress, + string calldata message_) external view returns (uint256) { + bytes memory payload = abi.encode(message_); + return estimator.estimateGasFee(destinationChain, destinationAddress, payload, 200000, ''); + } +} \ No newline at end of file diff --git a/public/styles/prism.css b/public/styles/prism.css index 2f9d01e10..59abfef80 100644 --- a/public/styles/prism.css +++ b/public/styles/prism.css @@ -1,4 +1,199 @@ /* PrismJS 1.29.0 -https://prismjs.com/download.html#themes=prism-twilight&languages=markup+css+clike+javascript+bash+json+json5+solidity+typescript&plugins=show-language+toolbar+copy-to-clipboard */ -code[class*=language-],pre[class*=language-]{color:#fff;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;text-shadow:0 -.1em .2em #000;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}:not(pre)>code[class*=language-],pre[class*=language-]{background:#141414}pre[class*=language-]{border-radius:.5em;border:.3em solid #545454;box-shadow:1px 1px .5em #000 inset;margin:.5em 0;overflow:auto;padding:1em}pre[class*=language-]::-moz-selection{background:#27292a}pre[class*=language-]::selection{background:#27292a}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:hsla(0,0%,93%,.15)}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:hsla(0,0%,93%,.15)}:not(pre)>code[class*=language-]{border-radius:.3em;border:.13em solid #545454;box-shadow:1px 1px .3em -.1em #000 inset;padding:.15em .2em .05em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#777}.token.punctuation{opacity:.7}.token.namespace{opacity:.7}.token.boolean,.token.deleted,.token.number,.token.tag{color:#ce6849}.token.builtin,.token.constant,.token.keyword,.token.property,.token.selector,.token.symbol{color:#f9ed99}.language-css .token.string,.style .token.string,.token.attr-name,.token.attr-value,.token.char,.token.entity,.token.inserted,.token.operator,.token.string,.token.url,.token.variable{color:#909e6a}.token.atrule{color:#7385a5}.token.important,.token.regex{color:#e8c062}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.language-markup .token.attr-name,.language-markup .token.punctuation,.language-markup .token.tag{color:#ac885c}.token{position:relative;z-index:1}.line-highlight.line-highlight{background:hsla(0,0%,33%,.25);background:linear-gradient(to right,hsla(0,0%,33%,.1) 70%,hsla(0,0%,33%,0));border-bottom:1px dashed #545454;border-top:1px dashed #545454;margin-top:.75em;z-index:0}.line-highlight.line-highlight:before,.line-highlight.line-highlight[data-end]:after{background-color:#8693a6;color:#f4f1ef} -div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none} \ No newline at end of file +https://prismjs.com/download.html#themes=prism-twilight&languages=markup+css+clike+javascript+bash+go+rust+solidity+typescript&plugins=show-language+toolbar+copy-to-clipboard */ +code[class*="language-"], +pre[class*="language-"] { + color: #fff; + background: 0 0; + font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; + font-size: 1em; + text-align: left; + text-shadow: 0 -0.1em 0.2em #000; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #141414; +} +pre[class*="language-"] { + border-radius: 0.5em; + border: 0.3em solid #545454; + box-shadow: 1px 1px 0.5em #000 inset; + margin: 0.5em 0; + overflow: auto; + padding: 1em; +} +pre[class*="language-"]::-moz-selection { + background: #27292a; +} +pre[class*="language-"]::selection { + background: #27292a; +} +code[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +pre[class*="language-"]::-moz-selection { + text-shadow: none; + background: hsla(0, 0%, 93%, 0.15); +} +code[class*="language-"] ::selection, +code[class*="language-"]::selection, +pre[class*="language-"] ::selection, +pre[class*="language-"]::selection { + text-shadow: none; + background: hsla(0, 0%, 93%, 0.15); +} +:not(pre) > code[class*="language-"] { + border-radius: 0.3em; + border: 0.13em solid #545454; + box-shadow: 1px 1px 0.3em -0.1em #000 inset; + padding: 0.15em 0.2em 0.05em; + white-space: normal; +} +.token.cdata, +.token.comment, +.token.doctype, +.token.prolog { + color: #777; +} +.token.punctuation { + opacity: 0.7; +} +.token.namespace { + opacity: 0.7; +} +.token.boolean, +.token.deleted, +.token.number, +.token.tag { + color: #ce6849; +} +.token.builtin, +.token.constant, +.token.keyword, +.token.property, +.token.selector, +.token.symbol { + color: #f9ed99; +} +.language-css .token.string, +.style .token.string, +.token.attr-name, +.token.attr-value, +.token.char, +.token.entity, +.token.inserted, +.token.operator, +.token.string, +.token.url, +.token.variable { + color: #909e6a; +} +.token.atrule { + color: #7385a5; +} +.token.important, +.token.regex { + color: #e8c062; +} +.token.bold, +.token.important { + font-weight: 700; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +.language-markup .token.attr-name, +.language-markup .token.punctuation, +.language-markup .token.tag { + color: #ac885c; +} +.token { + position: relative; + z-index: 1; +} +.line-highlight.line-highlight { + background: hsla(0, 0%, 33%, 0.25); + background: linear-gradient( + to right, + hsla(0, 0%, 33%, 0.1) 70%, + hsla(0, 0%, 33%, 0) + ); + border-bottom: 1px dashed #545454; + border-top: 1px dashed #545454; + margin-top: 0.75em; + z-index: 0; +} +.line-highlight.line-highlight:before, +.line-highlight.line-highlight[data-end]:after { + background-color: #8693a6; + color: #f4f1ef; +} +div.code-toolbar { + position: relative; +} +div.code-toolbar > .toolbar { + position: absolute; + z-index: 10; + top: 0.3em; + right: 0.2em; + transition: opacity 0.3s ease-in-out; + opacity: 0; +} +div.code-toolbar:hover > .toolbar { + opacity: 1; +} +div.code-toolbar:focus-within > .toolbar { + opacity: 1; +} +div.code-toolbar > .toolbar > .toolbar-item { + display: inline-block; +} +div.code-toolbar > .toolbar > .toolbar-item > a { + cursor: pointer; +} +div.code-toolbar > .toolbar > .toolbar-item > button { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + padding: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} +div.code-toolbar > .toolbar > .toolbar-item > a, +div.code-toolbar > .toolbar > .toolbar-item > button, +div.code-toolbar > .toolbar > .toolbar-item > span { + color: #bbb; + font-size: 0.8em; + padding: 0 0.5em; + background: #f5f2f0; + background: rgba(224, 224, 224, 0.2); + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); + border-radius: 0.5em; +} +div.code-toolbar > .toolbar > .toolbar-item > a:focus, +div.code-toolbar > .toolbar > .toolbar-item > a:hover, +div.code-toolbar > .toolbar > .toolbar-item > button:focus, +div.code-toolbar > .toolbar > .toolbar-item > button:hover, +div.code-toolbar > .toolbar > .toolbar-item > span:focus, +div.code-toolbar > .toolbar > .toolbar-item > span:hover { + color: inherit; + text-decoration: none; +} diff --git a/src/components/callout.tsx b/src/components/callout.tsx index 6bcb8d6e4..8497c74a1 100644 --- a/src/components/callout.tsx +++ b/src/components/callout.tsx @@ -1,15 +1,34 @@ -import React from 'react' +import clsx from "clsx"; interface CalloutProps { - children: any; - type: ''|'warning'|'error'; - emoji?: string; -}; + children: any; + type: "" | "warning" | "error"; + emoji?: string; + render?: "md" | "html"; + longConent?: boolean; +} // https://www.notion.so/Callout-blocks-5b2638247b54447eb2e21145f97194b0 -export const Callout = ({ children, type = 'warning', emoji = '💡' }:CalloutProps) => { - - return
-
{emoji}
-
{children}
-
-} \ No newline at end of file +export const Callout = ({ + children, + type = "warning", + emoji = "💡", + render = "html", + longConent = false, +}: CalloutProps) => { + return ( +
+
{emoji}
+
+

{emoji}

+
p]:my-0 ")}> + {children} +
+
+
+ ); +}; diff --git a/src/components/chainlist.jsx b/src/components/chainlist.jsx index b19ab7440..6eece6075 100644 --- a/src/components/chainlist.jsx +++ b/src/components/chainlist.jsx @@ -1,44 +1,125 @@ -import { useState, useEffect } from 'react' +import { useState, useEffect, useMemo } from "react"; +import { + mainnet as mainnetEvmMetadata, + testnet as testnetEvmMetadata, +} from "../../src/data/evm_chains.json"; +import { + mainnet as mainnetCosmosMetadata, + testnet as testnetCosmosMetadata, +} from "../../src/data/cosmos_chains.json"; +import AddKeplr from "./keplr"; + +function ChainListRow({ chainId, name, identifier, environment }) { + return ( + + {identifier} + {name} + {chainId} + + + + + ); +} + +const createChainIndex = (chains) => { + const index = new Map(); + for (const chain of chains) { + if (index.has(chain.chain_id)) { + console.error(`duplicate chain ${chain.chain_id}. Removing to be safe`); + index.delete(chain.chain_id); + } + index.set(chain.network_id, chain); + } + return index; +}; export default ({ environment }) => { + const chainIndex = useMemo(() => { + switch (environment) { + case `mainnet`: + return createChainIndex([ + ...mainnetEvmMetadata, + ...mainnetCosmosMetadata, + ]); + case `testnet`: + return createChainIndex([ + ...testnetEvmMetadata, + ...testnetCosmosMetadata, + ]); + default: + console.error(`invalid environment ${environment}`); + return null; + } + }, [environment]); - const [fetching, setFetching] = useState(false) - const [response, setResponse] = useState(null) - const [error, setError] = useState(null) + const [fetching, setFetching] = useState(false); + const [response, setResponse] = useState(null); + const [error, setError] = useState(null); useEffect(() => { if (!response) request(); - }, [response]) + }, [response]); const request = async () => { - - setFetching(true) - - const endpoint_url = environment === `testnet` - ? `https://lcd-axelar-testnet.imperator.co/axelar/nexus/v1beta1/chains?status=1` + setFetching(true); + + const endpoint_url = + environment === `testnet` + ? `https://lcd-axelar-testnet.imperator.co/axelar/nexus/v1beta1/chains?status=1` : `https://lcd-axelar.imperator.co/axelar/nexus/v1beta1/chains?status=1`; fetch(endpoint_url) - .then(data => data.json()) - .then(chains => setResponse(chains)) - .catch(error => setError(true)) - .finally(() => setFetching(false)) + .then((data) => data.json()) + .then((chains) => setResponse(chains)) + .catch((error) => setError(true)) + .finally(() => setFetching(false)); + }; - } + const tableRowData = useMemo(() => { + if (!response) return null; + return response.chains.map((chainIdentifier, idx) => { + const chainData = chainIndex.get(chainIdentifier); + if (!chainData) { + console.error(`chain ${chainIdentifier} not found in chain index`); + return null; + } - if (fetching) - return
- Fetching active chains... -
+ return ( + + ); + }); + }, [response, environment]); + + if (fetching) + return
Fetching active chains...
; - if (error) - return
+ if (error) + return ( +
Error loading chains. Please refresh this page. -
- +
+ ); + return (
- {response && response.chains && response.chains.map(chain =>
* {chain}
)} + + + + + + + + + + {tableRowData} +
Chain IdentifierChain NameChain ID (EVM)Add Chain
- ) -} \ No newline at end of file + ); +}; diff --git a/src/components/copy.jsx b/src/components/copy.jsx index e2d6ebfff..f3fb54cc2 100644 --- a/src/components/copy.jsx +++ b/src/components/copy.jsx @@ -1,5 +1,5 @@ import { useState, useEffect } from "react"; -import CopyToClipboard from 'react-copy-to-clipboard'; +import CopyToClipboard from "react-copy-to-clipboard"; export default ({ size = 18, value, title, onCopy, className = "" }) => { const [copied, setCopied] = useState(false); @@ -13,9 +13,22 @@ export default ({ size = 18, value, title, onCopy, className = "" }) => { }, [copied]); return copied ? ( -
+
{title && {title}} - check-circle + + check-circle + +
) : ( { }} >
{title && {title}} - content-copy + + content-copy + +
); diff --git a/src/components/docs/Search.tsx b/src/components/docs/Search.tsx new file mode 100644 index 000000000..13b209390 --- /dev/null +++ b/src/components/docs/Search.tsx @@ -0,0 +1,22 @@ +import "@docsearch/css"; +import { DocSearch } from "@docsearch/react"; +import "../../styles/global.css"; +const Search = () => { + return ( + ( + + {children} + + )} + /> + ); +}; + +export default Search; diff --git a/src/components/docs/table-of-contents.tsx b/src/components/docs/table-of-contents.tsx new file mode 100644 index 000000000..4690eb3d4 --- /dev/null +++ b/src/components/docs/table-of-contents.tsx @@ -0,0 +1,107 @@ +import type { TocItem } from "@/lib/generateToc"; +import clsx from "clsx"; +import { useEffect, useState } from "react"; + +interface Props { + toc: TocItem[]; + labels: { + onThisPage: string; + }; +} + +const TableOfContents = ({ toc = [], labels }: Props) => { + const [currentHeading, setCurrentHeading] = useState({ + slug: toc[0].slug, + text: toc[0].text, + }); + + useEffect(() => {}, [currentHeading]); + + const onThisPageID = "on-this-page-heading"; + + useEffect(() => { + const setCurrent: IntersectionObserverCallback = (entries) => { + for (const entry of entries) { + if (entry.isIntersecting) { + const { id } = entry.target; + if (id === onThisPageID) continue; + + setCurrentHeading({ + slug: entry.target.id, + text: entry.target.textContent || "", + }); + break; + } + } + }; + + const observerOptions: IntersectionObserverInit = { + rootMargin: "-100px 0% -66%", + threshold: 1, + }; + + const headingsObserver = new IntersectionObserver( + setCurrent, + observerOptions, + ); + + document + .querySelectorAll("article :is(h1,h2, h3)") + .forEach((h) => headingsObserver.observe(h)); + + return () => headingsObserver.disconnect(); + }, []); + + const onLinkClick = (e: any) => { + setCurrentHeading({ + slug: e.currentTarget.getAttribute("href")!.replace("#", ""), + text: e.currentTarget.textContent || "", + }); + }; + + const TableOfContentsItem = ({ heading }: { heading: TocItem }) => { + const { depth, slug, text, children } = heading; + + return ( +
  • + + {text} + + {children && children?.length > 0 ? ( +
      + {children.map((heading) => ( + + ))} +
    + ) : null} +
  • + ); + }; + + return ( + <> +
      + {toc.map((heading2) => ( + + ))} +
    + + ); +}; + +export default TableOfContents; diff --git a/src/components/dropdown.jsx b/src/components/dropdown.jsx index 58bc1eb43..d2db267ce 100644 --- a/src/components/dropdown.jsx +++ b/src/components/dropdown.jsx @@ -1,13 +1,14 @@ -import { Fragment, useState, useEffect } from "react"; -import _ from "lodash"; import { Menu, Transition } from "@headlessui/react"; +import _ from "lodash"; +import { Fragment, useEffect, useState } from "react"; -import { equals_ignore_case } from "../utils"; -import evm_chains from "../data/evm_chains.json"; +import { ChevronDown } from "lucide-react"; import cosmos_chains from "../data/cosmos_chains.json"; import evm_assets from "../data/evm_assets.json"; -import ibc_assets from "../data/ibc_assets.json"; +import evm_chains from "../data/evm_chains.json"; import gateways from "../data/gateways.json"; +import ibc_assets from "../data/ibc_assets.json"; +import { equals_ignore_case } from "../utils"; const data = { evm_chains, @@ -62,16 +63,16 @@ export default ({ case "chains": _options = _.concat( data.evm_chains?.[environment].filter((c) => !c?.is_staging) || [], - data.cosmos_chains?.[environment] || [] + data.cosmos_chains?.[environment] || [], ); break; case "assets": _options = _.uniqBy( _.concat( data.evm_assets?.[environment] || [], - data.ibc_assets?.[environment] || [] + data.ibc_assets?.[environment] || [], ), - "id" + "id", ); break; default: @@ -89,36 +90,38 @@ export default ({ options?.find((o) => o?.id === selectedKey) || selectedKey; return ( - + {({ open }) => ( <> -
    - - {selectedData ? ( -
    - {selectedData.image && ( - - )} - {selectedData.name} -
    - ) : selectedData === "" ? ( - {allOptionsName} - ) : ( - placeholder || "Select Options" - )} - {open ? ( - - ) : ( - - )} -
    -
    + +
    +
    +
    +
    + {selectedData ? ( +
    + {selectedData.image && ( + + )} + + {selectedData.name} + +
    + ) : selectedData === "" ? ( + {allOptionsName} + ) : ( + placeholder || "Select Options" + )} + + + + - {hasAllOptions && ( - - {({ active }) => ( -
    { - setSelectedKey(""); - if (onSelect) { - onSelect(""); - } - }} - className={`${ - active - ? "bg-gray-100 dark:bg-gray-900 text-dark dark:text-white" - : "text-gray-800 dark:text-gray-200" - } ${ - selectedKey === "" - ? "font-bold" - : active + {hasAllOptions && ( + + {({ active }) => ( +
    { + setSelectedKey(""); + if (onSelect) { + onSelect(""); + } + }} + className={`${ + active + ? "bg-gray-100 dark:bg-gray-900 text-dark dark:text-white" + : "text-gray-800 dark:text-gray-200" + } ${ + selectedKey === "" + ? "font-bold" + : active ? "font-semibold" : "font-medium" - } cursor-pointer flex items-center text-sm space-x-2 py-2 px-4`} - > - {allOptionsName} -
    - )} -
    - )} - {options?.map((o, i) => ( - - {({ active }) => ( -
    { - setSelectedKey(o.id); - if (onSelect) { - onSelect(options?.find((_o) => _o?.id === o.id)); - } - }} - className={`dropdown-menu-item ${ - active - ? "bg-gray-100 dark:bg-gray-900 text-dark dark:text-white" - : "text-gray-800 dark:text-gray-200" - } ${ - selectedKey === o.id - ? "font-bold" - : active + } cursor-pointer flex items-center text-sm space-x-2 py-2 px-4`} + > + {allOptionsName} +
    + )} +
    + )} + {options?.map((o, i) => ( + + {({ active }) => ( +
    { + setSelectedKey(o.id); + if (onSelect) { + onSelect(options?.find((_o) => _o?.id === o.id)); + } + }} + className={`dropdown-menu-item ${ + active + ? "bg-gray-100 dark:bg-gray-900 text-dark dark:text-white" + : "text-gray-800 dark:text-gray-200" + } ${ + selectedKey === o.id + ? "font-bold" + : active ? "font-semibold" : "font-medium" - } cursor-pointer flex items-center text-sm space-x-2 py-2 px-4`} - > - {o.image && ( - - )} - {o.name} -
    - )} -
    - ))} + } cursor-pointer flex items-center text-sm space-x-2 py-2 px-4`} + > + {o.image && ( + + )} + {o.name} +
    + )} +
    + ))}
    diff --git a/src/components/evm/assets.jsx b/src/components/evm/assets.jsx index d5c8d2077..7b8a590c5 100644 --- a/src/components/evm/assets.jsx +++ b/src/components/evm/assets.jsx @@ -1,18 +1,23 @@ import { useState } from "react"; +import evm_assets from "../../data/evm_assets.json"; +import evm_chains from "../../data/evm_chains.json"; +import { ellipse, equals_ignore_case } from "../../utils"; +import Copy from "../copy"; import Dropdown from "../dropdown"; import AddToken from "../web3"; -import Copy from "../copy"; -import { ellipse, equals_ignore_case } from "../../utils"; -import evm_chains from "../../data/evm_chains.json"; -import evm_assets from "../../data/evm_assets.json"; const COLUMNS = [ { id: "asset", title: "Symbol" }, { id: "chain", title: "Chain" }, { id: "denom", title: "Denom" }, { id: "contract_address", title: "Contract address" }, - { id: "add_token", title: "", headerClassName: "text-right", className: "text-right" }, + { + id: "add_token", + title: "", + headerClassName: "text-right", + className: "text-right", + }, ]; export default ({ environment = "mainnet" }) => { @@ -20,18 +25,31 @@ export default ({ environment = "mainnet" }) => { const _evm_assets = evm_assets?.[environment] || []; const [chainData, setChainData] = useState(null); - const [assetData, setAssetData] = useState(_evm_assets.find(a => a?.id === (environment === "testnet" ? "uausdc" : "uusdc"))); + const [assetData, setAssetData] = useState( + _evm_assets.find( + (a) => a?.id === (environment === "testnet" ? "uausdc" : "uusdc"), + ), + ); - const assets = _evm_assets.filter(a => !assetData || a?.id === assetData.id).flatMap(a => a?.contracts?.map(c => { - return { - ...a, - ...c, - }; - }).filter(a => !chainData || equals_ignore_case(a.chain, chainData.id)) || []); + const assets = _evm_assets + .filter((a) => !assetData || a?.id === assetData.id) + .flatMap( + (a) => + a?.contracts + ?.map((c) => { + return { + ...a, + ...c, + }; + }) + .filter( + (a) => !chainData || equals_ignore_case(a.chain, chainData.id), + ) || [], + ); return ( -
    -
    +
    +
    { hasAllOptions={true} allOptionsName="All Chains" defaultSelectedKey={chainData?.id || ""} - onSelect={c => { + onSelect={(c) => { setChainData(c); - if (c && _evm_assets.findIndex(a => (!assetData || a?.id === assetData.id) && a?.contracts?.findIndex(_c => _c?.chain === c?.id) > -1) < 0) { + if ( + c && + _evm_assets.findIndex( + (a) => + (!assetData || a?.id === assetData.id) && + a?.contracts?.findIndex((_c) => _c?.chain === c?.id) > -1, + ) < 0 + ) { setAssetData(""); } }} @@ -54,64 +79,68 @@ export default ({ environment = "mainnet" }) => { hasAllOptions={true} allOptionsName="All Assets" defaultSelectedKey={assetData?.id || ""} - onSelect={a => setAssetData(a)} + onSelect={(a) => setAssetData(a)} />
    - - - - {COLUMNS.map((c, i) => ( - - ))} - - - - {assets.map((a, i) => { - const { - id, - address, - symbol, - image, - chain, - } = { ...a }; - - const chain_data = _evm_chains.find(c => c?.id === chain); - const explorer_url = chain_data?.provider_params?.[0]?.blockExplorerUrls?.[0]; - - return ( - - {COLUMNS.map((c, j) => ( - + ))} + + ); + })} + +
    - {c.title} -
    - {c.id === "asset" ? -
    - {image && ( - - )} - - {symbol} - -
    - : - c.id === "chain" ? +
    + + + + {COLUMNS.map((c, i) => ( + + ))} + + + + {assets.map((a, i) => { + const { id, address, symbol, image, chain } = { ...a }; + const chain_data = _evm_chains.find((c) => c?.id === chain); + const explorer_url = + chain_data?.provider_params?.[0]?.blockExplorerUrls?.[0]; + return ( + + {COLUMNS.map((c, j) => ( + - ))} - - ); - })} - -
    + {c.title} +
    + {c.id === "asset" ? ( +
    + {image && ( + + )} + + {symbol} + +
    + ) : c.id === "chain" ? (
    {chain_data?.image && ( { {chain_data?.name || chain} - ID: {chain_data.network_id} + ID: {chain_data?.network_id}
    - : - c.id === "denom" ? -
    - - {id} + ) : c.id === "denom" ? ( +
    15 ? "wrap-text" : "" + }`} + > + + {id} + +
    + ) : c.id === "contract_address" ? ( +
    + {address ? ( + + {ellipse(address, 16)} + + ) : ( + + - -
    : - c.id === "contract_address" ? -
    - {address ? - - {ellipse(address, 16)} - - : - - - - - } - {address && ( - - )} -
    - : - c.id === "add_token" ? - - : - null - } -
    + )} + {address && ( + + )} +
    + ) : c.id === "add_token" ? ( + + ) : null} +
    +
    ); -}; \ No newline at end of file +}; diff --git a/src/components/evm/chains.jsx b/src/components/evm/chains.jsx index effa22faf..fca49badc 100644 --- a/src/components/evm/chains.jsx +++ b/src/components/evm/chains.jsx @@ -1,135 +1,177 @@ -import AddChain from "../web3"; -import Copy from "../copy"; -import { ellipse } from "../../utils"; import evm_chains from "../../data/evm_chains.json"; -import gateways from "../../data/gateways.json"; +import non_evm_chains from "../../data/non_evm_chains.json"; import gas_services from "../../data/gas_services.json"; +import gateways from "../../data/gateways.json"; +import { ellipse } from "../../utils"; +import Copy from "../copy"; +import AddChain from "../web3"; export default ({ environment = "mainnet" }) => { const _evm_chains = evm_chains?.[environment] || []; + const _non_evm_chains = non_evm_chains?.[environment] || []; + const _all_chains = [..._evm_chains, ..._non_evm_chains]; + + + const _gateways = gateways?.[environment] || []; const _gas_services = gas_services?.[environment] || []; return ( -
    - {_evm_chains - .filter(c => !c?.is_staging) +
    + {_all_chains + .filter((c) => !c?.is_staging) .map((c, i) => { - const { - id, - chain_id, - network_id, - name, - provider_params, - image, - } = { ...c }; + const { id, chain_id, network_id, name, provider_params, image } = { + ...c, + }; const explorer_url = provider_params?.[0]?.blockExplorerUrls?.[0]; - const gateway_contract_address = _gateways.find(_c => _c?.id === id)?.address; - const gas_service_address = _gas_services.find(_c => _c?.id === id)?.address; + const gateway_data = _gateways.find((_c) => _c?.id === id); + const gateway_contract_address = gateway_data?.address; + const gateway_object_id = gateway_data?.objectId; + const gas_service_data = _gas_services.find((_c) => _c?.id === id); + const gas_service_address = gas_service_data?.address; + const gas_service_object_id = gas_service_data?.objectId; return ( -
    -
    -
    +
    +
    +
    {image && ( )}
    - + {name} - + Chain ID: {chain_id}
    - +
    -
    - - Chain Name: - -
    - +
    +
    + + Chain Name: + +
    + +
    -
    -
    - - Gateway Contract: - -
    - {gateway_contract_address ? - - {ellipse(gateway_contract_address, 14)} - - : - - - - - } - {gateway_contract_address && ( - - )} +
    + + Gateway Contract: + +
    + {gateway_contract_address ? ( + + {ellipse(gateway_contract_address, 14)} + + ) : ( + - + )} + {gateway_contract_address && ( + + )} +
    -
    -
    - - Gas Service Contract: - -
    - {gas_service_address ? - - {ellipse(gas_service_address, 14)} - - : - - - + {id === "sui" && gateway_object_id && ( +
    + + Gateway Object ID: - } - {gas_service_address && ( - - )} + +
    + )} +
    + + Gas Service Contract: + +
    + {gas_service_address ? ( + + {ellipse(gas_service_address, 14)} + + ) : ( + + - + + )} + {gas_service_address && ( + + )} +
    + {id === "sui" && gas_service_object_id && ( +
    + + Gas Service Object ID: + + +
    + )}
    ); - }) - } + })}
    ); -}; \ No newline at end of file +}; diff --git a/src/components/footer/footer.astro b/src/components/footer/footer.astro new file mode 100644 index 000000000..b3fa29897 --- /dev/null +++ b/src/components/footer/footer.astro @@ -0,0 +1,212 @@ +--- +import Logo from "../logo"; + +const socials = { + twitter: "https://x.com/axelar", + instagram: "https://t.me/axelarcommunity", + discord: "https://discord.com/invite/axelar", + facebook: "https://x.com/axelar", +}; + +const links = [ + { + title: "Learn", + items: [ + { + title: "Website", + href: "https://axelar.network/", + }, + { + title: "Whitepaper", + href: "https://axelar.network/wp-content/uploads/2021/07/axelar_whitepaper.pdf", + }, + { + title: "Developer Blog", + href: "https://blog.axelar.dev/", + }, + { + title: "Github", + href: "https://github.com/axelarnetwork", + }, + { + title: "Support", + href: "https://github.com/axelarnetwork/support/", + }, + ], + }, + { + title: "Community", + items: [ + { + title: "X (Twitter)", + href: "https://x.com/axelar", + }, + { + title: "Discord", + href: "https://discord.gg/aRZ3Ra6f7D", + }, + { + title: "Telegram", + href: "https://t.me/axelarcommunity", + }, + { + title: "Discussion", + href: "https://community.axelar.network/", + }, + ], + }, + { + title: "Others", + items: [ + { + title: "Developer Newsletter", + href: "https://dashboard.mailerlite.com/forms/215012/95435869033334492/share", + }, + { + title: "Bug Bounty", + href: "/resources/bug-bounty/", + }, + { + title: "Blog", + href: "https://axelar.network/blog", + }, + { + title: "Terms of Use", + href: "/terms-of-use/", + }, + { + title: "Sitemap", + href: "/sitemap-0.xml", + }, + ], + }, +]; +--- + +
    +
    +
    +
    + +

    + Empowering developers to build scalable,
    interchain dApps +

    +
    + +
    +
    + { + links.map((link) => ( +
    +

    {link.title}

    + +
    + )) + } +
    +
    +
    +
    + © {new Date().getFullYear()} Axelar Foundation. All Rights Reserved. +
    +
    +
    diff --git a/src/components/getting-started/gmp.astro b/src/components/getting-started/gmp.astro new file mode 100644 index 000000000..9e1858489 --- /dev/null +++ b/src/components/getting-started/gmp.astro @@ -0,0 +1,59 @@ +--- +const title = "Send Messages Across Chains"; + +const cards = [ + { + title: "Send a cross-chain message from an EVM chain", + description: + "Send data from any Ethereum-compatible blockchain using Solidity contracts and the AxelarGateway interface.", + url: "/dev/general-message-passing/gmp-messages/", + }, + { + title: "Send a cross-chain message from a Cosmos chain", + description: + "Route messages from Cosmos SDK-based chains through IBC protocols with CosmWasm contract integration and gas relayers.", + url: "/dev/general-message-passing/cosmos-gmp/overview/", + }, + { + title: "Send a cross-chain message from Sui", + description: + "Dispatch cross-chain communications from Sui's Move environment with object capabilities and immutable package references.", + url: "/dev/general-message-passing/sui/gmp-example/", + }, + { + title: "Send a cross-chain message from Stellar", + description: + "Initiate interchain messaging from Stellar's high-throughput network using Soroban smart contracts and cross-chain bridges.", + url: "/dev/general-message-passing/stellar-gmp/gmp-example/", + }, +]; +--- + +
    + { + cards.map((card) => ( + +
    +

    {card.title}

    + + + + +
    +

    {card.description}

    +
    + )) + } +
    diff --git a/src/components/getting-started/interchain-tokens-evm.astro b/src/components/getting-started/interchain-tokens-evm.astro new file mode 100644 index 000000000..3193d2f6d --- /dev/null +++ b/src/components/getting-started/interchain-tokens-evm.astro @@ -0,0 +1,59 @@ +--- +const title = "Create a New Interchain Token for EVM and Non-EVM Chains"; + +const cards = [ + { + title: "Create a new Interchain Token", + description: + "Launch new Interchain Tokens through our user-friendly portal with no coding required. Perfect for quick deployment.", + url: "/dev/send-tokens/interchain-tokens/no-code/", + }, + { + title: "Programmatically create a new Interchain Token", + description: + "Deploy Interchain Tokens using SDK and smart contract integration for customized functionality and control.", + url: "/dev/send-tokens/interchain-tokens/create-new-interchain-token/", + }, + { + title: "Make an existing ERC-20 token an Interchain Token", + description: + "Transform standard ERC-20 tokens into cross-chain compatible assets while preserving their original functionality.", + url: "/dev/send-tokens/interchain-tokens/register-existing-token/", + }, + { + title: "Link Custom Tokens Deployed Across Multiple Chains", + description: + "Connect independently deployed token contracts across different blockchains into a unified interchain ecosystem.", + url: "/dev/send-tokens/interchain-tokens/integrate-custom-token/", + }, +]; +--- + +
    + { + cards.map((card) => ( + +
    +

    {card.title}

    + + + + +
    +

    {card.description}

    +
    + )) + } +
    diff --git a/src/components/getting-started/interchain-tokens-non-evm.astro b/src/components/getting-started/interchain-tokens-non-evm.astro new file mode 100644 index 000000000..8b3fea376 --- /dev/null +++ b/src/components/getting-started/interchain-tokens-non-evm.astro @@ -0,0 +1,47 @@ +--- +const title = "Create a New Interchain Token for EVM and Non-EVM Chains"; + +const cards = [ + { + title: "Create a new Interchain Token on SUI", + description: + "Deploy cross-chain compatible tokens natively on SUI blockchain with full Move language benefits and object-based storage model.", + url: "/dev/send-tokens/sui/intro/", + }, + { + title: "Create a new Interchain Token on Stellar", + description: + "Launch interoperable tokens on Stellar's high-speed, low-cost network with built-in DEX functionality and compliance features.", + url: "/dev/send-tokens/stellar/intro/", + }, +]; +--- + +
    + { + cards.map((card) => ( + +
    +

    {card.title}

    + + + + +
    +

    {card.description}

    +
    + )) + } +
    diff --git a/src/components/getting-started/send-tokens.astro b/src/components/getting-started/send-tokens.astro new file mode 100644 index 000000000..465b77ba3 --- /dev/null +++ b/src/components/getting-started/send-tokens.astro @@ -0,0 +1,47 @@ +--- +const title = "Send Tokens Across Chains"; + +const cards = [ + { + title: "Send Interchain Tokens", + description: + "Transfer any deployed Interchain Token across supported blockchains with unified API calls and consistent token representation.", + url: "/dev/send-tokens/interchain-tokens/integrate-custom-token/#send-tokens-using-the-interchain-transfer-function/", + }, + { + title: "Send Gateway Tokens", + description: + "Move tokens alongside custom messages between chains using GMP for advanced cross-chain applications and composability.", + url: "/dev/general-message-passing/gmp-tokens-with-messages/", + }, +]; +--- + +
    + { + cards.map((card) => ( + +
    +

    {card.title}

    + + + + +
    +

    {card.description}

    +
    + )) + } +
    diff --git a/src/components/header/MobileNavigation.tsx b/src/components/header/MobileNavigation.tsx new file mode 100644 index 000000000..233d2d71b --- /dev/null +++ b/src/components/header/MobileNavigation.tsx @@ -0,0 +1,97 @@ +import clsx from "clsx"; +import { LayoutGrid, Menu, X } from "lucide-react"; +import React, { useEffect } from "react"; +import Logo from "../logo"; + +import { topLevelNav } from "@/layouts/navigation"; +import ThemeToggle from "../ui/theme-toggle"; + +const MobileNavigation = ({ + pathname, + children, +}: { + pathname: string; + children?: React.ReactNode; +}) => { + const [open, setOpen] = React.useState(false); + + useEffect(() => { + setOpen(false); + }, [pathname]); + + useEffect(() => { + if (open) { + document.body.style.overflow = "hidden"; + } else { + document.body.style.overflow = "auto"; + } + }, [open]); + return ( +
    + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    +
    +
    + {topLevelNav.map((item) => { + return ( + + +

    {item.title}

    +
    + ); + })} +
    + {children} +
    +
    +
    + ); +}; + +export default MobileNavigation; diff --git a/src/components/header/header-logo.astro b/src/components/header/header-logo.astro new file mode 100644 index 000000000..0d9b28750 --- /dev/null +++ b/src/components/header/header-logo.astro @@ -0,0 +1,11 @@ +--- +import Logo from "../logo"; +--- + +
    + + Docs +
    diff --git a/src/components/header/header.astro b/src/components/header/header.astro new file mode 100644 index 000000000..abca1ebbd --- /dev/null +++ b/src/components/header/header.astro @@ -0,0 +1,63 @@ +--- +import { topLevelNav } from "@/layouts/navigation"; +import "@/styles/global.css"; +import Search from "../docs/Search"; +import RenderSidebar from "../sidebar/render-sidebar.astro"; +import ThemeToggle from "../ui/theme-toggle"; +import Logo from "./header-logo.astro"; +import MobileNavigation from "./MobileNavigation"; +--- + +
    + +
    diff --git a/src/components/ibc/channels.jsx b/src/components/ibc/channels.jsx index e09f7e313..224bcc01d 100644 --- a/src/components/ibc/channels.jsx +++ b/src/components/ibc/channels.jsx @@ -9,68 +9,74 @@ export default ({ environment = "mainnet" }) => { const _cosmos_chains = cosmos_chains?.[environment] || []; const _ibc_channels = ibc_channels?.[environment] || []; - const pairs = - Object.entries( - _.groupBy( - _ibc_channels.map(c => { - return { - ...c, - other_chain: _.head([c?.from, c?.to].filter(cid => cid && cid !== MAIN_CHAIN)), - }; - }), - "other_chain", - ) - ) - .map(([other_chain, channels]) => { - return { - chain_data: _cosmos_chains.find(c => c?.id === MAIN_CHAIN), - other_chain_data: _cosmos_chains.find(c => c?.id === other_chain), - channels, - }; - }); + const pairs = Object.entries( + _.groupBy( + _ibc_channels.map((c) => { + return { + ...c, + other_chain: _.head( + [c?.from, c?.to].filter((cid) => cid && cid !== MAIN_CHAIN), + ), + }; + }), + "other_chain", + ), + ).map(([other_chain, channels]) => { + return { + chain_data: _cosmos_chains.find((c) => c?.id === MAIN_CHAIN), + other_chain_data: _cosmos_chains.find((c) => c?.id === other_chain), + channels, + }; + }); return ( -
    +
    {pairs.map((p, i) => { - const { - chain_data, - other_chain_data, - channels, - } = { ...p }; + const { chain_data, other_chain_data, channels } = { ...p }; return (
    -
    +
    {chain_data?.image && ( )}
    - + {chain_data?.name} {chain_data?.network_id && ( - + {chain_data.network_id} )}
    -
    - - {channels.find(c => c?.from === chain_data?.id)?.channel_id} +
    + + {channels.find((c) => c?.from === chain_data?.id)?.channel_id} - - - {channels.find(c => c?.from === other_chain_data?.id)?.channel_id} + + + + + { + channels.find((c) => c?.from === other_chain_data?.id) + ?.channel_id + }
    @@ -78,17 +84,15 @@ export default ({ environment = "mainnet" }) => { )}
    - + {other_chain_data?.name} {other_chain_data?.network_id && ( - + {other_chain_data.network_id} )} @@ -99,4 +103,4 @@ export default ({ environment = "mainnet" }) => { })}
    ); -}; \ No newline at end of file +}; diff --git a/src/components/interchain-token-intro.astro b/src/components/interchain-token-intro.astro new file mode 100644 index 000000000..b5213fa1f --- /dev/null +++ b/src/components/interchain-token-intro.astro @@ -0,0 +1,58 @@ +--- +const title = "Interchain Tokens and the Interchain Token Service"; + +const cards = [ + { + title: "Create a new Interchain Token", + description: + "Register and create new Interchain Token(s) using the Interchain Token Portal, or create custom Interchain Tokens.", + url: "/dev/send-tokens/interchain-tokens/no-code/", + }, + { + title: "Programmatically create a new Interchain Token", + description: "Create new Interchain Tokens using code.", + url: "/dev/send-tokens/interchain-tokens/create-new-interchain-token/", + }, + { + title: "Make an existing ERC-20 token an Interchain Token", + description: + "Upgrade existing tokens to canonical tokens, or link tokens deployed on multiple chains into Interchain Tokens.", + url: "/dev/send-tokens/interchain-tokens/register-existing-token/", + }, + { + title: "Check out the Interchain Portal", + description: + "Create your own Interchain Token with one click on the Interchain Portal.", + url: "http://interchain.axelar.dev/", + }, +]; +--- + +
    + { + cards.map((card) => ( + +
    +

    {card.title}

    + + + + +
    +

    {card.description}

    +
    + )) + } +
    diff --git a/src/components/keplr/addKeplrWallet.jsx b/src/components/keplr/addKeplrWallet.jsx index fcc9e2c46..7f71e00b4 100644 --- a/src/components/keplr/addKeplrWallet.jsx +++ b/src/components/keplr/addKeplrWallet.jsx @@ -4,7 +4,7 @@ export default ({ url, className, parentClassName, - onClick + onClick, }) => { buttonTitle = buttonTitle || title || "View"; className = `bg-blue-500 hover:bg-blue-600 dark:bg-blue-600 dark:hover:bg-blue-500 rounded-lg no-underline text-white font-semibold py-2 px-2 ${className || ""}`; @@ -12,7 +12,7 @@ export default ({ return (
    - {url ? + {url ? ( {buttonTitle} - : - - } + )}
    ); -}; \ No newline at end of file +}; diff --git a/src/components/keplr/index.jsx b/src/components/keplr/index.jsx index 3e1e14817..58e59f29a 100644 --- a/src/components/keplr/index.jsx +++ b/src/components/keplr/index.jsx @@ -7,7 +7,7 @@ export default ({ environment = "mainnet", chain }) => { alert(settings.chainId + " already added"); } catch (e) { console.log( - "Unable to connect to wallet natively, so trying experimental chain" + "Unable to connect to wallet natively, so trying experimental chain", ); try { await window.keplr.experimentalSuggestChain(settings); @@ -15,7 +15,7 @@ export default ({ environment = "mainnet", chain }) => { } catch (e2) { console.log( "and yet there is a problem in trying to do that too", - e2 + e2, ); } } @@ -23,7 +23,7 @@ export default ({ environment = "mainnet", chain }) => { if (error instanceof SyntaxError) { alert( "There was a syntax error. Please correct it and try again: " + - error.message + error.message, ); } else { throw error; diff --git a/src/components/logo.tsx b/src/components/logo.tsx new file mode 100644 index 000000000..55eea162b --- /dev/null +++ b/src/components/logo.tsx @@ -0,0 +1,45 @@ +import clsx from "clsx"; +import React from "react"; + +const Logo = ({ className }: { className?: string }) => { + const colors = [ + "group-hover:text-[#5068E0]", + "group-hover:text-[#AD4510]", + "group-hover:text-[#F22DCA]", + ]; + const [currentColor, setCurrentColor] = React.useState(colors[0]); + const [currentRotate, setCurrentRotate] = React.useState(0); + + return ( + { + setCurrentColor( + colors[(colors.indexOf(currentColor) + 1) % colors.length], + ); + setCurrentRotate(currentRotate + 90); + }} + className={clsx(className, "text-foreground group")} + > + + + + ); +}; + +export default Logo; diff --git a/src/components/resources/index.jsx b/src/components/resources/index.jsx index 2ba99c061..f3879dffa 100644 --- a/src/components/resources/index.jsx +++ b/src/components/resources/index.jsx @@ -1,5 +1,5 @@ -import Copy from "../copy"; import resources from "../../data/resources.json"; +import Copy from "../copy"; const COLUMNS = [ { @@ -11,88 +11,76 @@ const COLUMNS = [ }, ]; -export default ({ - environment = "mainnet", -}) => { - const _resources = resources?.[environment] || - []; +export default ({ environment = "mainnet" }) => { + const _resources = resources?.[environment] || []; return ( - +
    +
    - {_resources - .map((r, i) => { - return ( - - {COLUMNS - .map((c, j) => { - const { - id, - className, - } = { ...c }; + {_resources.map((r, i) => { + return ( + + {COLUMNS.map((c, j) => { + const { id, className } = { ...c }; - const data = r?.[id]; + const data = r?.[id]; - return ( - - ); - }) - } - - ); - }) - } + return ( + + ); + })} + + ) : ( + data + )} + + ); + })} + + ); + })}
    - {id === 'value' ? -
    - {(data || []) - .map((v, k) => { - const { - title, - value, - } = { ...v }; + return ( +
    + {id === "value" ? ( +
    + {(data || []).map((v, k) => { + const { title, value } = { ...v }; - const is_external = !value?.startsWith('/'); + const is_external = !value?.startsWith("/"); - return ( -
    - - { - title || - value - } - - { - - ( - - ) - } -
    - ); - }) - } -
    : - data - } -
    +
    ); -}; \ No newline at end of file +}; diff --git a/src/components/sidebar/render-sidebar.astro b/src/components/sidebar/render-sidebar.astro new file mode 100644 index 000000000..d09e831c4 --- /dev/null +++ b/src/components/sidebar/render-sidebar.astro @@ -0,0 +1,94 @@ +--- +import { getNavigation } from "@/layouts/navigation"; +import clsx from "clsx"; +import { ChevronDown, LayoutGrid } from "lucide-react"; + +const { isMobile } = Astro.props; +const section = Astro.url.pathname?.match(/\/([^\/]*)\//)?.[1]; +const navigation = getNavigation(section); +--- + + diff --git a/src/components/sidebar/sidebar.astro b/src/components/sidebar/sidebar.astro new file mode 100644 index 000000000..8a9823317 --- /dev/null +++ b/src/components/sidebar/sidebar.astro @@ -0,0 +1,9 @@ +--- +import "@/styles/global.css"; + +import RenderSidebar from "./render-sidebar.astro"; + +const pathname = Astro.url.pathname; +--- + + diff --git a/src/components/static-copy.jsx b/src/components/static-copy.jsx index cba3cbd34..f25e4bc68 100644 --- a/src/components/static-copy.jsx +++ b/src/components/static-copy.jsx @@ -1,14 +1,7 @@ - -export default ({ - size = 18, - value, - hide, - className = "", -}) => { - - +export default ({ size = 18, value, hide, className = "" }) => { return (
    - {hide ? '' : value}
    + {hide ? "" : value} +
    ); -}; \ No newline at end of file +}; diff --git a/src/components/textarea.jsx b/src/components/textarea.jsx index 00efb708d..d01b4fefd 100644 --- a/src/components/textarea.jsx +++ b/src/components/textarea.jsx @@ -1,24 +1,27 @@ import { useState } from "react"; -const placeholder = '{"rpc":"https://axelartest-rpc.quickapi.com/","rest":"https://axelartest-lcd.quickapi.com/","chainId":"axelar-testnet-lisbon-3","chainName":"Axelar Testnet","stakeCurrency":{"coinDenom":"AXL","coinMinimalDenom":"uaxl","coinDecimals":6},"bech32Config":{"bech32PrefixAccAddr":"axelar","bech32PrefixAccPub":"axelarpub","bech32PrefixValAddr":"axelarvaloper","bech32PrefixValPub":"axelarvaloperpub","bech32PrefixConsAddr":"axelarvalcons","bech32PrefixConsPub":"axelarvalconspub"},"bip44":{"coinType":118},"currencies":[{"coinDenom":"AXL","coinMinimalDenom":"uaxl","coinDecimals":6}],"feeCurrencies":[{"coinDenom":"AXL","coinMinimalDenom":"uaxl","coinDecimals":6}],"gasPriceStep":{"low":0.05,"average":0.125,"high":0.2},"features":["stargate","no-legacy-stdTx","ibc-transfer"]}' +const placeholder = + '{"rpc":"https://axelartest-rpc.quickapi.com/","rest":"https://axelartest-lcd.quickapi.com/","chainId":"axelar-testnet-lisbon-3","chainName":"Axelar Testnet","stakeCurrency":{"coinDenom":"AXL","coinMinimalDenom":"uaxl","coinDecimals":6},"bech32Config":{"bech32PrefixAccAddr":"axelar","bech32PrefixAccPub":"axelarpub","bech32PrefixValAddr":"axelarvaloper","bech32PrefixValPub":"axelarvaloperpub","bech32PrefixConsAddr":"axelarvalcons","bech32PrefixConsPub":"axelarvalconspub"},"bip44":{"coinType":118},"currencies":[{"coinDenom":"AXL","coinMinimalDenom":"uaxl","coinDecimals":6}],"feeCurrencies":[{"coinDenom":"AXL","coinMinimalDenom":"uaxl","coinDecimals":6}],"gasPriceStep":{"low":0.05,"average":0.125,"high":0.2},"features":["stargate","no-legacy-stdTx","ibc-transfer"]}'; export default ({}) => { + const [value, setValue] = useState(placeholder); - const [value, setValue] = useState(placeholder); - - return <> - - + return ( + <> + + -}; \ No newline at end of file + ); +}; diff --git a/src/components/transfer-fee/calculator.jsx b/src/components/transfer-fee/calculator.jsx index 56e1a8ca7..4670ee4ba 100644 --- a/src/components/transfer-fee/calculator.jsx +++ b/src/components/transfer-fee/calculator.jsx @@ -1,11 +1,10 @@ import { useState } from "react"; -import Dropdown from "../dropdown"; -import Copy from "../copy"; -import evm_chains from "../../data/evm_chains.json"; import cosmos_chains from "../../data/cosmos_chains.json"; import evm_assets from "../../data/evm_assets.json"; +import evm_chains from "../../data/evm_chains.json"; import ibc_assets from "../../data/ibc_assets.json"; +import Dropdown from "../dropdown"; export default ({ environment = "mainnet" }) => { const _evm_chains = evm_chains?.[environment] || []; @@ -13,24 +12,35 @@ export default ({ environment = "mainnet" }) => { const _evm_assets = evm_assets?.[environment] || []; const _ibc_assets = ibc_assets?.[environment] || []; - const [assetData, setAssetData] = useState(_evm_assets.find(a => a?.id === (environment === "testnet" ? "uausdc" : "uusdc"))); - const [sourceChainData, setSourceChainData] = useState(_evm_assets.find(c => c?.id === "avalanche")); - const [destinationChainData, setDestinationChainData] = useState(_evm_assets.find(c => c?.id === "osmosis")); + const [assetData, setAssetData] = useState( + _evm_assets.find( + (a) => a?.id === (environment === "testnet" ? "uausdc" : "uusdc"), + ), + ); + const [sourceChainData, setSourceChainData] = useState( + _evm_assets.find((c) => c?.id === "avalanche"), + ); + const [destinationChainData, setDestinationChainData] = useState( + _evm_assets.find((c) => c?.id === "osmosis"), + ); - const getTransferFee = chain => { + const getTransferFee = (chain) => { let transfer_fee; if (chain && assetData?.id) { - const evm_chain_data = _evm_chains.find(c => c?.id === chain); - const cosmos_chain_data = _cosmos_chains.find(c => c?.id === chain); + const evm_chain_data = _evm_chains.find((c) => c?.id === chain); + const cosmos_chain_data = _cosmos_chains.find((c) => c?.id === chain); if (evm_chain_data) { - const asset_data = _evm_assets.find(a => a?.id === assetData.id); - transfer_fee = asset_data?.contracts?.find(c => c?.chain === chain)?.transfer_fee || - (asset_data?.contracts?.findIndex(c => c?.chain === chain) > -1 ? asset_data?.transfer_fee : null); - } - else if (cosmos_chain_data) { - const asset_data = _ibc_assets.find(a => a?.id === assetData.id); + const asset_data = _evm_assets.find((a) => a?.id === assetData.id); + transfer_fee = + asset_data?.contracts?.find((c) => c?.chain === chain) + ?.transfer_fee || + (asset_data?.contracts?.findIndex((c) => c?.chain === chain) > -1 + ? asset_data?.transfer_fee + : null); + } else if (cosmos_chain_data) { + const asset_data = _ibc_assets.find((a) => a?.id === assetData.id); transfer_fee = asset_data?.transfer_fee; } } @@ -40,73 +50,68 @@ export default ({ environment = "mainnet" }) => { const sourceTransferFee = getTransferFee(sourceChainData?.id); const destinationTransferFee = getTransferFee(destinationChainData?.id); - const totalFee = parseFloat((sourceTransferFee + destinationTransferFee).toFixed(6)); + const totalFee = parseFloat( + (sourceTransferFee + destinationTransferFee).toFixed(6), + ); return ( -
    -
    - - Asset - - setAssetData(a)} - className="min-w-max" - /> - - Fee - -
    -
    - - Source chain - - setSourceChainData(c)} - className="min-w-max" - /> - - {sourceTransferFee || 'N/A'} {assetData?.symbol} - -
    -
    - - + - -
    -
    - - Destination chain - - setDestinationChainData(c)} - className="min-w-max" - /> - - {destinationTransferFee || 'N/A'} {assetData?.symbol} - +
    +
    +
    + Asset + setAssetData(a)} + /> + + Fee + +
    +
    + Source chain + setSourceChainData(c)} + /> + + {sourceTransferFee || "N/A"} {assetData?.symbol} + +
    + +
    + + +
    +
    + Destination chain + setDestinationChainData(c)} + /> + + {destinationTransferFee || "N/A"} {assetData?.symbol} + +
    -
    -
    + +
    +
    +
    +
    +
    + Total - Total - - {totalFee} {assetData?.symbol}
    -
    ); -}; \ No newline at end of file +}; diff --git a/src/components/typeform.jsx b/src/components/typeform.jsx index 787fa6c37..b324e0dd7 100644 --- a/src/components/typeform.jsx +++ b/src/components/typeform.jsx @@ -6,7 +6,10 @@ import { SPENDING_TIME_SECONDS } from "../reducers/types"; export default () => { const dispatch = useDispatch(); - const { spending_time } = useSelector(state => ({ spending_time: state.spending_time }), shallowEqual); + const { spending_time } = useSelector( + (state) => ({ spending_time: state.spending_time }), + shallowEqual, + ); const { spending_time_seconds } = { ...spending_time }; useEffect(() => { @@ -21,17 +24,20 @@ export default () => { } }, [spending_time_seconds]); - return process.env.NEXT_PUBLIC_TYPEFORM_ID && spending_time_seconds < 1 && ( - + return ( + process.env.NEXT_PUBLIC_TYPEFORM_ID && + spending_time_seconds < 1 && ( + + ) ); -}; \ No newline at end of file +}; diff --git a/src/components/ui/NextPrevNav.astro b/src/components/ui/NextPrevNav.astro new file mode 100644 index 000000000..022db55d3 --- /dev/null +++ b/src/components/ui/NextPrevNav.astro @@ -0,0 +1,42 @@ +--- +import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react"; +import Button from "./button.astro"; + +const { nav } = Astro.props; +--- + +
    + { + nav.prevPage?.href ? ( + + + + ) : ( + "" + ) + } + + { + nav.nextPage?.href ? ( + + + + ) : ( + "" + ) + } +
    diff --git a/src/components/ui/button.astro b/src/components/ui/button.astro new file mode 100644 index 000000000..303b53061 --- /dev/null +++ b/src/components/ui/button.astro @@ -0,0 +1,37 @@ +--- +import { buttonCva, type variants } from "@/lib/cva/button"; +import clsx from "clsx"; +type Props = { + className?: string; + varient?: variants; + size?: "small" | "medium"; +}; + +const { className, varient = "primary", size = "medium" } = Astro.props; +--- + + diff --git a/src/components/ui/theme-toggle.tsx b/src/components/ui/theme-toggle.tsx new file mode 100644 index 000000000..6a64ad074 --- /dev/null +++ b/src/components/ui/theme-toggle.tsx @@ -0,0 +1,38 @@ +import { Moon, Sun } from "lucide-react"; +import { useEffect, useState } from "react"; + +const ThemeToggle = () => { + const [theme, setTheme] = useState("light"); + + useEffect(() => { + const localTheme = window.localStorage.getItem("theme"); + localTheme && setTheme(localTheme); + }, []); + + const toggleTheme = () => { + if (theme === "light") { + window.localStorage.setItem("theme", "dark"); + setTheme("dark"); + document.documentElement.classList.add("dark"); + } else { + window.localStorage.setItem("theme", "light"); + setTheme("light"); + document.documentElement.classList.remove("dark"); + } + }; + + return ( + + ); +}; + +export default ThemeToggle; diff --git a/src/components/ui/world-map.astro b/src/components/ui/world-map.astro new file mode 100644 index 000000000..9d9f1be7e --- /dev/null +++ b/src/components/ui/world-map.astro @@ -0,0 +1,19 @@ +--- +import { clsx } from "clsx"; +type Props = { + className?: string; +}; + +const { className } = Astro.props; +--- + +
    +
    + +
    +
    diff --git a/src/components/web3/index.jsx b/src/components/web3/index.jsx index 467e82cad..2cd88f107 100644 --- a/src/components/web3/index.jsx +++ b/src/components/web3/index.jsx @@ -1,9 +1,8 @@ -import { useState, useEffect } from "react"; +import { useEffect, useState } from "react"; import Web3 from "web3"; -import { equals_ignore_case } from "../../utils"; import evm_chains from "../../data/evm_chains.json"; -import { CHAIN_ID } from "../../reducers/types"; +import { equals_ignore_case } from "../../utils"; export default ({ environment = "mainnet", @@ -125,13 +124,13 @@ export default ({ } } }} - className={`add-to-metamask min-w-max bg-gray-100 dark:bg-gray-900 ${ + className={`add-to-metamask size-8 items-center justify-center flex bg-background ${ at_chain ? "" : "hover:bg-gray-200 dark:hover:bg-gray-800 cursor-pointer" - } rounded-lg flex items-center py-1.5 px-2`} + } rounded-full flex items-center `} > - + ); diff --git a/src/config/site.ts b/src/config/site.ts index 156fef03f..c6707340f 100644 --- a/src/config/site.ts +++ b/src/config/site.ts @@ -1 +1 @@ -export const GITHUB_EDIT_URL = `https://github.com/axelarnetwork/axelar-docs/tree/main/` \ No newline at end of file +export const GITHUB_EDIT_URL = `https://github.com/axelarnetwork/axelar-docs/tree/main/`; diff --git a/src/config/variables.ts b/src/config/variables.ts new file mode 100644 index 000000000..ec99a632b --- /dev/null +++ b/src/config/variables.ts @@ -0,0 +1,5 @@ +export const AXELARD = "1.1.3"; +export const AXELARD_TESTNET = "1.1.2"; +export const AMPD = "1.9.0"; +export const TOFND = "1.0.1"; +export const TOFND_TESTNET = "1.0.1"; diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 000000000..dce36042d --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,12 @@ +import { defineCollection, z } from "astro:content"; + +const docs = defineCollection({ + schema: z.object({ + title: z.string().optional(), + description: z.string().optional(), + }), +}); + +export const collections = { + docs, +}; diff --git a/src/pages/controller/add-evm-chain.mdx b/src/content/docs/controller/add-evm-chain.mdx similarity index 54% rename from src/pages/controller/add-evm-chain.mdx rename to src/content/docs/controller/add-evm-chain.mdx index 18985cc61..e191fa322 100644 --- a/src/pages/controller/add-evm-chain.mdx +++ b/src/content/docs/controller/add-evm-chain.mdx @@ -1,19 +1,18 @@ # Add a new EVM chain -import { Callout } from '../../components/callout' - - +import { Callout } from "../../../components/callout"; Learn how to add a new EVM chain to the Axelar network. - Example: For clarity, this article targets the Avalanche EVM chain. Substitute your own EVM chain as desired. + Example: For clarity, this article targets the Avalanche EVM chain. Substitute + your own EVM chain as desired. ## Prerequisites -- Prerequisites for [Controller operations](../controller) -- Axelar validators with enough stake have configured their nodes to support the new EVM chain as per [Support external chains](../validator/external-chains/overview). +- Prerequisites for [Controller operations](/controller) +- Axelar validators with enough stake have configured their nodes to support the new EVM chain as per [Support external chains](/validator/external-chains/overview). - You will deploy smart contracts to the new EVM chain---you need enough native tokens to pay gas fees on that chain. Example: if deploying to Avalanche then you need AVAX tokens, etc. ## Add the new EVM chain @@ -37,11 +36,11 @@ Call a validator vote to confirm new EVM chain. axelard tx evm confirm-chain avalanche --from controller ``` -Each validator votes `true` or `false` according to whether it is configured to support the new EVM chain as per [Support external chains](../validator/external-chains/overview). +Each validator votes `true` or `false` according to whether it is configured to support the new EVM chain as per [Support external chains](/validator/external-chains/overview). Optional: check your logs for messages of the form `EVM chain Avalanche confirmation result is true`. -Now that the new EVM chain has been added, validators need to register as maintainers for the new chain as per [Support external chains](../validator/external-chains/overview). +Now that the new EVM chain has been added, validators need to register as maintainers for the new chain as per [Support external chains](/validator/external-chains/overview). If a large enough portion of validator stake has registered as a maintainer of the new EVM chain then that chain can be activated by a special transaction signed by the Axelar governance account. Contact the Axelar team to request such a transaction. @@ -68,35 +67,50 @@ axelard q evm address avalanche --key-role secondary Register external governance keys for the new chain. - -
    
    -axelard tx tss register-external-keys avalanche --from controller \
    - --key avax-external-1:03e4da05dd2c4d1a75567fff2ade93de82ccca8701689ce42da40cebd4cc7a2423 \
    - --key avax-external-2:03dccf1720dafc44d6e47635b8f0e2705bd57346acce1f18238580461fd3c900ce \
    - --key avax-external-3:0383afc1b42f1dae34649ab70c4c3d67aa86db89fc1842cd697e3c2a574b433ab1 \
    - --key avax-external-4:02ad55f4054d47a13cfe2583693bf63a8f299ca33da936f7372a38070cbf5dbc93 \
    - --key avax-external-5:02e25f07aca8971908b7489b54d809401c34d1d5a817b521234ced5b75c056f2fd \
    - --key avax-external-6:023f39b9bfcead2854bab63f02880487553430a475ee0f3783c52ef98927cb37d7 \
    - --key avax-external-7:03e78bbe19444fe98a77b45c340998437fb902572747f8e44ea99b23dc1106e0d2 \
    - --key avax-external-8:0203ce85d1564ce9203b45ad6b93511c8daaa0927f31f3e8d53f18b51afc3f7a27
    -
    -
    - -
    
    -axelard tx tss register-external-keys avalanche --from controller \
    - --key avax-external-1:041bb2e070cdd8490500f673136f95d80bf4eb9ac6a85fe8fede6070515d75dfd51a7187318aeb17eb53e711a8ccc0939bbda30ac67836969b64422ef6831a6e2a \
    - --key avax-external-2:040626a1032fe1f76deb3b4f0cb5c68cc0e29264102111077691478d74eafcdc4c3938bb712b7d8cd15f9c72261432be19217f02e445d4caeb09d7a1abe793642e \
    - --key avax-external-3:04d8400ac69c6c919d6963a5da6403ba750f5d7859b0c00f1a6b9a2ce9cd663bf8a20af0351f0e6dbc7bc41040c06156d02b78f25fd6b9b54db03bd53e812b8577 \
    - --key avax-external-4:04ee60261b7fd4084b271618cefef4f9a4093338a1dfbeae2f4a18366a53a07dd0657f31fa38c2739885fbc9ee1e83e25b3fcda6581be8f82400c7d0a18eb79070 \
    - --key avax-external-5:04aebaae5d1c63bf527331ee9a75dbc727420f51bc557a78dd0d9a0227c42dad2d821c9a3b24ca75b558b3c333cb8e4acaa4fb174a07ebd8268c6a43b83e04ffdc \
    - --key avax-external-6:04900ccd93432b25f4758f8d702bfd91e6192b0931345baafa50328185300a4cd0e392398612f5394fd6026f06fa73fb42a4f43ced2fa5ef326e5d658fd90113d3 \
    - --key avax-external-7:04761c872fd2c9c501e75ba3ef8fd65ed4d0f1e7ba60901f758b26645ee3621256a65df63f10b009f1f0e458e7cdb69737098cc30e99cf41887d7adc24c9492729 \
    - --key avax-external-8:044202188712caa9c047caaa01eb2a97f631b5ffb0ac1e2de40609c89137d7992a07d7b6c48cb69eee0323855377582a5601008a1190ca6c2b37316c2aead28bfd
    -
    -
    + + ```bash + axelard tx tss register-external-keys avalanche --from controller \ + --key + avax-external-1:03e4da05dd2c4d1a75567fff2ade93de82ccca8701689ce42da40cebd4cc7a2423 + \ --key + avax-external-2:03dccf1720dafc44d6e47635b8f0e2705bd57346acce1f18238580461fd3c900ce + \ --key + avax-external-3:0383afc1b42f1dae34649ab70c4c3d67aa86db89fc1842cd697e3c2a574b433ab1 + \ --key + avax-external-4:02ad55f4054d47a13cfe2583693bf63a8f299ca33da936f7372a38070cbf5dbc93 + \ --key + avax-external-5:02e25f07aca8971908b7489b54d809401c34d1d5a817b521234ced5b75c056f2fd + \ --key + avax-external-6:023f39b9bfcead2854bab63f02880487553430a475ee0f3783c52ef98927cb37d7 + \ --key + avax-external-7:03e78bbe19444fe98a77b45c340998437fb902572747f8e44ea99b23dc1106e0d2 + \ --key + avax-external-8:0203ce85d1564ce9203b45ad6b93511c8daaa0927f31f3e8d53f18b51afc3f7a27 + ``` + + + ```bash + axelard tx tss register-external-keys avalanche --from controller \ + --key + avax-external-1:041bb2e070cdd8490500f673136f95d80bf4eb9ac6a85fe8fede6070515d75dfd51a7187318aeb17eb53e711a8ccc0939bbda30ac67836969b64422ef6831a6e2a + \ --key + avax-external-2:040626a1032fe1f76deb3b4f0cb5c68cc0e29264102111077691478d74eafcdc4c3938bb712b7d8cd15f9c72261432be19217f02e445d4caeb09d7a1abe793642e + \ --key + avax-external-3:04d8400ac69c6c919d6963a5da6403ba750f5d7859b0c00f1a6b9a2ce9cd663bf8a20af0351f0e6dbc7bc41040c06156d02b78f25fd6b9b54db03bd53e812b8577 + \ --key + avax-external-4:04ee60261b7fd4084b271618cefef4f9a4093338a1dfbeae2f4a18366a53a07dd0657f31fa38c2739885fbc9ee1e83e25b3fcda6581be8f82400c7d0a18eb79070 + \ --key + avax-external-5:04aebaae5d1c63bf527331ee9a75dbc727420f51bc557a78dd0d9a0227c42dad2d821c9a3b24ca75b558b3c333cb8e4acaa4fb174a07ebd8268c6a43b83e04ffdc + \ --key + avax-external-6:04900ccd93432b25f4758f8d702bfd91e6192b0931345baafa50328185300a4cd0e392398612f5394fd6026f06fa73fb42a4f43ced2fa5ef326e5d658fd90113d3 + \ --key + avax-external-7:04761c872fd2c9c501e75ba3ef8fd65ed4d0f1e7ba60901f758b26645ee3621256a65df63f10b009f1f0e458e7cdb69737098cc30e99cf41887d7adc24c9492729 + \ --key + avax-external-8:044202188712caa9c047caaa01eb2a97f631b5ffb0ac1e2de40609c89137d7992a07d7b6c48cb69eee0323855377582a5601008a1190ca6c2b37316c2aead28bfd + ``` +
    - The gateway contract can now be deployed on the new EVM chain. Get the gateway contract bytecode. @@ -107,17 +121,21 @@ axelard q evm bytecode avalanche gateway-deployment Deploy the above bytecode to a smart contract on the EVM chain. - - Tip: Deploy the gateway contract however you wish. One option is to use [version 5 of MyEtherWallet](https://v5.myetherwallet.com/) with MetaMask as suggested in the video [Onboarding Avalanche to the Axelar Network](https://www.youtube.com/watch?v=iZgqneh7s88). - + +### On-chain gas estimation (alpha) + +The [`IInterchainGasEstimation`](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/blob/main/contracts/interfaces/IInterchainGasEstimation.sol) interface offers [on-chain gas estimation](/dev/gas-service/on-chain-estimation/), allowing you to estimate interchain transaction gas fees directly from a Solidity contract. This method involves overpaying for a transaction and getting a refund, and is available only on testnet. Use it only if you are not able to estimate gas off-chain. + +## Gas pricing + +Transactions using Axelar often have costs associated with their source chain, the Axelar network, and their destination chain. Whether for token transfers or for General Message Passing, every cross-chain transaction is made up of four types of costs: + +### EVM → EVM + +1. Initiating the transaction on the source chain +1. Processing the transaction through the Axelar blockchain +1. Relaying to the gateway contract on the destination chain +1. Executing the destination smart contract with the payload + +### EVM → Cosmos, Cosmos → EVM, or Cosmos → Cosmos + +1. Initiating the transaction on the source chain +1. Processing the transaction through the Axelar blockchain +1. Relaying to an IBC- or Cosmos-compatible chain, which incurs extra fees. These are embedded into processing fees. + +### Transaction fees + +To simplify paying for transaction pricing through the pipeline, Axelar has two general solutions: + +- For General Message Passing (function calls to `callContract()` or `callContractWithToken()`), a chain-agnostic relaying service is implemented to accept gas payments from users on the source chain in its native currency. +- For token transfers, a fixed “relayer fee” is deducted from the amount of assets being transferred cross-chain. + +All costs can be seen on [Axelarscan](https://axelarscan.io/) by looking at a specific transaction — for example, [from Moonbeam to BNB Chain](https://axelarscan.io/gmp/0x598d35609919bc6c0737ae229af56b2135ccf5c1b031e1bd8d45f4ec4190e5a4:65). + +## Gas pricing considerations + +### Execution fee + +While `estimateGasFee()` builds the components of a transaction’s gas costs for you, it's your responsibility to specify the estimated gas required to `_execute()` on the destination smart contract. We recommend you use the gasLimit parameter in `estimateGasFee()` to avoid underestimation and surprise fees. + +### Gas price volatility + +Certain EVM chains have highly volatile gas prices. To address this, it's advisable to pay extra gas upfront to prevent transactions from getting "stuck" in the pipeline due to out-of-gas issues. `estimateGasFee()` offers two optional parameters to improve execution certainty: + +1. A `minGasPrice` for use on the destination chain +1. A `gasMultiplier` to multiply the calculated value by a specified buffer for execution certainty + +### Refunds + +Any unused gas paid upfront for a transaction is refunded to the designated refund address by the Gas Service. + +`Refund` = `Gas deposit` - `Network Base Fee` - `Execution Fee` - `Approximate gas to process the refund` + +The estimated gas for transferring the refund is typically slightly higher than the actual gas used. + +### Round trip transaction (two-way calls) + +A relayer built off-chain will automate any "two-way calls" (GMP transactions from Chain A to Chain B and then back to Chain A) under the assumption that the total cost of the round-trip transaction will be covered on the source chain. A clear example of this implementation is provided in the [`axelar-examples`](https://github.com/axelarnetwork/axelar-examples/blob/main/examples/evm/send-ack/SendAckSender.sol#L47) repo. + +`estimateGasFee()` can be used to calculate the amount of gas required for a round trip. This method should be called twice: + +1. First to estimate the gas cost for the trip from Chain A to Chain B +1. Again to estimate the return trip from Chain B to Chain A + +The total cost is the sum of these two estimates. + + + Gas cost estimation is direction-dependent. The costs for the outbound and + return trips can significantly vary. + + +### Handling a failed or stuck transaction + +Transactions may occasionally stall while transitioning from a source chain to a destination chain. The most common reasons for these stalled transactions are: + +1. Failure to send a valid transaction from the source chain to the Axelar network for processing +1. [Insufficient gas payments made by the user](/dev/general-message-passing/debug/error-debugging#1-insufficient-gas-to-execute-the-transaction) +1. [Transaction reverting on the destination chain](/dev/general-message-passing/debug/error-debugging#2-error-in-the-destination-contract-logic) + +Every transaction is visible on [Axelarscan](https://axelarscan.io/), which provides a detailed view of where something might get "stuck." Axelarscan and the AxelarJS SDK offer two methods to [recover stalled transactions](/dev/general-message-passing/debug/transaction-recovery/): + +1. Manually executing the transaction on the destination chain +1. Adding gas to the transaction + +## GMP Express costs + +[Express transactions](/dev/general-message-passing/express) incur an additional **insurance fee** alongside existing GMP overhead fees. This extra fee acts as insurance for the Express relayer for assuming the risk of an Express transaction. If the fee is not paid, the transaction will revert to a regular non-Express GMP transaction. + +## Sample gas-estimation contract + +The following is an example of how gas fees can be paid to an `AxelarGasService` contract. Assume that `SimpleTransferContract` is a smart contract deployed on a source chain: + +```solidity +contract SimpleTransferContract { + ... + function sendToMany( + string memory destinationChain, + string memory destinationContractAddress, + address[] calldata destinationAddresses, + string memory symbol, + uint256 amount + ) external payable { + address tokenAddress = gateway.tokenAddresses(symbol); + IERC20(tokenAddress).transferFrom(msg.sender, address(this), amount); + IERC20(tokenAddress).approve(address(gateway), amount); + bytes memory payload = abi.encode(destinationAddresses); + + // msg.value is the gas amount paid to the contract. + if(msg.value > 0) { + // Pay the gas fee. + gasReceiver.payNativeGasForContractCallWithToken{value: msg.value}( + address(this), + destinationChain, + destinationContractAddress, + payload, + symbol, + amount, + msg.sender + ); + } + gateway.callContractWithToken(destinationChain, destinationContractAddress, payload, symbol, amount); + } +} +``` + +`msg.value` is the gas amount paid to the `AxelarGasService` contract. Thus, the value returned from a call to `estimateGasFee()` must be passed to `msg.value` on the front end: + +```solidity +await contract.sendToMany("moonbeam", "0x...", ["0x.."], "USDC", 1, { + value: sourceGasFee, // Value returned from calling estimateGasFee() +}); +``` + +After sending a transaction out, Axelar’s Gas Service will do the following: + +- Monitor `AxelarGasReceiver` for receipt of payment and get the amount paid as `amountPaid`. +- Match the gas paid to the correct contract calls. +- Submit the transaction to the Axelar network for confirmation. +- Execute the contract call with the `gasLimit` specified by the application. diff --git a/src/pages/dev/reference/pricing.mdx b/src/content/docs/dev/gas-service/pricing.mdx similarity index 63% rename from src/pages/dev/reference/pricing.mdx rename to src/content/docs/dev/gas-service/pricing.mdx index 0c44fedbd..98fe4ba73 100644 --- a/src/pages/dev/reference/pricing.mdx +++ b/src/content/docs/dev/gas-service/pricing.mdx @@ -1,19 +1,22 @@ -# Gas Service and Transaction Pricing +# Transaction Pricing Transactions using Axelar often have costs associated on their source chain, the Axelar network, and their destination chain. Whether for token transfers or General Message Passing, every cross-chain transaction is made up of 4 types of costs: + 1. Initiating the transaction on the source chain, -2. Processing the transaction through the Axelar blockchain -3. Relaying to the gateway contract on the destination chain -4. Executing the destination smart contract with the payload +1. Processing the transaction through the Axelar blockchain +1. Relaying to the gateway contract on the destination chain +1. Executing the destination smart contract with the payload + +To simplify paying for transaction pricing through the pipeline, Axelar has two general solutions to this problem. -To simplify paying for transaction pricing through the pipeline, Axelar has two general solutions to this problem. -* For token transfers, a fixed "relayer fee" is deducted from the amount of assets being transferred cross-chain. -* For General Message Passing (`callContract` and `callContractWithToken`), a chain-agnostic gas relaying service is implemented to accept gas payments from users on the source chain in its native currency. +- For token transfers, a fixed "relayer fee" is deducted from the amount of assets being transferred cross-chain. +- For General Message Passing (`callContract` and `callContractWithToken`), a chain-agnostic gas relaying service is implemented to accept gas payments from users on the source chain in its native currency. All costs can be seen on [Axelarscan](https://axelarscan.io) by looking at a specific transaction, [from Moonbeam to BNB Chain for example](https://axelarscan.io/gmp/0x598d35609919bc6c0737ae229af56b2135ccf5c1b031e1bd8d45f4ec4190e5a4:65). ## Token transfers via `sendToken` or `getDepositAddress` -Prices are fixed based on the source chain, destination chain, and asset. You can query these directly on the Axelar network or refer to the `Resources` tab under the `Cross-chain relayer gas fee` section. + +Prices are fixed based on the source chain, destination chain, and asset. You can query these directly on the Axelar network or refer to the `Resources` tab under the `Cross-chain relayer gas fee` section. Whether you are transferring 10 axlUSDC or 10,000,000 axlUSDC, the cost is the same. The amount sent in a transaction must exceed the cost of the fee; it otherwise remains in the queue until the aggregate amount exceeds the fee. @@ -24,58 +27,71 @@ Asset transfers were designed this way to give users a `one click` experience. T For general message passing, Axelar's gas service allows the user/dApp to pay all of the gas costs in a single transaction on the source chain in its native currency. To pay for each blockchain transaction, the gas service uses current conversion rates to translate the gas paid on the source chain for the gas cost used by Axelar and the destination chains. 1. **Network Base Fee** - The base fee for any transaction is fixed based on the chains involved, but covers three components of the transaction - * Validator confirmation voting on the Axelar Network - * Relaying of approval on the destination chain - * Costs related to delivering any possible refund on the destination chain -2. **Execution Fee (i.e. the gas to execute the `_execute` method on the destination chain)** - The execution fee is variable depending on the chains involved, and the complexity of your `_execute` method. + - Validator confirmation voting on the Axelar Network + - Relaying of approval on the destination chain + - Costs related to delivering any possible refund on the destination chain +1. **Execution Fee (i.e. the gas to execute the `_execute` method on the destination chain)** - The execution fee is variable depending on the chains involved, and the complexity of your `_execute` method. -The `estimateGasFee` method in the [AxelarJS SDK](../axelarjs-sdk/axelar-query-api#estimategasfee) calculates this total cost for you. +The `estimateGasFee` method in the [AxelarJS SDK](/dev/axelarjs-sdk/axelar-query-api/#estimategasfee) calculates this total cost for you. ### Notable Considerations -#### EXECUTION FEE -While the `estimateGasFee` method builds the components of the gas costs for you, you are still responsible to tell it the amount of gas you believe will be required to execute the `_execute` method on your destination smart contract. An optional parameter in the `estimateGasFee` method can be used to specify the estimated gas limit; otherwise a default gas limit of `700_000` gas is used. +#### Execution Fee -#### GAS PRICE VOLATILITY +While the `estimateGasFee` method builds the components of the gas costs for you, you are still responsible to tell it the amount of gas you believe will be required to execute the `_execute` method on your destination smart contract. The `gasLimit` parameter in the `estimateGasFee()` method can be used to specify the estimated gas limit. Otherwise, the gas limit will be equivalent to the execution gas cost on the destination chain. -Certain EVM chains have really volatile gas prices. To account for this, it is recommended to include certain buffers (i.e. pay additional gas upfront) to avoid situations of transactions getting "stuck" in the pipeline because of out-of-gas issues. +#### Gas Price Volatility -The `estimateGasFee` method exposes two additional optional parameters to enhance execution certainty: -1. a `minGasPrice` to be used on the destination chain, and -2. a `gasMultipler` to be used to multiply the calculated figure by a specified buffer for execution certainty. +Certain EVM chains have really volatile gas prices. To account for this, it is recommended to include certain buffers (i.e. pay additional gas upfront) to avoid situations of transactions getting "stuck" in the pipeline because of out-of-gas issues. -#### REFUNDS +The `estimateGasFee` method exposes two additional optional parameters to enhance execution certainty: + +1. A `minGasPrice` to be used on the destination chain, and +1. A `gasMultipler` to be used to multiply the calculated figure by a specified buffer for execution certainty. + +#### Refunds The remainder of any gas paid upfront for a transaction that is not used by our gas service is refunded to the specified refund address. `Refund = Gas deposit - Network Base Fee - Execution Fee - approximate gas to process the refund**.` -**Gas estimated to transfer the refund is usually a bit higher than the actual gas used. +\*\*Gas estimated to transfer the refund is usually a bit higher than the actual gas used. -#### ROUND TRIP TRANSACTIONS (TWO-WAY CALLS) +#### RoundTrips Transactions (Two-way calls) -The gas service will automate any "two-way calls" (i.e. sending GMP transactions from Chain A to Chain B with a return trip back to Chain A), assuming the entire cost of the round-trip transaction is paid on the source chain. The clearest example of this implementation can be found in our [Examples Repo](https://github.com/axelarnetwork/axelar-examples/blob/main/examples/evm/send-ack/SendAckSender.sol#L47). +The gas service will automate any "two-way calls" (i.e. sending GMP transactions from Chain A to Chain B with a return trip back to Chain A), assuming the entire cost of the round-trip transaction is paid on the source chain. The clearest example of this implementation can be found in our [Examples Repo](https://github.com/axelarnetwork/axelar-examples/blob/main/examples/evm/send-ack/SendAckSender.sol#L47). The `estimateGasFee` method can be used (yet again) to determine the amount of gas required for the round trip. The method needs to be called twice, once for the gas cost for Chain A >> B, then again for the gas cost for Chain B >> A, and the total cost would be the sum of the two estimations. Note: the gas cost estimation is direction-dependent and can be very different for the outbound and return trip directions. -#### HANDLING ERRORS +#### Handling Errors + +Transactions may intermittently stall on their way from a source chain to a destination chain. Common root causes for stalled transactions included: -Transactions may intermittently stall on their way from a source chain to a destination chain. Common root causes for stalled transactions included: 1 - failure to send a valid transaction from the source chain into the Axelar network for processing; 2 - insufficient gas payments paid by the user; 3 - transaction revert on the destination chain. +1. Failure to send a valid transaction from the source chain into the Axelar network for processing. +1. Insufficient gas payments paid by the user. +1. Transaction revert on the destination chain. -Every transaction can be seen on Axelarscan with a detailed view of where transactions get "stuck", so one can start there to debug such circumstances. Axelarscan and the AxelarJS SDK expose two approaches to recover stalled transactions: 1. manual execution of the transaction on the destination chain, or 2. add gas for transactions. More details can be found [here](../general-message-passing/debug/error-debugging) for debugging and [here](../general-message-passing/recovery) and recovery. +Every transaction can be seen on Axelarscan with a detailed view of where transactions get "stuck", so one can start there to debug such circumstances. Axelarscan and the AxelarJS SDK expose two approaches to recover stalled transactions: + +1. Manual execution of the transaction on the destination chain, or +1. Add gas for transactions. More details can be found [here](/dev/general-message-passing/debug/error-debugging/) for debugging and [here](/dev/general-message-passing/debug/transaction-recovery/) and recovery. + +## `callContractWithToken` (General Message Passing) -## callContractWithToken (General Message Passing) Fees for `callContractWithToken` are almost identical to those of `callContract`, but have an increased execution cost due to the additional gas cost of minting/releasing tokens. -## callContractWithTokenExpress ("GMP Express") +## `callContractWithTokenExpress` ("GMP Express") + Fees for GMP express include all of the same fees as `callContractWithToken`, plus: -* an `Express Fee` that covers relayer/reorg risk -* gas used to execute the express method + +- An `Express Fee` that covers relayer/reorg risk +- Gas used to execute the express method For GMP Express transactions, the total refund will then be: `Refund = Gas deposit - Express fee - Gas used to execute express method - Network Base Fee - Execution Fee - approximate gas to process the refund**.` -**Gas estimated to transfer the refund is usually a bit higher than the actual gas used. +\*\*Gas estimated to transfer the refund is usually a bit higher than the actual gas used. ## Interchain Tokens -Under the hood, creating an [Interchain Token](/dev/send-tokens/interchain-tokens) uses `callContract`, so users are responsible for the gas on the source chain to register the token, plus the addition of a `callContract` to each destination chain where the token is being registered. + +Under the hood, creating an [Interchain Token](/dev/send-tokens/interchain-tokens/intro) uses `callContract`, so users are responsible for the gas on the source chain to register the token, plus the addition of a `callContract` to each destination chain where the token is being registered. diff --git a/src/content/docs/dev/gas-service/refund.mdx b/src/content/docs/dev/gas-service/refund.mdx new file mode 100644 index 000000000..e58557d42 --- /dev/null +++ b/src/content/docs/dev/gas-service/refund.mdx @@ -0,0 +1,90 @@ +# Refund Prepaid Gas + +When using [Axelar's General Message Passing (GMP)](/dev/general-message-passing/overview/) for multichain communication, you can specify a refund address for unused gas. [Axelar's Gas Service](/dev/gas-service/intro/), with an off-chain relayer implementation, refunds any unused gas to a specified refund address. Here's a guide on how to specify this refund address in your Solidity contract. + +## Understanding the refund mechanism + +Axelar allows users to prepay gas fees required for relaying messages or executing smart contracts across different blockchains. If the gas paid exceeds the actual amount used, the excess is refunded to the sender's address. You can set the refund address in your contract when paying for the gas to direct this refund to a specific address. + +Before we dive into the implementation, it's important to understand how refunds work: + +1. When you prepay gas using `payNativeGasForContractCall()` or `payNativeGasForContractCallWithToken()`, you might overpay. +1. The excess is refunded if the actual gas used is less than what you paid. +1. The refund is automatically calculated and sent to the specified refund address. +1. Refunds are made on the source chain. + +## Specify the refund address + +In this [`CallContract`](https://github.com/axelarnetwork/axelar-examples/blob/main/examples/evm/call-contract/CallContract.sol) [example](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/call-contract) the refund address is specified in the `setRemoteValue` function: + +```solidity +function setRemoteValue( + string calldata destinationChain, + string calldata destinationAddress, + string calldata _message +) external payable { + require(msg.value > 0, 'Gas payment is required'); + + bytes memory payload = abi.encode(_message); + gasService.payNativeGasForContractCall{ value: msg.value }( + address(this), + destinationChain, + destinationAddress, + payload, + msg.sender// This is where the refund address is specified + ); + gateway.callContract(destinationChain, destinationAddress, payload); +} +``` + +The last parameter of `payNativeGasForContractCall()` is the refund address. In this case, it's set to `msg.sender`, meaning any refund will go to the address that called the `setRemoteValue()` function. + +## Customize the refund address + +You can customize the refund address by replacing `msg.sender` with any valid address. For example: + +1. To refund to a specific address: + + ```solidity + address specificRefundAddress = 0x1234...; + gasService.payNativeGasForContractCall{ value: msg.value }( + + // ... other parameters ... + specificRefundAddress + ); + ``` + +1. To refund to the contract itself: + + ```solidity + gasService.payNativeGasForContractCall{ value: msg.value }( + + // ... other parameters ... + address(this) + ); + + ``` + +1. To allow the caller to specify a refund address: + + ```solidity + function setRemoteValue + // ... other parameters ... + address refundAddress + ) external payable { + + // ... other code ... + gasService.payNativeGasForContractCall{ value: msg.value }( + + // ... other parameters ... + refundAddress + ); + // ... other code ... + } + ``` + +## Track the refund status + +After specifying the refund address, you can track the refund status on [Axelarscan](https://axelarscan.io/gmp/0x8955b3f97e2fdab2a1f9d83e6b2c71e7eba1d2d70732dbfb052be88b86d2e40f-12). + +Choosing the correct refund address is important for your contract's functionality and user experience. Always ensure that the refund address is valid and accessible. diff --git a/src/content/docs/dev/gas-service/transaction-state.mdx b/src/content/docs/dev/gas-service/transaction-state.mdx new file mode 100644 index 000000000..d54cfc542 --- /dev/null +++ b/src/content/docs/dev/gas-service/transaction-state.mdx @@ -0,0 +1,169 @@ +# Transactions: Tracking and Retrying Failed States + +Transactions in blockchain networks can occasionally encounter issues that prevent them from completing successfully. These failures can occur at different stages of the transaction process, such as during relaying from the source chain to the destination chain or during the execution phase on the destination chain. + +This guide explains how to track the status of your transactions, identify different failure states, and recover failed transactions using the [Axelarscan UI](https://axelarscan.io/) and the [AxelarJS SDK.](https://docs.axelar.dev/dev/axelarjs-sdk/intro) + +## Tracking transaction status + +When you initiate a transaction across chains, monitoring its progress is important to ensure successful completion. A typical transaction will pass through several stages: + +1. **Sent** — The transaction has been initiated and relayed to the Axelar network. +1. **Gas Paid** — Gas fees have been paid on the source chain for the transaction to proceed. +1. **Confirmed** — The transaction has been finalised on the source chain and awaits approval in the Axelar network. +1. **Approved** — The transaction has been approved by the Axelar network and is ready to be executed on the destination chain. +1. **Executed** — The transaction has been successfully executed on the destination chain. +1. **Excess Gas Refunded** — Any excess gas not used during the transaction is refunded to the sender. + +## Common failure states + +Despite following the standard flow, transactions can fail at various points due to network issues or insufficient gas fees. Here are common failure states and how to handle them: + +1. **Failure to relay from source chain (unapproved status)** + - **Issue**: The transaction fails to relay from the source chain into the Axelar network, remaining unapproved. + - **Solution**: + - **Axelarscan UI**: If the transaction is unapproved, Axelarscan will show an option to "APPROVE.” Click this to resubmit the request to the network manually. Once approved, the transaction can proceed. + - **AxelarJS SDK**: Use the SDK's `manualRelayToDestChain` method to programmatically resubmit and approve the transaction. +1. **[Failure to execute on destination chain](https://axelarscan.io/gmp/0xa5a79876ff08b9e8638778cbe25774f57385f3894d86e81b5511004bc33a8b71-14)** + - **Issue**: The transaction fails during execution on the destination chain, which may be due to network congestion, insufficient gas, or other issues. + - **Solutions**: + - **Manually execute transfer** + - **Axelarscan UI**: Click the ‘Connect’ button under the ‘Execute at destination chain’ label and then the ‘Execute’ button to trigger the execution using newly paid gas. If the manual execution fails, debug the contract and retry. + - **AxelarJS SDK**: Use the SDK's `execute` method to manually execute the transaction programmatically on the destination chain. + - **Increase gas payment** + - **Axelarscan UI**: Connect your MetaMask wallet, switch to the source chain, and add more gas by clicking the ‘Add gas at source chain’ button. This will relay the transaction with increased gas. + - **AxelarJS SDK**: Depending on whether native tokens or ERC-20 tokens are used, use the `addNativeGas` or `addGas` method to increase gas payment. +1. **[Insufficient fee](https://axelarscan.io/gmp/0x8fcfbed2e5cb17a3c3f128fc3ed5ce0a6deb2e4494bb587dd95021039bd39322-8) or [not enough gas](https://axelarscan.io/gmp/0x46d2b6c442fe11c2751ac4c4507779368ff92c20a06f4108af165a83c3fdca03-4)** + - **Issue**: The transaction fails due to an insufficient fee or not enough gas paid to cover the execution on the destination chain. + - **Solution**: Increase the gas payment as described above and resubmit the transaction. +1. [**Error execution**](https://axelarscan.io/gmp/0xd1ebf1217c37c6d510c421b28d2dfdefd596c68abca3d0bfa2efa8b8291a579d-3) + - **Issue**: An error occurs during execution, potentially due to issues with the smart contract or external factors like network congestion. + - **Solution**: Debug the contract according to the error message and retry the transaction using either the Axelarscan UI or the SDK. + +## Using AxelarJS SDK for transaction recovery + +The AxelarJS SDK provides powerful tools for programmatically managing and recovering transactions. The `AxelarGMPRecoveryAPI` module allows you to query the status of any General Message Passing (GMP) transaction and manually relay it if necessary. + +### Install the AxelarJS SDK + +```bash +npm i @axelar-network/axelarjs-sdk +``` + +### **Instantiate the AxelarGMPRecoveryAPI module** + +```tsx +import { + AxelarGMPRecoveryAPI, + Environment, +} from "@axelar-network/axelarjs-sdk"; + +const sdk = new AxelarGMPRecoveryAPI({ + environment: Environment.TESTNET, +}); +``` + +### Query transaction status with `txHash` + +You can query the status of a transaction using its hash: + +```tsx +const txHash: string = + "0xfb6fb85f11496ef58b088116cb611497e87e9c72ff0c9333aa21491e4cdd397a"; +const txStatus: GMPStatusResponse = await sdk.queryTransactionStatus(txHash); +``` + +Possible status responses for `txStatus` include: + +- **`SRC_GATEWAY_CALLED`** — The source gateway has been called. +- **`DEST_GATEWAY_APPROVED`** — The destination gateway has approved the transaction. +- **`DEST_EXECUTED`** — The transaction has been executed on the destination chain. +- **`DEST_EXECUTE_ERROR`** — An error occurred during execution on the destination chain. +- **`UNKNOWN_ERROR`** — An unknown error occurred. +- **`CANNOT_FETCH_STATUS`** — The status cannot be fetched. + +### Trigger manual relay of transaction + +If the transaction is stuck, you can trigger a manual relay: + +```tsx +const sourceTxHash = "0x.."; +const provider = new ethers.providers.JsonRpcProvider( + "", +); + +const response = await sdk.manualRelayToDestChain(sourceTxHash, { provider }); +``` + +### Execute manually + +To manually execute a transaction on the destination chain: + +```tsx +const response = await sdk.execute(sourceTxHash, { provider }); +``` + +### Increase gas payment: + +You can increase the gas payment using native tokens: + +```tsx +const txHash: string = "0x..."; +const { success, transaction, error } = await sdk.addNativeGas( + EvmChain.AVALANCHE, + txHash, +); +``` + +Or using ERC-20 tokens: + +```tsx +const gasToken = "0xGasTokenAddress"; +await erc20.approve( + GAS_RECEIVER[Environment.TESTNET][EvmChain.AVALANCHE], + amount, +); +const { success, transaction, error } = await sdk.addGas( + EvmChain.AVALANCHE, + txHash, + gasToken, +); +``` + +## Example transaction states + +The following is an example of a successful transaction and two different failed states to illustrate how to handle each situation. + +### Successful transaction + +``` +- Method: InterchainTransfer +- Status: Executed +- Source Chain: Polygon +- Destination Chain: Base +- Gas Paid: Confirmed +- Approved: Yes +- Executed: Yes +- Excess Gas Refunded: Yes + +``` + +### Failed state 1 + +``` +- Method: callContract +- Status: Error +- Issue: Failed to execute on the destination chain. +- Recovery Options: Execute manually or increase gas. +``` + +### Failed state 2 + +``` +- Method: InterchainTransfer +- Status: Not Approved +- Issue: Failed to relay from the source chain. +- Recovery Options: Manually approve the transaction. +``` + +Understanding these transaction states and the recovery tools available can help you effectively manage and troubleshoot cross-chain transactions. diff --git a/src/content/docs/dev/general-message-passing/cosmos-gmp/cosmos-2way-manual-relay.mdx b/src/content/docs/dev/general-message-passing/cosmos-gmp/cosmos-2way-manual-relay.mdx new file mode 100644 index 000000000..6fea40682 --- /dev/null +++ b/src/content/docs/dev/general-message-passing/cosmos-gmp/cosmos-2way-manual-relay.mdx @@ -0,0 +1,142 @@ +# Manual Relaying Cosmos 2-way Calls + +## Overview + +Axelar’s off-chain relayer service currently does not support the automatic processing of two-way calls through Cosmos chains. +This guide covers how to manually process these transactions to ensure successful completion. + +## Manual Relay Process + +To manually process a two-way transaction to Cosmos through the Axelar network, perform the following steps: + +1. Confirm the gateway transaction on Axelar after the source chain transaction reaches finality. +1. Monitor the Axelar network for the `MessageReceived` event. +1. Manually route the message using the `RouteMessage` transaction on Axelar. + +## Step-by-Step Guide + +### 1. Confirm the Gateway Transaction + +After your transaction on the source chain has reached finality, manually confirm it on the Axelar network using the `ConfirmGatewayTx` command. + +### Command Usage + +```bash +axelard tx evm confirm-gateway-tx \\ + \\ + \\ + --from \\ + --gas auto \\ + --gas-adjustment 1.3 \\ + -y +``` + +- ``: The source chain name +- ``: The hash of your source chain transaction +- ``: Your Axelar account name or key + +### Example + +```bash +axelard tx evm confirm-gateway-tx \\ +ethereum \\ +0x0eb22acad0b37b2ebfca573944ccd41078ab61a057be8237c62818c0928618b1 \\ + --from my_axelar_key \\ + --gas auto \\ + --gas-adjustment 1.3 \\ + -y +``` + +### Notes + +- Ensure the source chain transaction is fully confirmed before executing this command +- The `y` flag confirms the transaction without prompting + +### 2. Monitor for the `MessageReceived` Event + +After confirming the gateway transaction, wait for the [`MessageReceived`](https://github.com/axelarnetwork/axelar-core/blob/4e67aa564db2b10eec25831ed1146c94a9172c60/proto/axelar/nexus/v1beta1/events.proto#L49) event on the Axelar network. This event indicates that the message from the source chain has been received and is ready to be routed. + +### How to Monitor + +- Axelarscan Explorer: Visit [Axelarscan Testnet Explorer](https://testnet.axelarscan.io/) and search for your transactions or events related to your account. +- RPC/WebSocket: Use Axelar's RPC endpoints to programmatically listen for events by polling every block height, as indicated [here](https://github.com/axelarnetwork/axelar-core/blob/2a8810a295bfa8c5831ef8e2dcbfb0fe16d6be4d/vald/start.go#L231). + +### Event Details + +The `MessageReceived` event provides the following information: + +- **id**: A unique identifier for the message, e.g., `0x07ff5d7fa8f782f1...-6`. +- **payload_hash**: The hash of the message payload. +- **recipient**: JSON object containing the recipient's chain information and address. +- **sender**: JSON object containing the sender's chain information and address. + +**Example Event Data**: + +```json +{ + "id": "0x07ff5d7fa8f782f149a54a2d7f3fa5508777bfee11024b91a5e44e7423101ce7-6", + "payload_hash": "Oed6eTDbnou/OWAs5qipbsClgpgMeaCrWNxH1OSWxnY=", + "recipient": { + "chain": { + "name": "warden", + "supports_foreign_assets": true, + "key_type": "KEY_TYPE_NONE", + "module": "axelarnet" + }, + "address": "warden1yatzc54ln59caxxnj53rff2s359pezx3hqxpzu2tkyl2f9ud9yvsnvmcme" + }, + "sender": { + "chain": { + "name": "ethereum-sepolia", + "supports_foreign_assets": true, + "key_type": "KEY_TYPE_MULTISIG", + "module": "evm" + }, + "address": "0xc13328bA9657C94aFfbf4f7d257d61e48199802A" + } +} +``` + +### 3. Route the Message Manually + +Once the `MessageReceived` event is confirmed, manually route the message by executing `RouteMessageRequest` using [this RPC message](https://github.com/axelarnetwork/axelar-core/blob/29bb3e905af28ccf10cc1f61d50afa4b9a38038e/proto/axelar/axelarnet/v1beta1/tx.proto#L163). + +### Command Definition + +```bash +axelard tx axelarnet route-message \ + "" \ + "" \ + --from "" \ + --gas auto \ + --gas-adjustment 1.3 \ + -y +``` + +- ``: The `id` from the `MessageReceived` event. +- ``: The payload data you want to route. +- ``: Your Axelar account name or key. + +### Example + +```bash +axelard tx axelarnet route-message \ + "0x0eb22acad0b37b2ebfca573944ccd41078ab61a057be8237c62818c0928618b1-6" \ + "" \ + --from "my_axelar_key" \ + --gas auto \ + --gas-adjustment 1.3 \ + -y +``` + +### Notes + +- Replace the placeholder values with actual data from the `MessageReceived` event. +- Ensure that the payload is correctly formatted and encoded if necessary. + +## Additional Information + +- **Error Handling**: If any step fails, verify the correctness of all provided parameters and ensure network connectivity. +- **Automation**: While this process is manual due to current limitations, you can script these commands to streamline the workflow. + +If you require further assistance, please create an issue on our Github support repo [here](https://github.com/axelarnetwork/support). diff --git a/src/content/docs/dev/general-message-passing/cosmos-gmp/developer-guides/cross-chain-messaging-evm-to-cosmos.mdx b/src/content/docs/dev/general-message-passing/cosmos-gmp/developer-guides/cross-chain-messaging-evm-to-cosmos.mdx new file mode 100644 index 000000000..7a2de7302 --- /dev/null +++ b/src/content/docs/dev/general-message-passing/cosmos-gmp/developer-guides/cross-chain-messaging-evm-to-cosmos.mdx @@ -0,0 +1,792 @@ +# Cross-Chain Messaging: EVM to Cosmos + +Cross-chain messaging allows seamless communication and interaction between different blockchain ecosystems, from Ethereum Virtual Machine (EVM)-based chains to Cosmos-based chains. + +Axelar has long been the best way to connect EVM and Cosmos chains via bridged assets. With [General Message Passing](/dev/general-message-passing/overview/), that connection goes beyond bridging, supporting a new generation of cross-chain applications that combine the best of Cosmos and EVM. + +In this tutorial, you will learn how to: + +- Build and deploy an EVM smart contract on Avalanche +- Build and deploy a CosmWasm contract on Osmosis +- Send a message from a CosmWasm contract to Avalanche +- Read a message from an EVM smart contract on Avalanche +- Send a message from EVM to a CosmWasm contract on Osmosis +- Read a message from a CosmWasm contract on Osmosis + +## Prerequisites + +- Practical understanding of [how to build a CosmWasm contract](https://docs.cosmwasm.com/docs/getting-started/intro/) +- Basic understanding of [how to build EVM smart contract](https://hacken.io/discover/create-smart-contract/) +- Install `osmosisd` CLI + - Download and install the `osmosisd` CLI by following the instructions [here](https://docs.osmosis.zone/osmosis-core/osmosisd). If the installation wizard does not work, build from the source using the following commands: + +```bash +git clone https://github.com/osmosis-labs/osmosis.git +cd osmosis +make build +``` + +- Create a Wallet + - If you don't have a wallet yet, create one using the following command: + +```bash +osmosisd keys add wallet +``` + +- Obtain Test Tokens + - Get some test tokens from the [Osmosis Testnet Faucet](https://faucet.testnet.osmosis.zone/). +- Ensure you have [Docker](https://www.docker.com/) installed to build the contract. +- A [wallet](https://metamask.io/) with an Avax token for testing. If you don’t have these tokens, you can get Avax from the [Avalanche faucet](https://docs.avax.network/build/dapp/smart-contracts/get-funds-faucet). + +## What is a CosmWasm contract? + +[CosmWasm](https://docs.cosmos.network/v0.46/CosmWasm/) is a smart contracting platform designed for the Cosmos ecosystem. In simple terms, it utilizes WebAssembly (Wasm) in the Cosmos (Cosm) way. + +CosmWasm contracts provide advanced smart contract capabilities within the Cosmos ecosystem, leveraging the performance and security advantages of WebAssembly and [Rust](https://www.rust-lang.org/). This allows developers to create complex, interoperable, and secure decentralized applications across various Cosmos-based blockchains. + +## What is Axelar Cosmos general message passing (GMP) + +[General Message Passing (GMP)](/dev/general-message-passing/overview/) empowers developers with the ability to build interchain-native applications that make cross-chain function calls and synchronize state in a way that is completely abstracted for the user. + +In simpler terms, Axelar GMP enables developers to build applications that integrate functions (such as smart contracts) hosted on various connected chains, similar to using Lego bricks. + +Axelar has expanded General Message Passing (GMP) to support Cosmos blockchains. With Axelar, you can now send and receive messages on EVM chains and Cosmos chains. Messages sent to Cosmos chains can be received by [CosmWasm smart contracts](https://github.com/axelarnetwork/evm-cosmos-gmp-sample/tree/main/cosmwasm-integration/) (on blockchains with CosmWasm support), or those messages can be received [natively at the consensus layer as part of Go code](https://github.com/axelarnetwork/evm-cosmos-gmp-sample/tree/main/native-integration). + +Cosmos GMP works by sending and receiving through [IBC’s memo field](https://medium.com/the-interchain-foundation/moving-beyond-simple-token-transfers-d42b2b1dc29b). Cosmos chains that support GMP should [integrate the appropriate middleware](/dev/cosmos-gmp/overview/#chain-support) and [verify the message source](/dev/general-message-passing/cosmos-gmp/overview/#establishing-a-path-of-trust). + +## Project setup and installation + +To start the project setup and installation quickly, clone this [**project on GitHub**](https://github.com/axelarnetwork/send-message-from-cosmos-to-evm-example) using the following command: + +```bash +git clone https://github.com/axelarnetwork/send-message-from-cosmos-to-evm-example.git +``` + +Make sure you're on the `start` branch using the following command: + +```bash +git checkout start +``` + +Next, change the directory into the cloned folder and install the project locally using npm with the following command: + +```bash +cd send-message-from-cosmos-to-evm-example && npm i +``` + +### Create a `.env` file + +Run the following command to create an [**`.env`** file](https://blog.bitsrc.io/a-gentle-introduction-to-env-files-9ad424cc5ff4): + +```bash +touch .env +``` + +Add your axl private key to `.env` + +[Export your osmo prefix address private key](https://help.keplr.app/articles/how-to-view-your-private-key) and add it to the `.env` file you just created: + +```bash +PRIVATE_KEY= // Add your account private key here +``` + +## Build and deploy a CosmWasm contract on Osmosis + +The cloned project has the following folder structure that already contains the WASM contract; the next step you will be taking is to build and deploy the contract. + +```markdown +├── wasm +│ ├── src +│ │ ├── contract.rs +│ │ ├── error.rs +│ │ ├── ibc.rs +| │ ├── lib.rs +│ │ ├── msg.rs +│ │ ├── state.rs +| │ ├── unit_tests.rs +│ ├── cargo.lock +│ ├── corgo.toml +├── .env +├── node_modules +├── package.json +├── package-lock.json +├── README.md +└── .gitignore +``` + +In the `contract.rs`, the following was implemented: + +- **Initialization**: The `instantiate` function sets up the contract by saving the initial configuration and a placeholder message into the contract's storage. +- **Message Sending**: The `execute` function handles various `ExecuteMsg` variants to send messages to EVM or Cosmos chains using Axelar GMP, constructing and dispatching messages with the necessary payload and metadata. +- **Message Reception**: The contract includes functions (`receive_message_evm` and `receive_message_cosmos`) to receive and store messages from EVM and Cosmos chains, decoding the payload and saving it in the contract's state. +- **IBC Integration**: It leverages Inter-Blockchain Communication (IBC) to send cross-chain messages, specifically designed to work with Axelar's GMP for transferring messages and funds across chains. +- **Query Stored Messages**: The `query` function enables retrieval of stored messages via the `GetStoredMessage` query, returning the sender and message details stored in the contract. + +### Build the CosmWasm contract + +Navigate into the `wasm` folder and build the contract with the following command: + +```bash +docker run --rm -v "$(pwd)":/code \ + --mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \ + --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ + cosmwasm/rust-optimizer:0.12.13 +``` + +> Make sure you have Docker daemon running before running the command above. + +You should see something similar to what is displayed below on your terminal if the build is successful: + +```bash +Info: RUSTC_WRAPPER=sccache +Info: sccache stats before build +Compile requests 0 +Compile requests executed 0 +Cache hits 0 +Cache misses 0 +Cache timeouts 0 +Cache read errors 0 +Forced recaches 0 +Cache write errors 0 +Compilation failures 0 +Cache errors 0 +Non-cacheable compilations 0 +Non-cacheable calls 0 +Non-compilation calls 0 +Unsupported compiler calls 0 +Average cache write 0.000 s +Average cache read miss 0.000 s +Average cache read hit 0.000 s +Failed distributed compilations 0 +Cache location Local disk: "/root/.cache/sccache" +Cache size 0 bytes +Max cache size 10 GiB +Building contract in /code ... + Finished release [optimized] target(s) in 0.44s +Creating intermediate hash for send_receive.wasm ... +ebea0ee2e90b34fe4d55bd011051213938b95d596d6b56853c6e3e9bda8630ad ./target/wasm32-unknown-unknown/release/send_receive.wasm +Optimizing send_receive.wasm ... +Creating hashes ... +c255d85938b647f59fcb77fe9d52ceefef5e510cd71364c522ce9ce25d3de8cc send_receive.wasm +Info: sccache stats after build +Compile requests 0 +Compile requests executed 0 +Cache hits 0 +Cache misses 0 +Cache timeouts 0 +Cache read errors 0 +Forced recaches 0 +Cache write errors 0 +Compilation failures 0 +Cache errors 0 +Non-cacheable compilations 0 +Non-cacheable calls 0 +Non-compilation calls 0 +Unsupported compiler calls 0 +Average cache write 0.000 s +Average cache read miss 0.000 s +Average cache read hit 0.000 s +Failed distributed compilations 0 +Cache location Local disk: "/root/.cache/sccache" +Cache size 0 bytes +Max cache size 10 GiB +done +``` + +### Upload the CosmWasm contract + +Next, you need to upload the contract using the following command: + +```bash +osmosisd tx wasm store ./artifacts/send_receive.wasm --from wallet --gas-prices 0.4uosmo --gas auto --gas-adjustment 1.5 -y -b sync --output json --node https://rpc.osmotest5.osmosis.zone:443 --chain-id osmo-test-5 +``` + +You should see something similar to what is displayed below on your terminal if the upload is successful: + +```bash +gas estimate: 3150117 +{ + "height":"0", + "txhash":"339C8D4E8BB10E0DD337F79ACC26BB825C341E6DAFE803C5E8F8C2B42E9D5A33", + "codespace":"","code":0,"data":"", + "raw_log":"","logs":[], + "info":"","gas_wanted":"0","gas_used":"0","tx":null, + "timestamp":"","events":[] +} +``` + +### Instantiate the CosmWasm contract + +To instantiate the CosmWasm contract, you will need a `CodeId`. To retrieve that, copy the transaction hash from the terminal response and paste it on [Mintscan](https://www.mintscan.io/); in the transaction details, you should see a `CodeId` similar to [this](https://www.mintscan.io/osmosis-testnet/tx/339C8D4E8BB10E0DD337F79ACC26BB825C341E6DAFE803C5E8F8C2B42E9D5A33/?height=10285351#:~:text=osmo12qg7q97ny9yhqew3s2gf4h3mkzjnfxcdzvjuhs-,Code%20Id%3A,-9%2C726). + +Next, instantiate the contract with the following command: + +```bash +osmosisd tx wasm instantiate '{"channel":"channel-4118"}' --from wallet --label "send_receive" --gas-prices 0.1uosmo --gas auto --gas-adjustment 1.3 --no-admin -y -b sync --output json --node https://rpc.osmotest5.osmosis.zone:443 --chain-id osmo-test-5 +``` + +Replace `` with the actual code ID of your transaction. You should see something similar to what is displayed below on your terminal if the instantiation is successful: + +```bash +gas estimate: 208330 +{ + "height":"0", + "txhash":"6F2FD21EF41267562826444DB29091CA163941BC31AB5FCC085A42B3F67E2317", + "codespace":"","code":0,"data":"","raw_log":"","logs":[], + "info":"","gas_wanted":"0","gas_used":"0", + "tx":null,"timestamp":"","events":[] + } +``` + +You have successfully built, uploaded, and instantiated the CosmWasm contract. In the next section, you will build and deploy the EVM smart contract on Avalanche in this example and then interact with the EVM contract from the CosmWasm contract. + +### Save the CosmWasm contract address + +You will need the CosmWasm contract address later in this tutorial. You can find it in the contract details on Mintscan by pasting the transaction hash and saving it somewhere. In this example, the contract address is `osmo1vqgrchlfuymkjrzmrjznpam3xtzfemthzue43yt8l4ug046rtvwqarcl8r`. + +## Build and deploy an EVM smart contract on Avalanche + +In this session, you will build and deploy an EVM smart contract to Avalanche, a contract you will interact with from the CosmWasm you deployed. + +To quickly build and deploy the EVM smart contract, you can use [**https://remix.ethereum.org/**](https://remix.ethereum.org/), a powerful toolset for developing, deploying, debugging, and testing Ethereum and EVM-compatible smart contracts. + +### Build contract + +Create a new file titled `SendReceive.sol` inside the `contracts` folder and copy the code from this [**gist**](https://gist.github.com/Olanetsoft/ede55a81d4953831de728f902a4280b2) into it. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +import {AxelarExecutable} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol"; +import {IAxelarGateway} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol"; +import {IAxelarGasService} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol"; +import {StringToAddress, AddressToString} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/utils/AddressString.sol"; + +contract SendReceive is AxelarExecutable { + using StringToAddress for string; + using AddressToString for address; + + IAxelarGasService public immutable gasService; + string public chainName; // name of the chain this contract is deployed to + + struct Message { + string sender; + string message; + } + + Message public storedMessage; // message received from _execute + + constructor( + address gateway_, + address gasReceiver_, + string memory chainName_ + ) AxelarExecutable(gateway_) { + gasService = IAxelarGasService(gasReceiver_); + chainName = chainName_; + } + + function send( + string calldata destinationChain, + string calldata destinationAddress, + string calldata message + ) external payable { + require(msg.value > 0, 'Gas payment is required'); + + // 1. Generate GMP payload + bytes memory executeMsgPayload = abi.encode(msg.sender.toString(), message); + bytes memory payload = _encodePayloadToCosmWasm(executeMsgPayload); + + // 2. Pay for gas + gasService.payNativeGasForContractCall{value: msg.value}( + address(this), + destinationChain, + destinationAddress, + payload, + msg.sender + ); + + // 3. Make GMP call + gateway.callContract(destinationChain, destinationAddress, payload); + } + + function _encodePayloadToCosmWasm(bytes memory executeMsgPayload) internal view returns (bytes memory) { + // Schema + // bytes4 version number (0x00000001) + // bytes ABI-encoded payload, indicating function name and arguments: + // string CosmWasm contract method name + // dynamic array of string CosmWasm contract argument name array + // dynamic array of string argument abi type array + // bytes abi encoded argument values + + // contract call arguments for ExecuteMsg::receive_message_evm{ source_chain, source_address, payload } + bytes memory argValues = abi.encode( + chainName, + address(this).toString(), + executeMsgPayload + ); + + string[] memory argumentNameArray = new string[](3); + argumentNameArray[0] = "source_chain"; + argumentNameArray[1] = "source_address"; + argumentNameArray[2] = "payload"; + + string[] memory abiTypeArray = new string[](3); + abiTypeArray[0] = "string"; + abiTypeArray[1] = "string"; + abiTypeArray[2] = "bytes"; + + bytes memory gmpPayload; + gmpPayload = abi.encode( + "receive_message_evm", + argumentNameArray, + abiTypeArray, + argValues + ); + + return abi.encodePacked( + bytes4(0x00000001), + gmpPayload + ); + } + + function _execute( + bytes32 /*commandId*/, + string calldata /*sourceChain*/, + string calldata /*sourceAddress*/, + bytes calldata payload + ) internal override { + (string memory sender, string memory message) = abi.decode(payload, (string, string)); + storedMessage = Message(sender, message); + } +} +``` + +In the contract above, + +- **Contract Initialization**: The `SendReceive` contract inherits from `AxelarExecutable` and initializes the Axelar gas service and chain name in its constructor +- **Sending Messages**: The `send` function allows users to send messages to a specified destination chain and address, requiring a gas payment. It generates a General Message Passing (GMP) payload, pays for the gas, and makes the call through the Axelar gateway +- **Payload Encoding**: The `_encodePayloadToCosmWasm` internal function encodes the message payload into a specific format required for CosmWasm contracts, including schema versioning and argument encoding +- **Message Reception**: The `_execute` function decodes the received message payload and stores the message in the contract's state, handling incoming messages from other chains + +### Compile contract + +You can proceed to compile the smart contract. Click the compile icon, and then the compile buttons are shown below. + +

    + +

    + +### Deploy contract + +Deploying the smart contract to Avalanche testnets requires specifying both the Axelar Gateway Service and the Gas Service contract in the argument. [Here is the list](/resources/contract-addresses/testnet/) of Axelar Gas Service and Gateway contracts for all the chains currently supported by Axelar. + +This contract you want to deploy requires the Gas Service, Gateway, and Chain Name, which will be passed on to the constructor before deployment, as shown below. + +Click the deploy icon on Remix, as shown below. + +

    + +

    + +Select the deployment target, Injected Provider - MetaMask. + +Add the Axelar `Gateway`: `0xC249632c2D40b9001FE907806902f63038B737Ab` and the `Gas Service`: `0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6` contract address deployed on Avalanche and chain name: `Avalanche`. + +Next, click the `transact` button. + +

    + +

    + +### Copy contract address + +Copy the contract address and save it somewhere; you will need it in the following section to send a message from the Coswasm contract to Avalanche. + +

    + +

    + +Address [0x113BD07720a5Ae9104C5d54fBDfA83F792afc8e0](https://testnet.snowtrace.io/address/0x113BD07720a5Ae9104C5d54fBDfA83F792afc8e0) Details - Avalanche Testnet. + +## Send a message from a CosmWasm contract to Avalanche + +You are all set to send a message from the CosmWasm contract you deployed to Avalanche. Create a new file with the name `index.js` in the root directory. + +### Import dependencies + +To import the required dependencies add the following code snippet. + +```js +require("dotenv").config(); +const { GasPrice } = require("@cosmjs/stargate"); +const { SigningCosmWasmClient } = require("@cosmjs/cosmwasm-stargate"); +const { AxelarQueryAPI } = require("@axelar-network/axelarjs-sdk"); +const { DirectSecp256k1Wallet } = require("@cosmjs/proto-signing"); +const { fromHex } = require("@cosmjs/encoding"); +``` + +- The script uses `dotenv` to load environment variables and imports essential modules from `@cosmjs/stargate`, `@cosmjs/cosmwasm-stargate`, `@axelar-network/axelarjs-sdk`, and `@cosmjs/proto-signing` to interact with Cosmos and Axelar networks +- The `fromHex` function from `@cosmjs/encoding` is imported for decoding hex strings, which is crucial for handling private keys and other hexadecimal data formats + +### Set up the environment, API settings, token, and contract details + +You need to define a few variables to be used in the script for the environment, API settings, token, and contract details. To do that, add the following code snippet. + +```js +//... + +// Environment and API settings +const privateKey = process.env.PRIVATE_KEY; +const rpcEndpoint = "https://rpc.osmotest5.osmosis.zone/"; +const chainId = "osmosis-7"; +const testnetEnvironment = "testnet"; + +// Token and contract details +const aUSDC = + "ibc/1587E7B54FC9EFDA2350DC690EC2F9B9ECEB6FC31CF11884F9C0C5207ABE3921"; // aUSDC IBC address +const osmoDenom = "uosmo"; +const gasPriceString = `0.4${osmoDenom}`; +const wasmContractAddress = + "osmo1vqgrchlfuymkjrzmrjznpam3xtzfemthzue43yt8l4ug046rtvwqarcl8r"; +``` + +### Add EVM contract details + +```js +//... + +// Message details +const destinationChain = "Avalanche"; +const destinationAddress = "0x113BD07720a5Ae9104C5d54fBDfA83F792afc8e0"; // Replace with the Avalanche address you deployed +const messageToSend = "Hello world from Osmosis!"; +``` + +Replace `0x113BD07720a5Ae9104C5d54fBDfA83F792afc8e0` with the contract address you copied from Remix earlier when you deployed on Avalanche. + +### Decode the Private Key and Create a Wallet + +Now, decode your private key and create a wallet: + +```js +//... + +(async () => { + try { + // Decode the private key from hex + const decodedPrivateKey = fromHex(privateKey); + + // Create a wallet from the private key + const wallet = await DirectSecp256k1Wallet.fromKey( + decodedPrivateKey, + "osmo", + ); + const [{ address }] = await wallet.getAccounts(); + } catch (error) { + console.error("An error occurred:", error); + } +})(); +``` + +### Connect to the Client + +Set up the client to interact with the blockchain: + +```js +//... + +// Connect to the client +const gasPrice = GasPrice.fromString(gasPriceString); +const client = await SigningCosmWasmClient.connectWithSigner( + rpcEndpoint, + wallet, + { gasPrice }, +); +``` + +### Retrieve and Log Balances + +Retrieve the balances of aUSDC and OSMO tokens and log them: + +```js +//... + +// Retrieve balances +const balanceUsdc = await client.getBalance(address, aUSDC); +const balanceOsmo = await client.getBalance(address, osmoDenom); + +// Log wallet information +console.log("----- Wallet Info -----"); +console.log(`Wallet address: ${address}`); +console.log(`aUSDC balance: ${balanceUsdc.amount / 1e6} aUSDC`); +console.log(`Osmo balance: ${balanceOsmo.amount / 1e6} OSMO\\n`); +``` + +### Estimate Gas Fee + +Estimate [the gas fee](/dev/gas-service/pay-gas/) for sending the message: + +```js +//... + +// Estimate gas fee +const api = new AxelarQueryAPI({ environment: testnetEnvironment }); +const gasAmount = await api.estimateGasFee( + chainId, + destinationChain, + 100000, + "auto", + "aUSDC", +); +console.log(`Estimated gas fee: ${parseInt(gasAmount) / 1e6} aUSDC`); +``` + +### Check for Sufficient Balances + +Ensure you have enough balances to cover the gas fees: + +```js +//... + +// Check for sufficient balances +if (balanceUsdc.amount < gasAmount) { + console.error("Insufficient aUSDC balance to pay for gas fee"); + return process.exit(0); +} + +if (balanceOsmo.amount < 1e6) { + console.error("Insufficient OSMO balance to pay for gas fee"); + return process.exit(0); +} +``` + +### Query Message from the Osmosis Contract + +Retrieve a stored message from the Osmosis contract: + +```js +//... + +// Query message from the osmosis contract +const response = await client.queryContractSmart(wasmContractAddress, { + get_stored_message: {}, +}); +console.log("Message from Osmosis contract:", response.message); +``` + +### Prepare and Send the Message + +Prepare the payload and send the message to the Osmosis contract: + +```js +//... + +// Prepare payload to send message to osmosis contract +const payload = { + send_message_evm: { + destination_chain: destinationChain, + destination_address: destinationAddress, + message: messageToSend, + }, +}; + +const fee = { + amount: gasAmount, + denom: aUSDC, +}; + +console.log("Sending message to Osmosis contract..."); + +// Execute transaction +const result = await client.execute( + address, + wasmContractAddress, + payload, + "auto", + undefined, + [fee], +); + +console.log("Sent:", result.transactionHash); +``` + +### Test sending a message from Coswasm contract to Avalanche + +You have successfully implemented sending messages from the CosmWasm contract you deployed earlier. It's time to test the implementation. Use the following command to run the script and ensure you are in the project's root directory. + +```bash +node index.js +``` + +You should see something similar to what is displayed below on your terminal if the test is successful: + +```bash +----- Wallet Info ----- +Wallet address: osmo16m62wcd7dyednttjgayc08n22z509a70vcekuu +aUSDC balance: 48.553691 aUSDC +Osmo balance: 109.698386 OSMO + +Estimated gas fee: 0.344874 aUSDC +Message from Osmosis contract: none +Sending message to Osmosis contract... +Sent: F19AB19C94794CF5BD2E480E1CEFD893D1E74E7CC709ADC8260736BCC253AD27 +``` + +In case you run into an error like the following: + +```bash +Error: Client network socket disconnected before secure TLS connection was established + at connResetException (node:internal/errors:705:14) + at TLSSocket.onConnectEnd (node:_tls_wrap:1594:19) + at TLSSocket.emit (node:events:525:35) + at endReadableNT (node:internal/streams/readable:1358:12) + at processTicksAndRejections (node:internal/process/task_queues:83:21) { + code: 'ECONNRESET', + path: null, + host: 'rpc.osmotest5.osmosis.zone', + port: 443, + localAddress: undefined +} +``` + +Wait a bit and retry. + +If you encounter the error `"Insufficient aUSDC balance to pay for gas fee,"` please proceed to the [Axelar Discord server](https://discord.com/invite/axelar). In the faucet channel, kindly paste your axl wallet address in this format: `!faucet axelar16m62wcd7dyednttjgayc08n22z509a70qduwp0`, and then conduct an IBC transfer to your osmo wallet address. + +Check transaction on Axelarscan testnet. + +If you do not have any errors, you can copy the transaction hash logged on the console, head over to the [Axelarscan testnet](https://testnet.axelarscan.io/), and paste it; you should be able to see how the message is sent from Osmosis to Avalanche via Axelar. You can find an example of the transaction [here](https://testnet.axelarscan.io/gmp/F19AB19C94794CF5BD2E480E1CEFD893D1E74E7CC709ADC8260736BCC253AD27). + +## Read a message from an EVM smart contract on Avalanche + +You have successfully sent a message from your CosmWasm contract to Avalanche; let's confirm that the message was actually sent and arrived on Avalanche. + +Head back to [https://remix.ethereum.org/](https://remix.ethereum.org/), find the contract you deployed earlier, and click on the `storedMessage` button, as shown below. You should see "Hello world from Osmosis!" logged, which indicates that your message was successfully sent from the CosmWasm contract and received on the Avalanche contract. + +

    + +

    + +## Send a message from EVM to a CosmWasm contract on Osmosis + +You have been able to send the message successfully in the previous step; now, proceed to send a message from Avalanche to the same CosmWasm contract on Osmosis. To do that, on Remix, click on the arrow icon beside the “Send” button and enter the following details. + +```bash +destinationChain: osmosis-7 + +destinationAddress: osmo1vqgrchlfuymkjrzmrjznpam3xtzfemthzue43yt8l4ug046rtvwqarcl8r + +message: Hello from Avalanche +``` + +Make sure to replace `osmo1vqgrchlfuymkjrzmrjznpam3xtzfemthzue43yt8l4ug046rtvwqarcl8r` with your contract address on Osmosis. + +

    + +

    + +Next, pass a gas value in Gwei, in this example we passed 10000000 Gwei. + +

    + +

    + +

    + +

    + +After confirming the transaction on the MetaMask popup, you can proceed to verify the transaction onchain on the Axelarscan testnet by copying the transaction hash and pasting it. Here is an [example](https://testnet.axelarscan.io/gmp/0x181b558f4ae74812b8ab0cacbf5b2cf4abe51dee713e15fcf1038fe441f722c0). + +## Read a message from a CosmWasm contract on Osmosis + +In the previous step, you have successe=fully sent a message from Avalanche to Osmosis, in this step you will read the message from Osmosi to confirm it was truly received on Osmosis. To do that, create a new file, `read.js`, in the root folder of your project and add the following code snippet. + +```js +require("dotenv").config(); +const { GasPrice } = require("@cosmjs/stargate"); +const { SigningCosmWasmClient } = require("@cosmjs/cosmwasm-stargate"); +const { DirectSecp256k1Wallet } = require("@cosmjs/proto-signing"); +const { fromHex } = require("@cosmjs/encoding"); + +// Environment and API settings +const privateKey = process.env.PRIVATE_KEY; +const rpcEndpoint = "https://rpc.osmotest5.osmosis.zone/"; + +// Token and contract details +const aUSDC = + "ibc/1587E7B54FC9EFDA2350DC690EC2F9B9ECEB6FC31CF11884F9C0C5207ABE3921"; +const osmoDenom = "uosmo"; +const gasPriceString = `0.4${osmoDenom}`; +const wasmContractAddress = + "osmo1vqgrchlfuymkjrzmrjznpam3xtzfemthzue43yt8l4ug046rtvwqarcl8r"; + +(async () => { + try { + // Decode the private key from hex + const decodedPrivateKey = fromHex(privateKey); + + // Create a wallet from the private key + const wallet = await DirectSecp256k1Wallet.fromKey( + decodedPrivateKey, + "osmo", + ); + const [{ address }] = await wallet.getAccounts(); + + // Connect to the client + const gasPrice = GasPrice.fromString(gasPriceString); + const client = await SigningCosmWasmClient.connectWithSigner( + rpcEndpoint, + wallet, + { gasPrice }, + ); + + // Retrieve balances + const balanceUsdc = await client.getBalance(address, aUSDC); + const balanceOsmo = await client.getBalance(address, osmoDenom); + + // Log wallet information + console.log("----- Wallet Info -----"); + console.log(`Wallet address: ${address}`); + console.log(`aUSDC balance: ${balanceUsdc.amount / 1e6} aUSDC`); + console.log(`Osmo balance: ${balanceOsmo.amount / 1e6} OSMO\n`); + + // Query message from the osmosis contract + const response = await client.queryContractSmart(wasmContractAddress, { + get_stored_message: {}, + }); + console.log("Message from Osmosis contract:", response.message); + } catch (error) { + console.error("An error occurred:", error); + } +})(); +``` + +You should see something similar to what is displayed below on your terminal if the test is successful: + +```bash +----- Wallet Info ----- +Wallet address: osmo16m62wcd7dyednttjgayc08n22z509a70vcekuu +aUSDC balance: 48.208817 aUSDC +Osmo balance: 109.58592 OSMO + +Message from Osmosis contract: Hello from Avalanche +``` + +Woohoo! If you made it this far, congratulations. + +## Conclusion + +In this tutorial, you have learned how to build and deploy an EVM smart contract on Avalanche, build and deploy a CosmWasm contract on Osmosis, send a message from a CosmWasm contract to Avalanche, read a message from an EVM smart contract on Avalanche, send a message from EVM to a CosmWasm contract on Osmosis, and read a message from a CosmWasm contract on Osmosis. + +By mastering these steps, you can effectively create interoperable decentralized applications that leverage the strengths of both EVM-based and Cosmos-based blockchain networks. + +## Reference + +- [Axelar Cosmos General Message Passing](/dev/general-message-passing/cosmos-gmp/overview/) +- [Axelarscan Testnet](https://testnet.axelarscan.io/) +- [Osmosis Testnet Faucet](https://faucet.testnet.osmosis.zone/) +- [Osmosis Testnet Explorer](https://mintscan.io/osmosis-testnet) diff --git a/src/pages/dev/general-message-passing/cosmos-gmp.mdx b/src/content/docs/dev/general-message-passing/cosmos-gmp/overview.mdx similarity index 56% rename from src/pages/dev/general-message-passing/cosmos-gmp.mdx rename to src/content/docs/dev/general-message-passing/cosmos-gmp/overview.mdx index 0daa4c35e..267a92462 100644 --- a/src/pages/dev/general-message-passing/cosmos-gmp.mdx +++ b/src/content/docs/dev/general-message-passing/cosmos-gmp/overview.mdx @@ -1,29 +1,30 @@ ---- -templateEngineOverride: md ---- -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; # Cosmos General Message Passing Axelar has expanded General Message Passing (GMP) to support Cosmos blockchains. With Axelar, you can now send and receive messages on EVM chains and Cosmos chains. Messages sent to Cosmos chains can be received by [CosmWasm smart contracts](https://github.com/axelarnetwork/evm-cosmos-gmp-sample/tree/main/cosmwasm-integration/) (on blockchains with CosmWasm support), or those messages can be received [natively at the consensus layer as part Go code](https://github.com/axelarnetwork/evm-cosmos-gmp-sample/tree/main/native-integration). +Cosmos GMP works by sending and receiving through [IBC's memo field](https://medium.com/the-interchain-foundation/moving-beyond-simple-token-transfers-d42b2b1dc29b). Cosmos chains looking to support GMP should [integrate the appropriate middleware](#chain-support) and [verify message source](#establishing-a-path-of-trust). -To see full examples of sending and receiving messages in all cases, check out our full [Cosmos GMP Example Project](https://github.com/axelarnetwork/evm-cosmos-gmp-sample/). + To see full examples of sending and receiving messages in all cases, check out + our full [Cosmos GMP Example + Project](https://github.com/axelarnetwork/evm-cosmos-gmp-sample/). ## Messages from EVM to CosmWasm -To send a message from an EVM chain to a Cosmos CosmWasm contract, the payload must be encoded before calling the [standard](./gmp-messages) `payNativeGasForContractCall` and `callContract` methods (or [token-including equivalents](./gmp-tokens-with-messages)). You must also specify the destination method you are calling. +To send a message from an EVM chain to a Cosmos CosmWasm contract, the payload must be encoded before calling the [standard](/dev/general-message-passing/gmp-messages) `payNativeGasForContractCall` and `callContract` methods (or [token-including equivalents](/dev/general-message-passing/gmp-tokens-with-messages)). You must also specify the destination method you are calling. The payload must specify: -1. **string** - The method name of the CosmWasm contract to call -1. **string[]** - The names of all arguments -1. **string[]** - the types of all arguments -1. **bytes** - the values of all arguments +1. `string` - The method name of the CosmWasm contract to call +1. `string[]` - The names of all arguments +1. `string[]` - the types of all arguments +1. `bytes` - the values of all arguments + +### Multi-send Example encoding -### MultiSend Example encoding This example encodes a string array of recipients, as you can see in our [example of sending tokens and recipients](https://github.com/axelarnetwork/axelar-examples/blob/main/examples/evm/call-contract-with-token/DistributionExecutable.sol). ```solidity @@ -41,6 +42,7 @@ bytes memory payloadToCW = abi.encodePacked( ``` ## Messages from EVM to Native Cosmos + When sending a message to a Cosmos chain with native (consensus layer) support for GMP, you must encode a version number with the intended payload. This allows the consensus layer to know what to do with the payload. ```solidity @@ -50,13 +52,11 @@ bytes memory payload = abi.encodePacked( ); ``` - ## Messages from Native Cosmos -To send a message from Naive Cosmos Go code, you must send a message to the Axelar GMP Account (`axelar1dv4u5k73pzqrxlzujxg3qp8kvc3pje7jtdvu72npnt5zhq05ejcsn5qme5s`) via IBC. +To send a message from Native Cosmos Go code, you must send a message to the Axelar GMP Account (`axelar1dv4u5k73pzqrxlzujxg3qp8kvc3pje7jtdvu72npnt5zhq05ejcsn5qme5`) via IBC. - -When sending messages from Cosmos, you should perform standard GMP ABI encoding via the `github.com/ethereum/go-ethereum/accounts/abi` package. +When sending messages from Cosmos, you should perform standard GMP ABI encoding via the [`github.com/ethereum/go-ethereum/accounts/abi`](https://github.com/ethereum/go-ethereum/tree/master/accounts/abi) package. ```go // build payload that can be decoded by solidity @@ -105,7 +105,8 @@ if err != nil { ``` ## Messages from CosmWasm -To send a message from CosmWasm Rust code, you must send a message to the Axelar Gateway (`axelar1dv4u5k73pzqrxlzujxg3qp8kvc3pje7jtdvu72npnt5zhq05ejcsn5qme5s`) via IBC. + +To send a message from CosmWasm Rust code, you must send a message to the Axelar Gateway (`axelar1dv4u5k73pzqrxlzujxg3qp8kvc3pje7jtdvu72npnt5zhq05ejcsn5qme5`) via IBC. You should encode your payload using [ethabi](https://github.com/rust-ethereum/ethabi). @@ -162,6 +163,41 @@ pub fn multi_send_to_evm( ``` ## Chain Support + For a Cosmos blockchain to support receiving GMP messages (naively or via CosmWasm), it should implement the appropriate middleware in Go as part of the consensus layer. -See our [Sample GMP Middleware](https://github.com/axelarnetwork/evm-cosmos-gmp-sample/tree/main/native-integration/sample-middleware). \ No newline at end of file +If you have CosmWasm on your Cosmos chain and want to be able to receive and deliver messages, install [Osmosis IBC-hooks](https://github.com/osmosis-labs/osmosis/tree/main/x/ibc-hooks). + +If you don’t support CosmWasm on your Cosmos chain, you'll need to implement and install your own Axelar GMP module to receive and execute messages. See our [sample reference implementation](https://github.com/axelarnetwork/evm-cosmos-gmp-sample/tree/main/native-integration/sample-middleware). + +## Establishing a Path of Trust + +Because IBC messages are permissionless, you'll want to ensure you verify the source of all messages. + +When you receive a packet on Cosmos chain, you'll need to verify: + +1. That the packet came from Axelar (verify IBC channel; Axelar GMP sender account). + + Specify the Axelar IBC channel by allowlisting the channel hash. + + - **[CosmWasm](https://github.com/osmosis-labs/osmosis/blob/main/x/ibc-hooks/README.md#cosmwasm-contract-execution-format)** + + For example, in your CosmWasm code, you can combine the IBC hook, the channel ID, and the Axelar GMP account to verify the channel matches the expected channel. + + ```rust + + `Bech32(Hash("ibc-wasm-hook-intermediary" || channelID to Axelar || Axelar GMP account))` assuming the channel is fixed, which is usually true for mainnet + + ``` + + - **For Consensus** + + Verify (channel & sender == address of our GMP account = `axelar1dv4u5k73pzqrxlzujxg3qp8kvc3pje7jtdvu72npnt5zhq05ejcsn5qme5`. + https://github.com/axelarnetwork/evm-cosmos-gmp-sample/blob/main/native-integration/sample-middleware/gmp_middleware.go#L114 + +1. The EVM source chain and address. + + When a message has an EVM source, the chain and address are passed in differently for CosmWasm and Native GMP. + + - **CosmWasm**: When you build your CosmWasm contract, you can define `source_chain` and/or `source_address` as arguments for their `wasm` method. And pass in the correct `source_chain` and/or `source_address` as an argument from the EVM contract. The Axelar network will validate that these values are accurate and not being spoofed by the sender. + - **Native GMP**: The GMP call will be sent by the Axelar GMP account to the cosmos chain. Make sure that it is [formatted correctly](https://github.com/axelarnetwork/axelar-core/blob/main/x/axelarnet/types/evm_translator.go#L55) in the IBC memo that contains validated source chain/address values. diff --git a/src/pages/dev/general-message-passing/debug/debugging-your-smart-contract.mdx b/src/content/docs/dev/general-message-passing/debug/debugging-your-smart-contract.mdx similarity index 93% rename from src/pages/dev/general-message-passing/debug/debugging-your-smart-contract.mdx rename to src/content/docs/dev/general-message-passing/debug/debugging-your-smart-contract.mdx index f6cd18946..19db84a04 100644 --- a/src/pages/dev/general-message-passing/debug/debugging-your-smart-contract.mdx +++ b/src/content/docs/dev/general-message-passing/debug/debugging-your-smart-contract.mdx @@ -8,7 +8,7 @@ Here are some tools that may help you to investigate and address misbehavior in [Tenderly](https://tenderly.co/) is a powerful debugging tool for simulating smart contracts. It can be used for debugging the verified smart contract with a [breakpoint](https://en.wikipedia.org/wiki/Breakpoint). Tenderly also has other useful features for smart contract development, such as forking, transaction monitoring, etc. See their full documentation [here](https://docs.tenderly.co/). -Note that your contract must be verified at the block explorer or Tenderly (you can follow the guide [here](https://docs.tenderly.co/monitoring/verifying-a-smart-contract)). Also, the networks it supports are limited. [Here](https://docs.tenderly.co/supported-networks-and-languages) is a list of all the networks Tenderly supports. +Note that your contract must be verified at the block explorer or Tenderly (you can follow the guide [here](https://docs.tenderly.co/contract-verification)). Also, the networks it supports are limited. [Here](https://docs.tenderly.co/supported-networks-and-languages) is a list of all the networks Tenderly supports. Now, let's take a look at an example that will walk you through how you can use Tenderly to debug a failed transaction. diff --git a/src/content/docs/dev/general-message-passing/debug/error-debugging.mdx b/src/content/docs/dev/general-message-passing/debug/error-debugging.mdx new file mode 100644 index 000000000..78c27cd4c --- /dev/null +++ b/src/content/docs/dev/general-message-passing/debug/error-debugging.mdx @@ -0,0 +1,43 @@ +# Execution error messages + +import { Callout } from "/src/components/callout"; + +There are two reasons that executions fail: + +### 1. Insufficient gas to execute the transaction + +If the prepaid gas is insufficient, for example, this [transaction](https://axelarscan.io/gmp/0x1776026b406ab2aaaedeae83f4a19fc8809000cc8a3b2abd8716587a29460839-1), you might see `NOT ENOUGH GAS` or other messages indicating the submitted gas is too low to execute, such as `Insufficient gas for executing the transaction`, `intrinsic gas too low`, etc. + +There are two options to recover the transfer. + +1. Manually execute the payload at the destination chain via [Axelarscan UI](/dev/general-message-passing/debug/transaction-recovery/#manually-execute-a-transfer) or [AxelarJS SDK](/dev/axelarjs-sdk/tx-status-query-recovery/#1-execute-manually). +2. Add more gas to the gas receiver on the source chain via [Axelarscan UI](/dev/general-message-passing/debug/transaction-recovery/#increase-gas-payment-to-the-gas-receiver-on-the-source-chain) or [AxelarJS SDK](/dev/axelarjs-sdk/tx-status-query-recovery/#2-increase-gas-payment). + +### 2. Error in the destination contract logic + +If the error is caused by the destination contract logic, you would see following the error message: + +``` +Transaction execution was reverted. Please check the implementation of the destination contract's _execute function. +``` + +**What to do next:** We suggest debugging your contract and then making a new call. You can try to follow the [Debugging your smart contract](/dev/general-message-passing/debug/debugging-your-smart-contract/) guide as this is not error an error associated with the Axelar network itself. + + + The error message in `reason:` is extracted from the data returned by the + [Ethers.js](https://github.com/ethers-io/ethers.js/) library, from the data + fields `error.error.code` and `error.error.reason`. The displayed error code + (red tag) can be clicked to link to the description of each error code in + [Ethers.js's official + document](https://docs.ethers.io/v5/api/utils/logger/#errors-ethereum). + + + + If you get `Nonce Expired` or other messages indicating that nonce has already + been used. It means that the nonce given in the transaction has already been + consumed for the address on a blockchain. This error mostly happens when the + same address submits multiple calls in a short period. We suggest you try + [manually + executing](/dev/general-message-passing/debug/transaction-recovery/#manually-execute-a-transfer) + it once again. + diff --git a/src/pages/dev/general-message-passing/debug/fork-mainnet.mdx b/src/content/docs/dev/general-message-passing/debug/fork-mainnet.mdx similarity index 87% rename from src/pages/dev/general-message-passing/debug/fork-mainnet.mdx rename to src/content/docs/dev/general-message-passing/debug/fork-mainnet.mdx index 22c58725f..337b51df5 100644 --- a/src/pages/dev/general-message-passing/debug/fork-mainnet.mdx +++ b/src/content/docs/dev/general-message-passing/debug/fork-mainnet.mdx @@ -3,21 +3,22 @@ For development and debugging purposes, it is often useful to be able to fork preexisting chains. This can easily be done using `ganache`. You can simply install [`axelar-local-dev`](https://github.com/axelarnetwork/axelar-local-dev) by typing `npm i @axelar-network/axelar-local-dev` and writing a simple script: ```js -const { forkAndExport } = '@axelar-network/axelar-local-dev'; +const { forkAndExport } = "@axelar-network/axelar-local-dev"; forkAndExport(); ``` This will clone `mainnet` by default and export local RPC endpoints at `http:/localhost:8500/n` with `n` staring from `0`. -## Aditional Options +## Additional Options `forkAndExport` can take an object of type `CloneLocalOptions` that can specify: + - `chainOutputPath`: a path to save a JSON file with all the information for the chains that are set up. Defaults to `./local.json`. - `accountsToFund`: a list of addresses to fund. - `fundAmount`: a string representing the amount of ether to fund accounts with. Defaults to `100 ETH`. - `env`: a `string` whose value is either `mainnet` or `testnet`, or an `array` of `ChainCloneData`. See the repo for details. - `chains`: now acts as a filter for which chains to fork. Defaults to all the chains. -- `relayInterval`: amount of time between relay of events in miliseconds. Defaults to `2000`. +- `relayInterval`: amount of time between relay of events in milliseconds. Defaults to `2000`. - `port`: port to listen to. Defaults to `8500`. - `afterRelay`: a function `(relayData: RelayData) => void` that will be called after each relay. Mainly to be used for debugging. - `callback`: a function `(network: Network, info: any) => Promise` that will be called right after setting up each network. Use this to set up additional features, like deploying additional contracts or funding accounts. @@ -25,6 +26,6 @@ This will clone `mainnet` by default and export local RPC endpoints at `http:/lo ## Usage -After creating the desired fork, you have access to RPCs (look into the JSON file saved) to them. You can update MetaMask (or any other wallet) to these RPCs and access any dApp online, and everything will happen in the local fork instead of the actual network. All Axelar functionality will happen more quickly (`2s` by default), and you can get debigging capabilites via the `afterRelay` option. Make sure you change MetaMask's RPCs back to the endpoints you trust, to go back to using actual mainnet/testnet. +After creating the desired fork, you have access to RPCs (look into the JSON file saved) to them. You can update MetaMask (or any other wallet) to these RPCs and access any dApp online, and everything will happen in the local fork instead of the actual network. All Axelar functionality will happen more quickly (`2s` by default), and you can get debugging capabilities via the `afterRelay` option. Make sure you change MetaMask's RPCs back to the endpoints you trust, to go back to using actual mainnet/testnet. -Forking requires the use of RPCs to the actual networks being forked. For mainnet and testnet some RPCs are provided as part of `axelar-local-dev`, but we cannot guarantee that they will all work in the future. If you want, you can either tweak them in `./node_modules/@axelar-network/axelar-local-dev/info/` or provide an `env` variable that specifies your own RPCs. You can also copy the files in the `info` directory, alter them, load them and pass either of them as the `env` variable. \ No newline at end of file +Forking requires the use of RPCs to the actual networks being forked. For mainnet and testnet some RPCs are provided as part of `axelar-local-dev`, but we cannot guarantee that they will all work in the future. If you want, you can either tweak them in `./node_modules/@axelar-network/axelar-local-dev/info/` or provide an `env` variable that specifies your own RPCs. You can also copy the files in the `info` directory, alter them, load them and pass either of them as the `env` variable. diff --git a/src/pages/dev/general-message-passing/recovery.mdx b/src/content/docs/dev/general-message-passing/debug/transaction-recovery.mdx similarity index 91% rename from src/pages/dev/general-message-passing/recovery.mdx rename to src/content/docs/dev/general-message-passing/debug/transaction-recovery.mdx index f170dcc57..c3d203400 100644 --- a/src/pages/dev/general-message-passing/recovery.mdx +++ b/src/content/docs/dev/general-message-passing/debug/transaction-recovery.mdx @@ -1,11 +1,13 @@ # Transaction Recovery + Occasionally, transactions can get "stuck" in the pipeline from a source to destination chain (e.g. due to one-off issues that arise with relayers that operate on top of the network). Transactions have typically gotten "stuck" in the pipeline due to: (A) The transaction failing to relay from the source chain into the Axelar network for processing. (B) The transaction failing to get executed on the destination chain. -Users can recover a transaction that gets stuck in the pipeline by either: +Users can recover a transaction that gets stuck in the pipeline by either: + 1. Searching for the transaction in the Axelarscan UI and having it invoke recovery. 2. Incorporating the [AxelarJS SDK](/dev/axelarjs-sdk/token-transfer-dep-addr) and invoking those methods directly. @@ -20,10 +22,12 @@ The CALL APPROVED status will be updated once the network approves the transacti ![gmp-approve-successful.png](/images/gmp-approve-successful.png) (B) If the transaction failed to get executed on the destination chain, then Axelarscan will provide the option for you to either: + 1. Manually execute a transfer on the destination chain, OR 2. Increase gas payment to the gas receiver on the source chain. ### Manually execute a transfer + Click the ‘Connect’ button under the label ‘Execute at destination chain’. Then click the `Execute` button. It triggers the executor service to execute the transaction using the new gas paid at the destination chain. You can check the latest execution result in the `Executed` section. ![gmp-execute.png](/images/gmp-execute.png) @@ -31,19 +35,21 @@ Click the ‘Connect’ button under the label ‘Execute at destination chain Suppose the manual execution fails, you will get an error message with explained reason. ![gmp-execute-error-reverted.png](/images/gmp-execute-error-reverted.png) -**What to do next:** We suggest debugging your contract and then making a new call. You can try to follow the [Debugging your smart contract](debug/debugging-your-smart-contract) guide. +**What to do next:** We suggest debugging your contract and then making a new call. You can try to follow the [Debugging your smart contract](/dev/general-message-passing/debug/debugging-your-smart-contract) guide. ### Increase gas payment to the gas receiver on the source chain -The prepaid gas to the Gas Service contract could be insufficient when the destination chain is too busy (with many transfers or other conditions). Therefore, Axelarscan provides an option to increase gas payment to relay the transaction. + +The prepaid gas to the Gas Service contract could be insufficient when the destination chain is too busy (with many transfers or other conditions). Therefore, Axelarscan provides an option to increase gas payment to relay the transaction. To do this: + 1. Click the `Connect` button to connect your MetaMask wallet. Then switch the wallet network to the transfer’s source chain by clicking the `Switch Network` button under the label ‘Add gas at source chain‘. -![egmp-pay-gas-button.png](/images/gmp-pay-gas-button.png) + ![egmp-pay-gas-button.png](/images/gmp-pay-gas-button.png) 2. Click the `Add gas` button. The new paid gas information will be updated in the `GAS PAID` section. Then, the call will be relayed and executed. -![gmp-pay-gas-success.png](/images/gmp-pay-gas-success.png) + ![gmp-pay-gas-success.png](/images/gmp-pay-gas-success.png) ## 2. the AxelarJS SDK -All of the recovery methods above can be done programmatically through our SDK. The benefit of this would be if you would like to incorporate these recovery features above in your application directly. In fact, Axelarscan makes use of all of these methods written into the SDK. +All of the recovery methods above can be done programmatically through our SDK. The benefit of this would be if you would like to incorporate these recovery features above in your application directly. In fact, Axelarscan makes use of all of these methods written into the SDK. See SDK docs for [the full transaction recovery API](/dev/axelarjs-sdk/tx-status-query-recovery#query-transaction-status-by-txhash). diff --git a/src/pages/dev/general-message-passing/local-dev.mdx b/src/content/docs/dev/general-message-passing/developer-guides/example-gmp.mdx similarity index 91% rename from src/pages/dev/general-message-passing/local-dev.mdx rename to src/content/docs/dev/general-message-passing/developer-guides/example-gmp.mdx index 0bbd97f2c..51a682e7e 100644 --- a/src/pages/dev/general-message-passing/local-dev.mdx +++ b/src/content/docs/dev/general-message-passing/developer-guides/example-gmp.mdx @@ -36,9 +36,11 @@ npm run setup ## Deploy and run "Hello World" In order to run the examples against the local emulator, use a separate terminal window. + ```bash npm run start ``` + Leave this terminal open to keep your local server running for all of these examples. Run the "Call Contract" example. The application sends a message - "Hello World" - from a source to a destination chain using the `callContract` function. @@ -51,8 +53,8 @@ To deploy the contract, use the following command: npm run deploy evm/call-contract local ``` - Output: + ``` Deploying ExecutableSample for Moonbeam. Deploying ExecutableSample for Avalanche. @@ -75,6 +77,7 @@ npm run execute evm/call-contract [local|testnet] ${srcChain} ${destChain} ${mes ``` For example: + ```bash npm run execute evm/call-contract local "Moonbeam" "Avalanche" "Hello World" ``` @@ -99,10 +102,10 @@ That's it! In the above, we sent a message - "Hello World" - from a smart contract on Moonbeam to a smart contract on Avalanche, updating the latter's "value" property to our "Hello World" message. The full transaction flow was: + 1. Started the local developer environment to run local EVM blockchains. 2. The first node script deployed [this](https://github.com/axelarnetwork/axelar-examples/blob/main/examples/evm/call-contract/ExecutableSample.sol) smart contract to all the EVM chains in our local developer environment. 3. The second node script ran [this](https://github.com/axelarnetwork/axelar-examples/blob/main/examples/evm/call-contract/index.js#L22) test script on local Moonbeam, which: - - Calculated the estimated gas cost of executing the method on Avalanche. - - Invoked `setRemoteValue` on the deployed Moonbeam smart contract. This method first pays the gas receiver on Moonbeam the estimated gas cost, then calls `callContractWithToken` on the Moonbeam Gateway contract. + - Calculated the estimated gas cost of executing the method on Avalanche. + - Invoked `setRemoteValue` on the deployed Moonbeam smart contract. This method first pays the gas receiver on Moonbeam the estimated gas cost, then calls `callContractWithToken` on the Moonbeam Gateway contract. 4. After some time, the relay services detect the gas paid on Moonbeam and executes the smart contract on Avalanche, invoking the `_execute` method that updated the value to the message parameter. - diff --git a/src/pages/dev/general-message-passing/examples.mdx b/src/content/docs/dev/general-message-passing/examples.mdx similarity index 91% rename from src/pages/dev/general-message-passing/examples.mdx rename to src/content/docs/dev/general-message-passing/examples.mdx index 630a5a173..189608e8d 100644 --- a/src/pages/dev/general-message-passing/examples.mdx +++ b/src/content/docs/dev/general-message-passing/examples.mdx @@ -37,8 +37,8 @@ Watch Axelar engineers demo an end-to-end walkthrough of our Airdrop example, wh
    To call a contract on chain B from chain A, the user needs to call `callContract` on the gateway of chain A, specifying: -- The destination chain, which must be an EVM chain from [Chain names](/dev/reference/mainnet-chain-names). +- The destination chain, which must be an EVM chain from [Chain names](https://axelarscan.io/resources/chains). - The destination contract address, which must inherit from `AxelarExecutable` defined in [AxelarExecutable.sol](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/blob/main/contracts/executable/AxelarExecutable.sol). - The payload `bytes` to pass to the destination contract. + + **NOTE:** The security of your contracts is limited to the security of the + chains they integrate with. Since blockchains can have different security + practices, we recommend doing due diligence on all chains your contract will + be deployed to. + + If you want to try this out directly on the blockchain, you can [use Remix to try out Axelar's GMP](https://remix.ethereum.org/axelarnetwork/axelar-docs/blob/main/public/samples/gmp-senderreceiver.sol). ```solidity @@ -28,19 +34,18 @@ function callContract( ) external; ``` -`AxelarExecutable` has an `execute` function that will be triggered by the Axelar network on the destination chain after the `callContract` function has been executed on the source chain. This will validate the contract call and then invoke *your* `_execute` method, where you should write any custom logic. +`AxelarExecutable` has an `execute` function that will be triggered by the Axelar network on the destination chain after the `callContract` function has been executed on the source chain. This will validate the contract call and then invoke _your_ `_execute` method, where you should write any custom logic. ```solidity function _execute( + bytes32 commandId, string memory sourceChain, string memory sourceAddress, bytes calldata payload ) internal virtual {} ``` - - Ensure the payload is encoded `bytes`! - +Ensure the payload is encoded `bytes`! The `payload` passed to `callContract` (and ultimately to `_execute` and `_executeWithToken`) has type `bytes`. Use the ABI encoder/decoder convert your data to `bytes`. @@ -52,7 +57,7 @@ const { ethers } = require("ethers"); // encoding a string const payload = ethers.utils.defaultAbiCoder.encode( ["string"], - ["Hello from contract A"] + ["Hello from contract A"], ); ``` @@ -60,6 +65,7 @@ Example of payload decoding in Solidity: ```solidity function _execute( + bytes32 commandId, string memory sourceChain, string memory sourceAddress, bytes calldata payload @@ -69,5 +75,4 @@ function _execute( } ``` - -**Learn More:** For a detailed tutorial on building a full-stack interchain decentralized application with Next.js, Solidity, and Axelar's General Message Passing `callContract` to send messages between blockchains, check out our comprehensive guide: [Build a Full-Stack Interchain Application With Next.js, Solidity & Axelar](https://axelar.network/blog/how-to-build-interchain-dapp-with-next.js-solidity-and-Axelar). +**Learn More:** For a detailed tutorial on building a full-stack interchain decentralized application with Next.js, Solidity, and Axelar's General Message Passing `callContract` to send messages between blockchains, check out our comprehensive guide: [Build a Full-Stack Interchain Application With Next.js, Solidity & Axelar](https://blog.axelar.dev/build-a-full-stack-interchain-application-with-nextjs-solidity-axelar). diff --git a/src/pages/dev/general-message-passing/gmp-tokens-with-messages.mdx b/src/content/docs/dev/general-message-passing/gmp-tokens-with-messages.mdx similarity index 55% rename from src/pages/dev/general-message-passing/gmp-tokens-with-messages.mdx rename to src/content/docs/dev/general-message-passing/gmp-tokens-with-messages.mdx index a5963ce89..6293a140c 100644 --- a/src/pages/dev/general-message-passing/gmp-tokens-with-messages.mdx +++ b/src/content/docs/dev/general-message-passing/gmp-tokens-with-messages.mdx @@ -1,26 +1,33 @@ +# EVM Cross-Chain Gateway Token Transfers -# Call a contract on chain B from chain A and attach some tokens - -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; -To call chain B from chain A and send some tokens along the way, the user needs to call `callContractWithToken` on the gateway of chain A, specifying: +To call chain B from chain A and send some tokens supported by the gateway along the way, the user needs to call `callContractWithToken` on the gateway of chain A, specifying: -- The destination chain, which must be an EVM chain from [Chain names](/dev/reference/mainnet-chain-names). -- The destination contract address, which must inherit from `AxelarExecutable` defined in [AxelarExecutable.sol](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/blob/main/contracts/executables/AxelarExecutable.sol). +- The destination chain, which must be an EVM chain from [Chain names](https://axelarscan.io/resources/chains). +- The destination contract address, which must inherit from `AxelarExecutableWithToken` defined in [AxelarExecutableWithToken.sol](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/blob/main/contracts/executable/AxelarExecutableWithToken.sol). - The payload `bytes` to pass to the destination contract. -- The symbol of the token to transfer, which must be a supported asset ([Mainnet](../reference/mainnet-contract-addresses) | [Testnet](../reference/testnet-contract-addresses)). +- The symbol of the token to transfer, which must be a supported asset ([Mainnet](/resources/contract-addresses/mainnet/) | [Testnet](/resources/contract-addresses/testnet/)). - The amount of the token to transfer. +Gateway tokens, as the name implies, are tokens supported at the [Axelar core gateway](https://github.com/axelarnetwork/axelar-cgp-solidity/blob/main/contracts/AxelarGateway.sol) layer. You can find the list of tokens supported [here](https://axelarscan.io/resources/assets?type=gateway). + + + **NOTE:** The security of your contracts, and the tokens passed between them, + is limited to the security of the chains they integrate with. Since + blockchains can have different security practices, we recommend doing due + diligence on all chains your contract will be deployed to. + + As per the snippet below: ```solidity @@ -33,12 +40,13 @@ function callContractWithToken( ) external; ``` -`AxelarExecutable` has an `executeWithToken` function that will be triggered by the Axelar network on the destination chain after the `callContractWithToken` function has been executed on the source chain. This will validate the contract call and then invoke *your* `_executeWithToken` method, where you should write any custom logic. +The `AxelarExecutableWithToken` has an `executeWithToken` function that will be triggered by the Axelar network on the destination chain after the `callContractWithToken` function has been executed on the source chain. This will validate the contract call and then invoke _your_ `_executeWithToken` method, where you should write any custom logic. The destination contract will be authorized to transfer the ERC-20 identified by the `tokenSymbol`. ```solidity function _executeWithToken( + bytes32 commandId, string memory sourceChain, string memory sourceAddress, bytes calldata payload, @@ -47,12 +55,13 @@ function _executeWithToken( ) internal virtual {} ``` -### Example +### Example Payload Suppose our destination contract wants to forward the token it received to a recipient provided in the payload. It could be done this way. ```solidity function _executeWithToken( + bytes32 commandId, string memory sourceChain, string memory sourceAddress, bytes calldata payload, @@ -69,13 +78,11 @@ function _executeWithToken( } ``` - - Ensure the payload is encoded `bytes`! - +Ensure the payload is encoded `bytes`! The `payload` passed to `callContract` (and ultimately to the `_execute` and `_executeWithToken`) has type `bytes`. Use the ABI encoder/decoder convert your data to `bytes`. -Example of payload encoding in JavaScript (using ethers.js): +### Example of payload encoding in JavaScript (using ethers.js): ```jsx const { ethers } = require("ethers"); @@ -83,14 +90,15 @@ const { ethers } = require("ethers"); // encoding a string const payload = ethers.utils.defaultAbiCoder.encode( ["string"], - ["Hello from contract A"] + ["Hello from contract A"], ); ``` -Example of payload decoding in Solidity: +### Example of payload decoding in Solidity: ```solidity function _execute( + bytes32 commandId, string memory sourceChain, string memory sourceAddress, bytes calldata payload @@ -100,5 +108,4 @@ function _execute( } ``` - -**Learn More:** Explore our tutorial on building a decentralized application (dApp) for cross-chain airdrops using Solidity, Next.js, and Axelar's General Message Passing with `callContractWithToken`. This tutorial will guide you through the process of distributing tokens across multiple chains: [How to Build a Cross-Chain Airdrop DApp With Solidity, Next.js, and Axelar](https://axelar.network/blog/cross-chain-airdrop-dapp-tutorial). +**Learn More:** Explore our tutorial on building a decentralized application (dApp) for cross-chain airdrops using Solidity, Next.js, and Axelar's General Message Passing with `callContractWithToken`. This tutorial will guide you through the process of distributing tokens across multiple chains: [How to Build a Cross-Chain Airdrop DApp With Solidity, Next.js, and Axelar](https://blog.axelar.dev/how-to-build-a-cross-chain-airdrop-dapp-with-solidity-nextjs-and-axelar). diff --git a/src/content/docs/dev/general-message-passing/overview.mdx b/src/content/docs/dev/general-message-passing/overview.mdx new file mode 100644 index 000000000..a70b2c6a2 --- /dev/null +++ b/src/content/docs/dev/general-message-passing/overview.mdx @@ -0,0 +1,134 @@ +# General Message Passing + +import { Callout } from "/src/components/callout"; + +Axelar's General Message Passing (GMP) enables a developer building on one chain to call any function on any other connected chain. (We use the word "function" to encompass both smart contracts at the application layer and functions built at the protocol layer, as in Cosmos, for example.) That means complete composability across Web3. + +With GMP, you can: + +- Call a contract on chain B from chain A. +- Call a contract on chain B from chain A and attach some tokens. + + + **NOTE:** The security of your contracts is limited to the security of the + chains they integrate with. Since blockchains can have different security + practices, we recommend doing due diligence on all chains your contract will + be deployed to. + + + + **NOTE:** GMP Transactions using `callContractWithToken` sent to the Axelar + chain itself are not yet supported. Axelar only supports GMP call without + token from Axelar to chain X. Transactions sent to the Axelar chain as the + destination chain will be stuck until support is rolled out. + + +### Prerequisites + +- For GMP to work, chains A and B must be EVM or Non-EVM with a deployed Axelar Gateway contract. We're adding new chains and chain technology stacks all of the time. +- The application's executable contract must be deployed on the destination contract. +- The application must be on one of Axelar's supported EVM chains. See [chain names](https://axelarscan.io/resources/chains) for a list of EVM chains that have an Axelar Gateway deployed. The list is updated as new chains are added. + +## Flow architecture (in steps) + + + + Your browser does not support SVG + + +## Gateway Interface + +In your smart contract, you'll be interacting with the `callContract` or `callContractWithToken` methods of the [gateway contract](https://etherscan.io/address/0x4F4495243837681061C4743b74B3eEdf548D56A5#writeProxyContract). + +```solidity +function callContract( + string calldata destinationChain, + string calldata destinationContractAddress, + bytes calldata payload +) external { + emit ContractCall(msg.sender, destinationChain, destinationContractAddress, keccak256(payload), payload); +} + +function callContractWithToken( + string calldata destinationChain, + string calldata destinationContractAddress, + bytes calldata payload, + string calldata symbol, + uint256 amount +) external { + _burnTokenFrom(msg.sender, symbol, amount); + emit ContractCallWithToken(msg.sender, destinationChain, destinationContractAddress, keccak256(payload), payload, symbol, amount); +} + +function _execute( + bytes32 commandId, + string calldata sourceChain, + string calldata sourceAddress, + bytes calldata payload + ) internal virtual {} +``` + +## Steps + +### At the source chain + +1. You call a `callContract` (or `callContractWithToken`) function on the Axelar Gateway contract to initiate a call. Once the call is initiated, the user can see its status at https://axelarscan.io/gmp/[txHash] or programmatically track it via the [AxelarJS SDK](/dev/axelarjs-sdk/tx-status-query-recovery#query-transaction-status-by-txhash). +1. You prepay the [gas for the decentralized Axelar consensus](/dev/gas-service/pay-gas/) and the necessary transactions to approve and execute on the destination chain. +1. The call enters the Axelar Gateway from the source chain. + +### At the Axelar network + +1. The Axelar network confirms the call and utilizes funds from the source chain's native token reserves to cover the gas costs on both the Axelar blockchain and the destination chain. + +### At the destination chain + +1. The call is approved (Axelar validators come to a consensus by voting, and their votes and signatures are then available to pass to the destination chain), and the approval is relayed to the Axelar Gateway on the destination chain. +1. The executor service relays and executes the approved call to the application's Axelar Executable interface. + +Suppose the paid gas (step 2) is insufficient to approve or execute on the destination chain; Axelar offers [monitoring and recovery](/dev/general-message-passing/monitoring) steps to help deal with such scenarios. + +## Real-World Breakdown of Cross-Chain [Contract Calls](https://axelarscan.io/gmp/0x93cb0b614b07d6050b164cc3e35da617a2fbefc13069a35369894cac74b861a2:54) + +### Setup + +1. The destination application contract implements the `AxelarExecutable.sol` to receive the cross-chain message. + +1. The destination application contract stores the address of the local Gateway contract. + +### On Source Chain + +1. A smart contract on the source chain [calls](https://etherscan.io/tx/0x9b7428e9843c6accee77a9ab19cb374687ed57428968f4ce9591e3378a4da816) `AxelarGateway.callContract()` with the destination chain/address and `payload`, which emits the `ContractCall` event. + +1. The smart contract can deposit tokens to the [`AxelarGasService`](https://github.com/axelarnetwork/axelar-cgp-solidity/blob/main/contracts/gas-service/AxelarGasService.sol#L122) contract in the same transaction to pay the Axelar relayers for submitting the intermediate transactions required for cross-chain execution. + +### On Axelar Network + +1. A [relayer](/learn/network/flow/#message-processing-and-relayers) monitors the `ContractCall` event and submits a transaction to the Axelar network to request validation. The relayer also stores the `payload` in a database, keyed by `hash(payload)` for later retrieval. + +1. Axelar validators then [vote](https://axelarscan.io/evm-poll/434420) on-chain to validate the `ContractCall` event content. + +1. A relayer requests the Axelar network to prepare a command batch, including the pending payload approval (potentially batched with other messages), and requests validator signatures. + +1. A signed [batch](https://axelarscan.io/evm-batches?commandId=0x47d0de91330856d70caecf442341be3faf6e644b83892b214c5a2bcc673ba8ca) of approved payloads is prepared on Axelar that anyone can view. + +### On Destination Chain + +1. A relayer [submits](https://bscscan.com/tx/0x72e6c040bfbf26073cdcf55cc4db571badcadd3b9316cf0f53b72f980d3e5100) the signed batch to the destination gateway contract, which records the [approval](https://github.com/axelarnetwork/cgp-spec/blob/main/solidity/contracts/AxelarGateway.sol#L109) of the payload hash and emits a `ContractCallApproved` [event](https://github.com/axelarnetwork/cgp-spec/blob/main/solidity/contracts/AxelarGateway.sol#L144). + +1. A trustless relayer service (can be anyone) listens for this event and [calls](https://bscscan.com/tx/0x24886831c6348f036be26193d3fd74f2a08b9b9c10cae4e4bb99677687d8b71f) `IAxelarExecutable.execute()` on the destination contract with the `payload` and other data as params. + +1. The `execute` method on the destination [contract](https://github.com/axelarnetwork/cgp-spec/blob/main/solidity/contracts/executable/AxelarExecutable.sol#L18) verifies the call was indeed approved by Axelar validators by calling `validateContractCall()` from the `AxelarExecutable` where it's defined on its Axelar gateway contract. + +1. The gateway [records](https://github.com/axelarnetwork/cgp-spec/blob/main/solidity/contracts/AxelarGateway.sol#L60) that the destination application contract validated the approval and did not allow `validateContractCall` to be called again (to prevent replay of `execute`). + +1. The destination application contract uses the `payload` to [`_execute`](https://github.com/axelarnetwork/cgp-spec/blob/main/solidity/contracts/executable/AxelarExecutable.sol#L23) its logic. diff --git a/src/content/docs/dev/general-message-passing/stellar-gmp/gmp-example.mdx b/src/content/docs/dev/general-message-passing/stellar-gmp/gmp-example.mdx new file mode 100644 index 000000000..e834338ea --- /dev/null +++ b/src/content/docs/dev/general-message-passing/stellar-gmp/gmp-example.mdx @@ -0,0 +1,633 @@ +# Send Cross-Chain Message from Stellar to EVM + +This guide demonstrates, step by step, how to send messages from a Stellar smart contract to an EVM-compatible blockchain (Avalanche) using Axelar's [General Message Passing (GMP)](https://docs.axelar.dev/dev/general-message-passing/overview/) feature. + +We'll build a simple cross-chain application that: + +1. Deploy a contract on Stellar to send and receive cross-chain messages. +2. Deploy a contract on Avalanche Fuji testnet that can send and receive these messages. +3. Send a message from Stellar to Avalanche Fuji testnet. + +## Prerequisites + +- [Rust](https://www.rust-lang.org/tools/install) with wasm32 target. +- [Stellar CLI](https://github.com/stellar/stellar-cli). +- A Stellar testnet account with funds. +- [Metamask](https://metamask.io/) configured for Avalanche Fuji testnet or [Rabby](https://rabby.io/) wallet. +- Some Avalanche Fuji testnet AVAX (from the [Avalanche faucet](https://faucet.avax.network/)). + +## Part 1: Deploy the Receiver Contract on Avalanche Fuji Testnet + +Deploy the EVM contract that will receive messages from Stellar. + +1. Open [Remix IDE](https://remix.ethereum.org/), a free, powerful online tool for developing, deploying, debugging, and testing Ethereum and EVM-compatible smart contracts. + +![remix-home](/images/stellar/remix-home.png) + +2. Create a new file named `AxelarGMP.sol` and paste the following code: + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; +import { AxelarExecutable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol'; +import { IAxelarGasService } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol'; +/** + * @title Call Contract + * @notice Receive a message from Stellar and store the GMP message + */ +contract CallContract is AxelarExecutable { + string public message; + string public sourceChain; + string public sourceAddress; + IAxelarGasService public immutable gasService; + event Executed(bytes32 commandId, string sourceAddress, string message); + /** + * @param gateway address of axelar gateway on deployed chain + * @param gasReceiver address of axelar gas service on deployed chain + */ + constructor(address gateway, address gasReceiver) AxelarExecutable(gateway) { + gasService = IAxelarGasService(gasReceiver); + } + /** + * @notice Send message from chain A to chain B + * @param destinationChain name of the dest chain (ex. "Fantom") + * @param destinationAddress address on dest chain this tx is going to + * @param _message message to be sent + */ + function setRemoteValue( + string calldata destinationChain, + string calldata destinationAddress, + string calldata _message + ) external payable { + require(msg.value > 0, 'Gas payment is required'); + bytes memory payload = abi.encode(_message); + gasService.payNativeGasForContractCall{ value: msg.value }( + address(this), + destinationChain, + destinationAddress, + payload, + msg.sender + ); + gateway().callContract(destinationChain, destinationAddress, payload); + } + /** + * @notice logic to be executed on the dest chain + * @dev this is triggered automatically by the relayer + * @param commandId Unique ID for this message + * @param _sourceChain blockchain where tx is originating from + * @param _sourceAddress address on src chain where tx is originating from + * @param _payload encoded gmp message sent from src chain + */ + function _execute( + bytes32 commandId, + string calldata _sourceChain, + string calldata _sourceAddress, + bytes calldata _payload + ) internal override { + (message) = abi.decode(_payload, (string)); + sourceChain = _sourceChain; + sourceAddress = _sourceAddress; + emit Executed(commandId, sourceAddress, message); + } +} +``` + +In the code snippet above: + +- The contract extends `AxelarExecutable` to handle cross-chain messages using Axelar's General Message Passing (GMP). +- Implements `setRemoteValue()` to send messages to other chains, handling both gas payment and message transmission. +- The `_execute()` function processes incoming messages from other chains, storing the message content and source information. + +3. In Remix, compile the contract using the Solidity Compiler tab as shown below: + +![compile-contract](/images/stellar/compile-contract.png) + +4. Navigate to the Deploy & Run Transactions tab. + +![deploy-contract-tab](/images/stellar/gmp/deploy-contract-tab.png) + +5. Connect Metamask or Rabby to Avalanche Fuji testnet. + +![connect-wallet](/images/stellar/connect-wallet.png) + +6. For deployment, you'll need the Axelar Gateway and Gas Service addresses for Avalanche Fuji: + - Gateway: `0xC249632c2D40b9001FE907806902f63038B737Ab` + - Gas Service: `0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6` + +> **Helpful Resource**: You can find the complete list of Axelar Gateway and Gas Service addresses for all supported testnets in the [Axelar documentation](https://docs.axelar.dev/resources/contract-addresses/testnet/). 7. Deploy the contract, passing these addresses as constructor arguments. 8. **Save** the deployed contract address for use in the Stellar contract. + +![copy-evm-address](/images/stellar/copy-evm-address.png) + +You are all set to deploy the receiver contract on Avalanche Fuji Testnet. Next, you will write and deploy a Stellar contract with GMP implementation. + +## Part 2: Write and Deploy a Stellar GMP Contract + +Let's write and deploy the Stellar contract to start sending messages to the Avalanche Fuji contract. + +### 1. Create a new Stellar project + +```bash +stellar contract init axelar-gmp +cd axelar-gmp +``` + +To simplify things, delete the `contracts/hello-world` folder. If there are any other files in the `contracts` directory that you want to keep, move them to the `src/` folder. Make the `src/` folder your main working directory by moving any necessary files from subdirectories into it. Ensure you have only one `cargo.toml` file at the project root. + +```bash +axelar-gmp +├── src +│ ├── abi.rs +│ ├── test.rs +├── .gitignore +├── Cargo.lock +├── Cargo.toml +├── README.md +``` + +### 2. Configure your Cargo.toml + +Update your `Cargo.toml` file to include the necessary dependencies: + +``` +[package] +name = "axelar-gmp" +version = "0.0.0" +edition = "2021" +publish = false +[lib] +crate-type = ["cdylib"] +doctest = false +[dependencies] +soroban-sdk = {version = '22.0.6', features = ["alloc"]} +stellar-axelar-gateway = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", subdir = "contracts/stellar-axelar-gateway", features = [ + 'library', +] } +stellar-axelar-gas-service = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", subdir = "contracts/stellar-axelar-gas-service", features = [ + 'library', +] } +stellar-axelar-std = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", subdir = "packages/stellar-axelar-std" } +alloy-sol-types = "=0.7.6" +[dev-dependencies] +soroban-sdk = { version = '22.0.6', features = ["testutils"] } +[profile.release-with-logs] +inherits = "release" +debug-assertions = true +``` + +This configuration file sets up your Stellar project with all the dependencies needed for Axelar's General Message Passing (GMP) functionality: + +- The `[package]` section defines basic project information. +- The `[lib]` section configures your project as a dynamic library (`cdylib`), which is required for Stellar smart contracts. +- Under `[dependencies]`: + - `soroban-sdk` provides the core framework for Stellar smart contract development. + - The `stellar-axelar-*` dependencies pull in Axelar's gateway, gas service, and standard library components directly from their GitHub repository. + - `alloy-sol-types` helps handle Solidity type conversions, which is useful for cross-chain compatibility. +- The `[dev-dependencies]` section adds testing utilities to the Soroban SDK. +- The `[profile.release-with-logs]` section creates a custom build profile that maintains debug information in release builds, useful for troubleshooting. + +### 3. Create the storage.rs file + +Create a new file at `src/storage.rs`: + +```rust +use soroban_sdk::contracttype; + +#[contracttype] +#[derive(Clone, Debug)] +pub enum DataKey { + Gateway, + GasService, + ReceivedMessage +} +``` + +This file defines a simple enum called `DataKey` that will be used for managing persistent storage in your Stellar smart contract. The enum includes three variants: + +- `Gateway`: Used to store the address of the Axelar Gateway contract +- `GasService`: Used to store the address of the Axelar Gas Service contract +- `ReceivedMessage`: Used to store message data received from other chains + +The `#[contracttype]` attribute is a Soroban SDK macro that makes this type usable in contract storage and function parameters/returns. The `#[derive(Clone, Debug)]` attribute implements Clone and Debug traits, allowing the enum to be copied and printed for debugging. + +### 4. Create the event.rs file + +Create a new file at `src/event.rs`: + +```rust +use stellar_axelar_std::{Bytes, IntoEvent, String}; + +#[derive(Debug, PartialEq, Eq, IntoEvent)] +pub struct ExecutedEvent { + pub source_chain: String, + pub message_id: String, + pub source_address: String, + #[data] + pub payload: Bytes, +} +``` + +This file defines an `ExecutedEvent` struct representing a cross-chain message execution event. The struct includes: + +- `source_chain`: The blockchain where the message originated +- `message_id`: A unique identifier for the message +- `source_address`: The address that sent the message on the source chain +- `payload`: The actual message data, marked with the `#[data]` attribute to indicate it contains the primary event content + +The `IntoEvent` trait allows this struct to be emitted as a contract event that external applications can monitor. + +### 5. Create the interface.rs file + +Create a new file at `src/interface.rs` and add the following code snippet: + +```rust +use stellar_axelar_gateway::executable::AxelarExecutableInterface; +use stellar_axelar_std::types::Token; +use stellar_axelar_std::{Address, Env, String}; + +pub trait AxelarGMPInterface: AxelarExecutableInterface { + /// Retrieves the address of the gas service. + fn gas_service(env: &Env) -> Address; + + /// Sends a message to a specified destination chain. + /// + /// The function also handles the payment of gas for the cross-chain transaction. + /// + /// # Arguments + /// * caller - The address of the caller initiating the message. + /// * destination_chain - The name of the destination chain where the message will be sent. + /// * destination_address - The address on the destination chain where the message will be sent. + /// * message - The message to be sent. + /// * gas_token - An optional gas token used to pay for gas during the transaction. + /// + /// # Authorization + /// - The caller must authorize. + fn send( + env: &Env, + caller: Address, + destination_chain: String, + destination_address: String, + message: String, + gas_token: Option, + ); + + /// Returns the most recently received message. + fn received_message(env: &Env) -> String; +} +``` + +This file defines the core interface for your Axelar GMP contract. It extends the `AxelarExecutableInterface` and adds three methods: + +1. `gas_service`: Gets the address of the Axelar Gas Service contract +2. `send`: The main method for sending cross-chain messages, with parameters for the destination chain, address, message content, and optional gas token +3. `received_message`: Retrieves the most recently received cross-chain message + +### 6. Create the ABI Helper File + +Now let's create the `abi.rs` file, which helps our contract talk to other blockchains: + +```rust +use crate::abi::alloc::{string::String as StdString, vec}; +use alloy_sol_types::{sol_data, SolType}; +use soroban_sdk::{contracterror, Bytes, Env, String}; + +extern crate alloc; + +#[contracterror] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub enum AbiError { + InvalidUtf8 = 1, +} + +pub fn abi_encode(env: &Env, message: String) -> Result { + let message = to_std_string(message)?; + let encoded = sol_data::String::abi_encode(&message); + + Ok(Bytes::from_slice(&env, &encoded)) +} + +/// Decodes an ABI-encoded `Bytes` (as created by `abi_encode`) back into a Soroban `String`. +pub fn abi_decode_string(env: &Env, encoded_bytes: Bytes) -> Result { + // Bytes to Vec for decoding. + let encoded_vec = encoded_bytes.to_alloc_vec(); + + //Decode data into Rust String. + let rust_string = + sol_data::String::abi_decode(&encoded_vec, true).map_err(|_| AbiError::InvalidUtf8)?; + + // Rust String to Soroban String + Ok(String::from_str(env, &rust_string)) +} + +// soroban string to std string +fn to_std_string(soroban_string: String) -> Result { + let length = soroban_string.len() as usize; + let mut bytes = vec![0u8; length]; + + soroban_string.copy_into_slice(&mut bytes); + StdString::from_utf8(bytes).map_err(|_| AbiError::InvalidUtf8) +} +``` + +This file is like a translator between different blockchains. When you want to send a message from Stellar to Ethereum (or other chains), you need to format it so they can understand it. + +### 7. Build Your Main Contract + +Next, let's create the heart of our project, the `contract.rs` file, and update it with the following code snippet: + +```rust +use stellar_axelar_gas_service::AxelarGasServiceClient; +use stellar_axelar_gateway::executable::{AxelarExecutableInterface, CustomAxelarExecutable}; +use stellar_axelar_gateway::AxelarGatewayMessagingClient; +use stellar_axelar_std::events::Event; +use stellar_axelar_std::types::Token; +use stellar_axelar_std::{ + contract, contracterror, contractimpl, soroban_sdk, Address, AxelarExecutable, + Bytes, Env, String, +}; + +use crate::event::ExecutedEvent; +use crate::interface::AxelarGMPInterface; +use crate::storage::DataKey; +use crate::abi::{abi_decode_string, abi_encode}; + +#[contract] +#[derive(AxelarExecutable)] +pub struct AxelarGMP; + +#[contracterror] +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +#[repr(u32)] +pub enum AxelarGMPError { + NotApproved = 1, + FailedDecoding = 2, +} + +impl CustomAxelarExecutable for AxelarGMP { + type Error = AxelarGMPError; + + fn __gateway(env: &Env) -> Address { + env.storage().instance().get(&DataKey::Gateway).unwrap() + } + + fn __execute( + env: &Env, + source_chain: String, + message_id: String, + source_address: String, + payload: Bytes, + ) -> Result<(), Self::Error> { + let decoded_msg = abi_decode_string(env, payload.clone()).map_err(|_| AxelarGMPError::FailedDecoding)?; + + // Store the received message + env.storage().instance().set(&DataKey::ReceivedMessage, &decoded_msg); + + // Emit event + ExecutedEvent { + source_chain, + message_id, + source_address, + payload, + } + .emit(env); + + Ok(()) + } +} + +#[contractimpl] +impl AxelarGMP { + pub fn __constructor( + env: &Env, + gateway: Address, + gas_service: Address, + ) { + env.storage().instance().set(&DataKey::Gateway, &gateway); + env.storage().instance().set(&DataKey::GasService, &gas_service); + } +} + +#[contractimpl] +impl AxelarGMPInterface for AxelarGMP { + fn gas_service(env: &Env) -> Address { + env.storage().instance().get(&DataKey::GasService).unwrap() + } + + fn send( + env: &Env, + caller: Address, + destination_chain: String, + destination_address: String, + message: String, + gas_token: Option, + ) { + let gateway = AxelarGatewayMessagingClient::new(env, &Self::gateway(env)); + let gas_service = AxelarGasServiceClient::new(env, &Self::gas_service(env)); + + caller.require_auth(); + + let encoded_msg = abi_encode(env, message).unwrap(); + + if let Some(gas_token) = gas_token { + gas_service.pay_gas( + &env.current_contract_address(), + &destination_chain, + &destination_address, + &encoded_msg, + &caller, + &gas_token, + &Bytes::new(env), + ); + } + + gateway.call_contract( + &env.current_contract_address(), + &destination_chain, + &destination_address, + &encoded_msg, + ); + } + + fn received_message(env: &Env) -> String { + env.storage().instance().get(&DataKey::ReceivedMessage) + .unwrap_or_else(|| String::from_str(env, "")) + } +} +``` + +In the contract above: + +- **For receiving messages**: The `__execute` function decodes incoming messages from other chains, stores them, and triggers an event to notify listeners. +- **For sending messages**: The `send` function prepares your message for cross-chain delivery, handles payment for gas fees if needed, and dispatches it via the Axelar Gateway. +- **Storage access**: `received_message` retrieves the last message received, and `gas_service` provides the Gas Service contract address. +- **Security**: Authentication checks ensure only authorized users can send messages. + +This contract serves as your bridge for bi-directional communication between Stellar and other blockchains like Ethereum (or other chains). + +### 8. Update lib.rs file + +Finally, let's update our `lib.rs` file to bring all the pieces together: + +```rust +#![no_std] + +mod contract; +pub mod event; +pub mod interface; +mod storage; +pub mod abi; + +pub use contract::{AxelarGMP, AxelarGMPClient}; +``` + +This is just a simple file that organizes all our code modules. The `#![no_std]` at the top helps keep our contract lightweight by excluding the standard library. + +And that's it! You've built a complete cross-chain messaging contract using Axelar's GMP on Stellar. You can send and receive messages between Stellar and other blockchains like Ethereum, Avalanche, and more. + +## Part 3: Build and Deploy the Stellar Contract + +Now that we've written our code let's get it running on the Stellar network: + +### 1. Build your contract + +First, make sure you're in your project directory: + +```bash +cd axelar-gmp +``` + +Then compile your contract: + +```bash +stellar contract build +``` + +This will create a WebAssembly (WASM) file from your Rust code. + +### 2. Optimize for deployment + +To reduce gas costs and improve performance, optimize the WASM file: + +```bash +stellar contract optimize --wasm target/wasm32-unknown-unknown/release/axelar_gmp.wasm +``` + +### 3. Deploy the Stellar Contract + +Now let's deploy your contract to the Stellar testnet, connecting it to the Axelar network's contracts: + +```bash +stellar contract deploy \ + --wasm target/wasm32-unknown-unknown/release/axelar_gmp.optimized.wasm \ + --source YOUR_ACCOUNT_NAME \ + --network testnet \ + -- \ + --gateway CCSNWHMQSPTW4PS7L32OIMH7Z6NFNCKYZKNFSWRSYX7MK64KHBDZDT5I \ + --gas_service CAZUKAFB5XHZKFZR7B5HIKB6BBMYSZIV3V2VWFTQWKYEMONWK2ZLTZCT +``` + +The `--gateway` and `--gas_service` addresses are official Axelar contracts on the Stellar testnet that enable cross-chain messaging: + +- `CCSNWHMQSPTW4PS7L32OIMH7Z6NFNCKYZKNFSWRSYX7MK64KHBDZDT5I` - The Axelar Gateway contract that handles message verification and routing. +- `CAZUKAFB5XHZKFZR7B5HIKB6BBMYSZIV3V2VWFTQWKYEMONWK2ZLTZCT` - The Axelar Gas Service that handles gas payments for cross-chain transactions. + +When the deployment succeeds, you'll see the address of your new contract in the output. It should be similar to what is shown below. + +```bash +ℹ️ Skipping install because wasm already installed +ℹ️ Using wasm hash af0c998651536dd5296f337bb2879670009c04c36403cff782de1d722907a122 +ℹ️ Simulating deploy transaction… +ℹ️ Transaction hash is 1e83d56651b8f9eb06de91b35870c541fdd0eb3c28cc254be7cc104b6992bfc9 +🔗 https://stellar.expert/explorer/testnet/tx/1e83d56651b8f9eb06de91b35870c541fdd0eb3c28cc254be7cc104b6992bfc9 +ℹ️ Signing transaction: 1e83d56651b8f9eb06de91b35870c541fdd0eb3c28cc254be7cc104b6992bfc9 +🌎 Submitting deploy transaction… +🔗 https://stellar.expert/explorer/testnet/contract/CD66IHACNJOMCDCCL53GM3WTM3OHQFHOCOIM7NDJFF7TBPYQEU76OVBQ +✅ Deployed! +CD66IHACNJOMCDCCL53GM3WTM3OHQFHOCOIM7NDJFF7TBPYQEU76OVBQ +``` + +Save this address; you'll need it to interact with your contract. + +> Note: These contract addresses are from the official Axelar deployments list, which can be found in the [axelar-contract-deployments repository](https://github.com/axelarnetwork/axelar-contract-deployments). + +## Part 4: Send a Cross-Chain Message + +Now let's send a message from your Stellar contract to your contract on Avalanche Fuji testnet: + +```bash +stellar contract invoke \ + --network testnet \ + --id YOUR_STELLAR_CONTRACT_ADDRESS \ + --source-account YOUR_ACCOUNT_NAME \ + -- \ + send \ + --caller YOUR_ACCOUNT_NAME \ + --destination_chain '"avalanche"' \ + --message '"Hello from Stellar!"' \ + --destination_address '"YOUR_AVALANCHE_CONTRACT_ADDRESS"' \ + --gas_token '{ "address": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", "amount": "10000000000" }' +``` + +When running this command: + +- Replace `YOUR_STELLAR_CONTRACT_ADDRESS` with the address of the contract you just deployed +- Replace `YOUR_ACCOUNT_NAME` with your Stellar account name +- Replace `YOUR_AVALANCHE_CONTRACT_ADDRESS` with your destination contract on Avalanche Fuji testnet + +> **Important:** The quote formatting is required. Notice how string values need double quotes inside single quotes (e.g., `'"avalanche"'`). This ensures proper JSON parsing of the parameters. +> The `gas_token` parameter specifies that you're paying for the cross-chain execution using native XLM tokens (10 XLM in this case). The address `CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC` is the official XLM token address on Stellar testnet. + +You should see something similar to what is shown below on your terminal. + +``` +ℹ️ Signing transaction: f05a2850aa49cb7172ac505e7c957a343ef8a21b2f151c9c936f3e8587b0cfa9 +📅 CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC - Event: [{"symbol":"transfer"},{"address":"GAGZ5NZJMXKCORPFQMXYZJZTYDSZ5OPTYEPD2HSVNWU3MCV5JIL6IQDP"},{"address":"CAZUKAFB5XHZKFZR7B5HIKB6BBMYSZIV3V2VWFTQWKYEMONWK2ZLTZCT"},{"string":"native"}] = {"i128":{"hi":0,"lo":10000000000}} +📅 CAZUKAFB5XHZKFZR7B5HIKB6BBMYSZIV3V2VWFTQWKYEMONWK2ZLTZCT - Event: [{"symbol":"gas_paid"},{"address":"CD66IHACNJOMCDCCL53GM3WTM3OHQFHOCOIM7NDJFF7TBPYQEU76OVBQ"},{"string":"avalanche"},{"string":"0x88f179ec476447a7219e5dc009cEF6f5848CBd29"},{"bytes":"40359292f954d7616ec60b4c1c79b9b9b02a4afdbadc665a6c0b8a5c09837230"},{"address":"GAGZ5NZJMXKCORPFQMXYZJZTYDSZ5OPTYEPD2HSVNWU3MCV5JIL6IQDP"},{"map":[{"key":{"symbol":"address"},"val":{"address":"CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC"}},{"key":{"symbol":"amount"},"val":{"i128":{"hi":0,"lo":10000000000}}}]}] = {"vec":[{"bytes":""}]} +📅 CCSNWHMQSPTW4PS7L32OIMH7Z6NFNCKYZKNFSWRSYX7MK64KHBDZDT5I - Event: [{"symbol":"contract_called"},{"address":"CD66IHACNJOMCDCCL53GM3WTM3OHQFHOCOIM7NDJFF7TBPYQEU76OVBQ"},{"string":"avalanche"},{"string":"0x88f179ec476447a7219e5dc009cEF6f5848CBd29"},{"bytes":"40359292f954d7616ec60b4c1c79b9b9b02a4afdbadc665a6c0b8a5c09837230"}] = {"vec":[{"bytes":"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001348656c6c6f2066726f6d205374656c6c61722100000000000000000000000000"}]} +``` + +The transaction hash is `f05a2850aa49cb7172ac505e7c957a343ef8a21b2f151c9c936f3e8587b0cfa9`. + +## Part 5: Track and Verify Your Message + +1. After executing the command, you'll receive a transaction hash. Save it! + +2. Track your message's journey across chains at: + + ``` + https://testnet.axelarscan.io/gmp/YOUR_TRANSACTION_HASH + // example https://testnet.axelarscan.io/gmp/f05a2850aa49cb7172ac505e7c957a343ef8a21b2f151c9c936f3e8587b0cfa9 + ``` + +3. The message typically takes a few seconds to be relayed through the Axelar network. + +4. Verify your message on Avalanche Fuji testnet. Once Axelar has relayed your message (typically within a few seconds), you can confirm its successful delivery: + +- Return to **Remix IDE** and connect to your Avalanche contract +- Navigate to the **Contract** tab in the left panel +- Expand your deployed contract to view its functions +- Check each of these view functions: + +| Function | Expected Result | Meaning | +| ----------------- | ----------------------------- | ---------------------------------------- | +| `message()` | "Hello from Stellar!" | The content of your cross-chain message | +| `sourceChain()` | "stellar-2025-q1" | The chain ID that sent the message | +| `sourceAddress()` | Your Stellar contract address | The contract that originated the message | + +![result](/images/stellar/result.png) + +Congratulations! You've just sent a message across blockchains, from Stellar to Avalanche Fuji Testnet, using Axelar's General Message Passing. For more information, see the [Axelar documentation](https://docs.axelar.dev/dev/general-message-passing/overview/). + +You can find the full code example [here](https://github.com/axelarnetwork/stellar-gmp-example). + +## What You've Accomplished + +1. Deployed a receiver contract on Avalanche Fuji Testnet. +2. Written and deployed a Stellar contract with GMP capabilities. +3. Successfully sent a message from Stellar to Avalanche. +4. Verified the message was received correctly. + +## Next Steps to Explore + +1. **Create a Two-Way Bridge**: Try modifying the Avalanche Fuji testnet contract to send messages back to Stellar. +2. **Add Token Transfer**: Enhance your application to transfer tokens and messages using Axelar's token transfer capabilities. +3. **Build a UI**: Create a simple web interface that allows users to interact with your cross-chain application. diff --git a/src/content/docs/dev/general-message-passing/stellar-gmp/intro.mdx b/src/content/docs/dev/general-message-passing/stellar-gmp/intro.mdx new file mode 100644 index 000000000..ca3e59c23 --- /dev/null +++ b/src/content/docs/dev/general-message-passing/stellar-gmp/intro.mdx @@ -0,0 +1,138 @@ +import { Callout } from "../../../../../components/callout"; + +# Introduction to Stellar GMP Contracts + +The core contracts for Axelar's integration with Stellar can be found at the [axelar-amplifier-stellar](https://github.com/axelarnetwork/axelar-amplifier-stellar) repository. The Rust based GMP contracts can be thought of similarly to their [EVM](/dev/general-message-passing/gmp-messages/) counterparts. At the core of there are two main contracts involved in sending a GMP message, these are the [Gateway contract](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-axelar-gateway) and the [Gas Service](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-axelar-gas-service). + +## Stellar Gateway + +The Gateway facilitates sending and receiving of cross-chain messages to other chains via the Axelar Network. +For sending a GMP message, the `callContract()` function needs to be triggered. + +### CallContract + +The `callContract` function triggers your cross-chain message from Stellar to the Axelar Network. When sending a cross-chain message you must specify the destination of your cross-chain message and a given payload. + +The `callContract` function takes five parameters. + +1. `env`: Standard stellar [env](https://developers.stellar.org/docs/learn/encyclopedia/contract-development/environment-concepts) that provides access to the environment the contract is executing within. +1. `caller`: The sender of the contract call. +1. `destination_chain`: Name of the chain the message is being sent to. +1. `destination_address`: Address on the destination chain the message is being sent to. +1. `payload`: A `bytes` representation of the cross-chain message being sent. + +```rust +pub fn call_contract( + env: Env, + caller: Address, + destination_chain: String, + destination_address: String, + payload: Bytes, +){} +``` + +## Stellar Gas Service + +The Gas Service handles cross-chain gas payment when making a GMP request. + +When sending a GMP message before triggering the `call_contract()` function on the Gateway, the `pay_gas()` must be triggered first to pay for the cross-chain transaction. + +### PayGas() + +The `pay_gas()` allows users to pay for the entirety of the cross-chain transaction in a given token. + +The `pay_gas()` takes seven parameters. + +1. `env`: Standard Stellar [env](https://developers.stellar.org/docs/learn/encyclopedia/contract-development/environment-concepts) that provides access to the environment the contract is executing within. +1. `sender`: The sender of the cross-chain call to the Gateway. +1. `destination_chain`: Name of the chain the message is being sent to. +1. `destination_address`: Address on the destination chain the message is being sent to. +1. `payload`: A `bytes` representation of the cross-chain message being sent. +1. `spender`: The `address` spending the funds to cover the transaction. +1. `token`: The token being used for payment + {/* 1. `metadata`: Data sent along with the cross-chain tx <<<<<< CONFIRM */} + +Note: The expected [token](https://github.com/axelarnetwork/axelar-cgp-stellar/blob/main/packages/axelar-stellar-std/src/types.rs#L5) is a struct type that requires an `address` and `amount`. + +```rust +fn pay_gas( + env: Env, + sender: Address, + destination_chain: String, + destination_address: String, + payload: Bytes, + spender: Address, + token: Token, + metadata: Bytes, +) -> Result<(), ContractError>; +``` + +## Stellar Executable + +The [Executable](https://github.com/axelarnetwork/axelar-cgp-stellar/blob/main/contracts/axelar-gateway/src/executable.rs#L9) is a Rust Trait (not an individual contract) that will be used to execute a cross-chain call on a Stellar dapp when Stellar is the receiving chain of a cross-chain message. + +### Execute + +The `execute()` function will be triggered by an Axelar relayer when the cross-chain message arrives. Your contract should implement the `execute()` function to handle the incoming cross-chain GMP data. + +The `execute()` function takes five parameters. + +1. `env`: Standard Stellar [env](https://developers.stellar.org/docs/learn/encyclopedia/contract-development/environment-concepts) that provides access to the environment the contract is executing within. +1. `source_chain`: The source chain where the gmp message is coming from. +1. `message_id`: Identifier for incoming GMP message. +1. `source_address`: The address on the source chain where the gmp message is coming from. +1. `payload`: A `bytes` representation of the cross-chain message being sent. + +```rust +fn execute( + env: Env, + source_chain: String, + message_id: String, + source_address: String, + payload: Bytes, +); +``` + +### Validate & Validate Message + +The `validate()` function on the `Executable` will trigger `validate_message()` that is [defined](https://github.com/axelarnetwork/axelar-cgp-stellar/blob/main/contracts/axelar-gateway/src/contract.rs#L128) on the `Gateway`. + +The `validate()` function takes five parameters. + +1. `env`: Standard stellar [env](https://developers.stellar.org/docs/learn/encyclopedia/contract-development/environment-concepts) that provides access to the environment the contract is executing within. +1. `source_chain`: The source chain where the GMP message is coming from. +1. `message_id`: Identifier for incoming GMP message. +1. `source_address`: The address on the source chain where the GMP message is coming from. +1. `payload`: A `bytes` representation of the cross-chain message being sent. + +```rust + fn validate( + env: Env, + source_chain: String, + message_id: String, + source_address: String, + payload: Bytes, + ) {} +``` + +The `validate()` function will trigger the `validate_message()`, which will confirm that the incoming GMP message is an authenticated message that has been verified by the Amplifier Verifiers. Without ensuring that the message is validated, malicious actors could in theory pass invalid data to be executed by this function, which is why it is critical to ensure that the data being passed in has been marked as approved on the Gateway + +```rust + pub fn validate_message( + env: Env, + caller: Address, + source_chain: String, + message_id: String, + source_address: String, + payload_hash: BytesN<32>, + ) -> bool {} +``` + +1. `env`: Standard stellar [env](https://developers.stellar.org/docs/learn/encyclopedia/contract-development/environment-concepts) that provides access to the environment the contract is executing within. +1. `caller`: The intended `destination_address` of the contract call. +1. `source_chain`: The source chain where the GMP message is coming from. +1. `message_id`: Identifier for incoming GMP message. +1. `source_address`: The address on the source chain where the gmp message is coming from. +1. `payload`: A `bytes` representation of the cross-chain message being sent. + +Returns a `bool` indicating whether the incoming GMP message is valid or not. diff --git a/src/content/docs/dev/general-message-passing/sui/gmp-contracts.mdx b/src/content/docs/dev/general-message-passing/sui/gmp-contracts.mdx new file mode 100644 index 000000000..f4f51f9d7 --- /dev/null +++ b/src/content/docs/dev/general-message-passing/sui/gmp-contracts.mdx @@ -0,0 +1,299 @@ +import { Callout } from "../../../../../components/callout"; + +# General Message Passing (GMP) Sui Contracts + +Sending a message from Sui involves the following steps: + +- Register your transaction with the [relayer discovery service](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/relayer_discovery) via the `register_transaction()` function on the relayer discovery service. +- Prepare the message via the `prepare_message()` function on the [gateway](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/axelar_gateway). +- Pay gas via the `pay_gas()` function on the [gas service](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/gas_service). +- Send the message via the send_message function on the [gateway](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/axelar_gateway). + +## Sui Gateway + +The [Gateway](/learn/network/flow/#gateways) is the core contract that facilitates the sending and receiving of cross-chain messages to other chains via the Axelar Network. + +### Gateway Object + +A shared object that anyone can access and user to refer to the Gateway package. + +```rust +public struct Gateway has key { + id: UID, + inner: Versioned, +} +``` + +The Gateway facilitates the sending and receiving cross-chain messages to other chains via the Axelar Network. +To send a GMP message, the `send_message()` function needs to be triggered. + +### Send Message + +The `send_message` function triggers your cross-chain message from Sui to another blockchain via the Axelar Network. It requires a `MessageTicket` struct to be passed in. To create the `MessageTicket,` you can trigger the [prepare_message](#prepare-message) function. + + + The reason this process is in two steps is because the Gateway is an upgrade + compatible contract. To ensure minimal roadblocks when upgrading the contract, + the functionality of the Gateway was broken up so that if the Gateway does get + upgraded at some point, applications can always continue to call the logic of + the V0 `prepare_message()` function and pass the ticket into the V2 version of + the `send_message()`, this will minimize breaking changes when upgrading the + contract. + + In short, to ensure backwards compatibility a ticketing system allows for a ticket generation function to consistently maintain tickets across versions, while the actual functions that consume the tickets can evolve as different versions of the package are released. + + +```rust +public fun send_message(self: &Gateway, message: MessageTicket) { + let value = self.value!(b"send_message"); + value.send_message(message, VERSION); +} +``` + +#### Prepare Message + +The `prepare_message()` function creates a `MessageTicket` struct required to send a GMP message. This behavior is intended for applications that wish to send calls to return the `message_ticket` and have their frontend send it for easier upgradability. + +It takes four parameters. + +1. `channel`: The [channel](#channel) that the message is being sent from. +1. `destination_chain`: Name of the chain the message is being sent to. +1. `destination_address`: Address on the destination chain to which the message is being sent. +1. `payload`: A `vector` representation of the cross-chain message being sent. + +```rust +public fun prepare_message( + channel: &Channel, + destination_chain: String, + destination_address: String, + payload: vector, +): MessageTicket { + message_ticket::new( + channel.to_address(), + destination_chain, + destination_address, + payload, + VERSION, + ) +} +``` + +### Receive Message + +Receiving a message involves two steps. The first involves approving an incoming message, and the second involves executing the approved message. + +#### Approve Message + +An Axelar relayer triggers the Gateway's `approve_message()` function to approve the message. Once the message is marked as approved, the approval is stored in the Gateway object. This will indicate that the message has been confirmed by the Axelar [Verifier set](https://axelarscan.io/verifiers) on the Axelar network itself. + +```rust +entry fun approve_messages(self: &mut Gateway, message_data: vector, proof_data: vector) { + let value = self.value_mut!(b"approve_messages"); + value.approve_messages(message_data, proof_data); +} +``` + +A live example of an approval transaction can be found [here](https://suiscan.xyz/mainnet/tx/GURWyTpC2LcAHDvMZFKE2wZWJiDXVPMLD5ev5ERUJFuA). + +#### Execute Message + +With the message now marked as approved, the relayer will attempt to execute the message on your Sui contract. For this, the relayer will first trigger the Gateway's take_approved_function(). This function will confirm that the message has already been [approved](#approve-message) and will then begin the [message consumption process](#consume-approved-message) + +```rust +public fun take_approved_message( + self: &mut Gateway, + source_chain: String, + message_id: String, + source_address: String, + destination_id: address, + payload: vector, +): ApprovedMessage { + let value = self.value_mut!(b"take_approved_message"); + value.take_approved_message( + source_chain, + message_id, + source_address, + destination_id, + payload, + ) +} +``` + +On your package, the [Relayer Discovery](#relayer-discovery) will then look to call the function you specified for it to call in the register_transaction() flow. If you registered a function called `execute()` (as was done in this [example](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/example/sources/gmp/gmp.move#L27)) then you can implement the `execute()` function as follows. + +The executable function will pass in the [ApprovedMessage](#approvedmessage) that was [consumed](#consume-approved-message) by the Package's Channel. + +```rust +public fun execute(call: ApprovedMessage, singleton: &mut Singleton) { + + let (_, _, _, payload) = singleton.channel.consume_approved_message(call); + + event::emit(Executed { data: payload }); +} +``` + +A live example of an execution transaction can be found [here](https://suiscan.xyz/mainnet/tx/Dzg5KukKgsywZob892Fvn4NxS6qjA2WWL2PRX9gTnwzb). + +## Channel + +In Sui, there is no ability to check the immediate caller of a message (i.e., there is no msg.sender like in EVM development). Instead, Sui injects a [txContext](https://docs.sui.io/references/framework/sui/tx_context), which carries the root transaction's signer address (similar to Solidity's `tx.origin`). To identify who the caller of a message is, you can use `Channels`. The `Channel` is an object that an application first creates, and this `channel` is the identifier for who is calling and receiving the message. + +Channels allow for sending and receiving messages between Sui and other chains. When a message is sent, the channel acts as a destination. The `destination_id` is compared to the channel's `id`. + +```rust +public struct Channel has key, store { + /// Unique ID of the channel + id: UID, +} +``` + +The `id` specifies the application's address for incoming and outgoing external calls. It has to match the `id` of a shared object passed in the channel creation method. The relayer can easily query this shared object to get call fulfillment information. + +### Consume Approved Message + +The `consume_approved_message()` will confirm that the message has been sent to the correct channel. + +The function takes two parameters. + +1. channel: The [channel](#channel) that the message is being sent to. +1. approved_message: The [ApprovedMessage](#approvedmessage) struct that is being sent to the destination chain contains relevant parameters of the cross-chain message. + +```rust +public fun consume_approved_message(channel: &Channel, approved_message: ApprovedMessage): (String, String, String, vector) { + let ApprovedMessage { + source_chain, + message_id, + source_address, + destination_id, + payload, + } = approved_message; + + // Check if the message is sent to the correct destination. + assert!(destination_id == object::id_address(channel), EInvalidDestination); + + (source_chain, message_id, source_address, payload) +} +``` + +For an example of how to receive an approved message on the destination chain, see [here](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/example/sources/gmp/gmp.move#L83) + +#### ApprovedMessage + +The `ApprovedMessage` contains the following parameters. + +1. `source_chain`: The chain name where the cross-chain message originated. +1. `message_id`: The unique ID of the message +1. `source_address`: The address on the source chain where the message originated. +1. `destination_id`: The id of the channel that the message is being sent to. +1. `payload`: A `vector` representation of the cross-chain message being sent. + +```rust +public struct ApprovedMessage { + source_chain: String, + message_id: String, + source_address: String, + destination_id: address, + payload: vector, +} + +``` + +## Sui Gas Service + +The Gas Service handles cross-chain gas payments when making a GMP request. + +When sending a GMP message before triggering the `send_message()` function on the Gateway, the `pay_gas()` must be triggered first to pay for the cross-chain transaction. + +### PayGas + +The `pay_gas()` allows users to pay for the entirety of the cross-chain transaction in a given token. It is triggered by either the channel or the user. If it is called by the user, the sender will be set as the channel_id. + +The `pay_gas()` takes five parameters. + +1. `gas_service`: The contract whose storage is set to be updated. +1. `message_ticket`: The [ticket](#message-ticket) for the message being sent. +1. `coin`: The [coin](https://docs.sui.io/standards/coin) being used to pay for the transaction. +1. `refund_address`: The address to be refunded if too much gas is paid. +1. `params`: Should be passed in as an empty value. + + + The params argument exists to allow for future extensibility of the function. + It is not currently used in the implementation. + + +```rust +public fun pay_gas( + self: &mut GasService, + message_ticket: &MessageTicket, + coin: Coin, + refund_address: address, + params: vector, +) { + self + .value_mut!(b"pay_gas") + .pay_gas( + message_ticket, + coin, + refund_address, + params, + ); +} +``` + +## Relayer Discovery + +In Sui, there is no arbitrary execution like in EVM chains; therefore, unlike in other ecosystems, there is no [Executable](/dev/general-message-passing/executable/) Package to inherit from. To resolve this issue, the [Relayer Discovery](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/relayer_discovery) Package is deployed to serve as a registry of Packages that can be invoked given a message. + +To be added to this registry, a deployed application on Sui will need to trigger the `register_transaction()` function on the Discovery Package. + +```rust +public fun register_transaction(self: &mut RelayerDiscovery, channel: &Channel, tx: Transaction) { + // Get the mutable value associated with the "register_transaction" key. + let value = self.value_mut!(b"register_transaction"); + // Retrieve the unique channel ID from the provided channel. + let channel_id = channel.id(); + // Set the transaction for this channel in the registry. + value.set_transaction(channel_id, tx); +} +``` + +The following arguments are required to register a Package: + +1. `channel`: The [channel](#channel) that the Package is being registered to. +1. `tx`: The function details to be executed when the Package is called from an Axelar relayer. + +By registering the transaction with the discovery system under a specific channel, the relayer knows exactly which transaction to run when receiving an approved message. + +See [here](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/example/sources/gmp/gmp.move#L27) for an example of how to register a transaction with the Discovery Package. + +### Argument Types + +There are five argument types that the relayer will know how to handle. + +1. `0` For objects followed by exactly 32 bytes that contain the object id. +1. `1` For pure types followed by the [bcs encoded](https://intro.sui-book.com/advanced-topics/BCS_encoding/lessons/BCS_encoding.html) form of the pure value +1. `2` For the `ApprovedMessage` object. +1. `3` For the `payload` of the contract call to be passed into the execution call. +1. `4` For an argument returned from a previous move call, followed by a `u8` specified which call to get the return of (0 for the first transaction AFTER the one that gets ApprovedMessage out), and then another u8 specifying which argument to input + +## Message Ticket + +The `MessageTicket` struct is a “hot potato” object designed to encapsulate all the necessary information for a remote contract call. It is meant to be created by a module and then returned to the frontend, which will submit it to the Gateway. This design ensures that the application code (modules) does not require any changes when the gateway package is upgraded, promoting forward compatibility. + +```rust +public struct MessageTicket { + source_id: address, + destination_chain: String, + destination_address: String, + payload: vector, + version: u64, +} +``` + +It contains the following fields: + +1. `source_id`: Purpose: Represents the address that created the ticket. +1. `destination_chain`: Specifies the destination chain where the message is intended to be delivered. +1. `destination_address`: Indicates the address of the destination contract on the destination chain. +1. `payload`: Contains the serialized data for the remote contract call. +1. `version`: Captures the version of the `MessageTicket` structure. By embedding a version number, the system can restrict which messages are sent or processed by future packages. This helps ensure that outdated or incompatible messages from earlier versions are not inadvertently processed after an upgrade. diff --git a/src/content/docs/dev/general-message-passing/sui/gmp-tutorial.mdx b/src/content/docs/dev/general-message-passing/sui/gmp-tutorial.mdx new file mode 100644 index 000000000..113deb987 --- /dev/null +++ b/src/content/docs/dev/general-message-passing/sui/gmp-tutorial.mdx @@ -0,0 +1,908 @@ +import { Callout } from "../../../../../components/callout"; + +# General Message Passing (GMP) Sui Example + +The following is an end-to-end example of how to use the [General Message Passing (GMP)](/dev/general-message-passing/overview/) feature in Sui. This example demonstrates how to create a simple cross-chain application that allows users to send messages between Sui and an [EVM](https://ethereum.org/en/developers/docs/evm/) chain. + +## Prerequisites +Before you begin, make sure you have the following prerequisites installed: +- [Rust](https://www.rust-lang.org/tools/install) +- [Sui CLI](https://docs.sui.io/build/install) +- [Sui Move](https://docs.sui.io/build/move) +- [Sui JS](https://www.npmjs.com/package/@mysten/sui) + +## Setup + +This demo will use Sui's Typescript SDK to build and deploy the `move` based on contract. It will use `npm` to install the required dependencies. To begin you can run the following command to spin-up your Sui repository. + +```bash +sui move new sui-gmp +``` + +This will create a new directory called `sui-gmp` with the following structure: + +1. `Move.toml` +1. `sources` +1. `tests` + +You can the run `npm init -y` to add a `package.json` file to the project. + +### Move Config + +The main configuration for a Sui project is in the `move.toml` file. This file contains the following sections: +- `[package]`: This section contains the package name, version, and authors. +- `[dependencies]`: This section contains the dependencies for the package. +- `[addresses]`: The live addresses of the dependencies for your project. +- `[dev-dependencies]`: The dev-dependencies section allows overriding dependencies for `--test`. +- `[dev-addresses]`: The dev-addresses section allows overwriting named addresses for the `--test`. + +For now you can clear the boiler plate configuration and simply add the following: + +```toml +[package] +name = "gmp_example" +version = "0.1.0" +edition = "2024" +``` + +## GMP Package + +The GMP Package (akin to a smart contract in the EVM ecosystem) will hold the core logic for the cross-chain application. It will be built using the `move` programming language. You can start it off by creating a new `gmp_example.move` file in the `sources` folder adding the name for the module in the code. + +```move +module gmp_example::gmp; +``` + +Note: The name `gmp_example` must match the name provided in the `move.toml` file that holds the + +### Dependencies + +The dependencies can be setup as follows in your `move.toml` file. The `git` field expects the `cgp-sui` repo where the packages are written. The `rev` represents the specific commit hash where the `published-at` fields are specified for the live packages on Sui. The `subdir` represents where in the `cgp-sui` repo the packages are located. + +```toml +[dependencies] +AxelarGateway = { git = "https://github.com/axelarnetwork/axelar-cgp-sui.git", rev = "b35227a82f7ca6f941a7e729e1a3b3d48a64b982", subdir = "move/axelar_gateway" } +GasService = { git = "https://github.com/axelarnetwork/axelar-cgp-sui.git", rev = "b35227a82f7ca6f941a7e729e1a3b3d48a64b982", subdir = "move/gas_service" } +RelayerDiscovery = { git = "https://github.com/axelarnetwork/axelar-cgp-sui.git", rev = "b35227a82f7ca6f941a7e729e1a3b3d48a64b982", subdir = "move/relayer_discovery" } +Utils = { git = "https://github.com/axelarnetwork/axelar-cgp-sui.git", rev = "b35227a82f7ca6f941a7e729e1a3b3d48a64b982", subdir = "move/utils" } +VersionControl = { git = "https://github.com/axelarnetwork/axelar-cgp-sui.git", rev = "b35227a82f7ca6f941a7e729e1a3b3d48a64b982", subdir = "move/version_control" } + +``` + + + Note: This is a temporary workaround for adding dependencies, this will be updated for a more permanent solution. + + +### Required Module Imports + +Before writing up the logic of your package you must import the necessary modules that you will need throughout the package. + +From the [Axelar Gateway's](/dev/general-message-passing/sui/gmp-contracts/#sui-gateway) [channel mod](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/axelar_gateway/sources/channel.move) you will need the `Channel` and `ApprovedMessage` objects. The gateway's [gateway module](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/axelar_gateway/sources/gateway.move) will use the Gateway object. + +```rust +use axelar_gateway::channel::{Self, Channel, ApprovedMessage}; +use axelar_gateway::gateway::{Self, Gateway}; +``` +From the [Axelar Gas Service](/dev/general-message-passing/sui/gmp-contracts/#sui-gas-service) you will use the Gas Service object. + +```rust +use gas_service::gas_service::GasService; +``` + +From the [Relayer Discovery](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/relayer_discovery) you will use the Relayer Discovery object and Discovery mechanic + +```rust +use relayer_discovery::discovery::RelayerDiscovery; +use relayer_discovery::transaction; +``` + +From standard `move` library helpers you can use the following + +```rust +use std::ascii::{Self, String}; +use std::type_name; +``` + +Lastly, from the Sui SDK you can use + +```rust +use sui::address; +use sui::event; +use sui::hex; +use sui::coin::Coin; +use sui::sui::SUI; +``` + +### `Singleton` + +The `singleton` is a resource type that lives in its own on-chain [object](https://docs.sui.io/concepts/object-model). In the case of this package this object owns the package's [channel](/dev/general-message-passing/sui/gmp-contracts/#channel). The Singleton's `id` gives it a unique on-chain object identity. + +You can create your package's singleton as follows: + +```rust +public struct Singleton has key { + id: object::UID, + channel: Channel, +} +``` + +Where the `id` is the unique identifier for the on-chain object and the `channel` is imported from the [Gateway dependency](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/axelar_gateway). + +### `Init` + +With your singleton now setup, you can create your `initialize` function that will be used to [initialize](https://move-book.com/programmability/module-initializer.html) the GMP package. This function will take a single parameter: + +- `ctx: &mut TxContext`: A mutable reference to [TxContext](https://docs.sui.io/references/framework/sui/tx_context#sui_tx_context_TxContext) + +In the `init` function you can then setup a new `object` id, create your unique `channel` and associate the two together via the [transfer::share_object](https://docs.sui.io/references/framework/sui/transfer#sui_transfer_share_object) function to publish a `singleton` resource. + +```rust +fun init(ctx: &mut TxContext) { + // Create a new object id for the singleton + let singletonId = object::new(ctx); + // Create a new channel + let channel = channel::new(ctx); + // Publish the singleton + transfer::share_object(Singleton { + id: singletonId, + channel, + }); +} +``` + +### `Send Message` + +With your `channel` now setup for your package you can begin to write the functionality to actually send the cross-chain message. The `send_message()` function will take the following parameters: + +1. `singleton: &Singleton`: A reference to the `singleton` resource to identify the `channel` +1. `gateway: &Gateway`: A reference to the gateway's published object id that contains key Axelar functionality +1. `gas_service: &mut GasService`: A mutable reference to the gas service's object id +1. `destination_chain: String`: The name of the destination chain to send the message to +1. `destination_address: String`: The recipient address on the destination chain +1. `payload: vector`: The payload to send to the destination chain +1. `refund_address: address`: The address to send any surplus gas payment back to +1. `coin: Coin`: The gas coin to be spent on message delivery +1. `params: vector`: For future use, this parameter is currently unused and can be passed in with an empty value + +The function signature can be written out as follows: + +```rust +public fun send_message( + singleton: &Singleton, + gateway: &Gateway, + gas_service: &mut GasService, + destination_chain: String, + destination_address: String, + payload: vector, + refund_address: address, + coin: Coin, + params: vector, +) {} +``` + +Note: the `gas_service` param is of specified as mutable because you will eventually update the `GasService` resource’s internal state (by consuming the provided coin). + +You can now begin to implement the functionality for `send_message()`. + +First you can create a new [Message Ticket](/dev/general-message-passing/sui/gmp-contracts/#message-ticket). This can be interacting with the `Gateway's` `prepare_message()` function. + +```rust +let message_ticket = gateway::prepare_message( + &singleton.channel, + destination_chain, + destination_address, + payload, +); +``` + +The ticket will contain all the relevant parameters needed when triggering a cross-chain message. + +Next, you can interact with the `GasService` to pay for the entirety of the cross chain call from the source chain. This can be done by triggering the `pay_gas()` function. The gas payment will be picked up by an Axelar relayer and eventually used to pay for the [execution fee](/dev/gas-service/pay-gas/#execution-fee) on the destination chain. + +```rust +gas_service.pay_gas( + &message_ticket, + coin, + refund_address, + params, +); +``` + +Lastly, you can trigger the Gateway's `send_message()` function to trigger the cross-chain message by passing in the `message_ticket` you created earlier. + + +```rust +gateway.send_message(message_ticket); +``` + +The complete `send_message()` function should look like this: + +```rust +public fun send_message( + singleton: &Singleton, + gateway: &Gateway, + gas_service: &mut GasService, + destination_chain: String, + destination_address: String, + payload: vector, + refund_address: address, + coin: Coin, + params: vector, +) { + // Create a new message ticket + let message_ticket = gateway::prepare_message( + &singleton.channel, + destination_chain, + destination_address, + payload, + ); + + // Pay for the gas + gas_service.pay_gas( + &message_ticket, + coin, + refund_address, + params, + ); + + // Dispatch the cross-chain message + gateway.send_message(message_ticket); +} +``` + +### Receive Message + +With the package now able to send cross-chain messages, it would be great to also receive messages from other blockchains. This can be done by creating an `execute()` function triggered by Axelar's relaying infrastructure for any incoming message. The full function signature for the `execute()` function will require two parameters: + +1. `call: ApprovedMessage`: The [approved message](/dev/general-message-passing/sui/gmp-contracts/#approvedmessage) that was sent from the source chain +1. `singleton: &mut Singleton`: A mutable reference to the `singleton` resource so the package can consume messages from its `channel` + +```rust +public fun execute( + call: ApprovedMessage, + singleton: &mut Singleton +) {} +``` + +Within the `execute()` function, you can then consume the message by triggering the [consume_approved_message()](/dev/general-message-passing/sui/gmp-contracts/#consume-approved-message) function that is [defined](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/axelar_gateway/sources/channel.move#L85) in the `Channel` module. Once the message is approved, you can `emit` a custom event indicating that the execution has gone through successfully. + +Your complete `execute()` function should look like this: + +```rust +public fun execute( + call: ApprovedMessage, + singleton: &mut Singleton +) { + // Consume the message + let (_, _, _, payload) = singleton.channel.consume_approved_message(call); + + // Emit Executed event + event::emit(Executed { data: payload }); +} +``` + +This will lead to an error, however, as you have not yet defined your event, you can do so up top as follows. Note unlike the `Singleton` struct that had a `key` allowing it to be its own on-chain object, the `Executed` struct has a `copy` + `drop` [abilities](https://docs.sui.io/references/sui-api/sui-graphql/reference/types/enums/move-ability) so the event data can be duplicated into the transaction’s event log and then discarded by off-chain indexers. The event takes a raw payload of bytes that it will receive in the cross-chain call. + +```rust +public struct Executed has copy, drop { + data: vector, +} +``` + +With the event now defined up top you should be able to compile the package successfully. + +### Register Transaction + +Unlike in EVM chains, Sui cross-chain transactions involve an additional step to be able to receive cross-chain messages, beyond just defining the `execute()` function. Packages must be [registered](/dev/general-message-passing/sui/gmp-contracts/#relayer-discovery) with the [Relayer Discovery](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/relayer_discovery). + +You can define a specific function your contract to do just that. The `register_transaction()` function will take the following parameters: + +1. `discovery: &mut RelayerDiscovery`: A mutable reference to the `Relayer Discovery` object id. Mutable as the state of the Relayer Discovery will be updated to set the new transaction. +1. `singleton: &Singleton`: A mutable reference to the `singleton` resource. + +```rust +public fun register_transaction( + discovery: &mut RelayerDiscovery, + singleton: &Singleton) { +} +``` + +The first thing you will need to do is create a nested vector for the arguments that will be used by the relayer when calling the `execute()` function. + +```rust +let arguments = vector[ + //arg `2` corresponding to ApprovedMessage + vector[2u8], + //arg `0` corresponding to an object, which in this case is the singleton + concat(vector[0u8], object::id_address(singleton).to_bytes()), +]; +``` + +The `vector[2u8]` corresponds to the `ApprovedMessage` argument that the relayer will need to pass in to the `execute()` function. It is one of [five argument types](/dev/general-message-passing/sui/gmp-contracts/#argument-types) that the relayer will know how to handle. + +Now that the relayer knows to submit the `ApprovedMessage` to the `execute()` function you can also pass the id of the singleton that will consume the message. To pass in the singleton you `concat` the `0x00` argument type, which tells the relayer that it should an expect an object type with object id of the singleton. + +You now have a template for invoking the `gmp::execute()` function. + +Next, you will need to create a [transaction](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/relayer_discovery/sources/types/transaction.move) that uses the `arguments` vector you just created. + +The `new_transaction()` function call expects several parameters. + +1. `is_final: bool`: For this you simply pass `true` telling the relayer to execute the transaction. +1. `move_calls: vector`: A vector of [MoveCalls](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/relayer_discovery/sources/types/transaction.move#L44) + +```rust + let transaction = transaction::new_transaction( + true, + vector[ + transaction::new_move_call( + transaction::new_function( + address::from_bytes( + hex::decode( + *ascii::as_bytes( + &type_name::get_address( + &type_name::get(), + ), + ), + ), + ), + ascii::string(b"gmp"), + ascii::string(b"execute"), + ), + arguments, + vector[], + ), + ], + ); +``` + +The `is_final` can simply be set to `true`. The `move_calls()` needs to receive the `function`, `arguments`, and `type_arguments` that will be triggered on that package for the object id that is being sent by the relayer. In your case the function is the `execute` function on the `gmp` module. The `arguments` are the `ApprovedMessage` object and the `singleton` you had put together previously, and the `type_arguments` can be left empty for now. + + +The output of this will be your new `transaction` that you can pass into the Relayer Discover's [register_transaction()](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/relayer_discovery/sources/discovery.move#L93) function along with a reference to your package's `channel` as follows: + +```rust +discovery.register_transaction(&singleton.channel, transaction); +``` + +Once this is called your package will be registered with the Relayer Discovery so it can begin receiving cross-chain messages. + +Lastly you can define your `concat()` helper function to append the arguments used in the `register_transaction()` function. + +```rust +fun concat(v1: vector, v2: vector): vector { + let mut result = v1; + result.append(v2); + result +} +``` + +#### Why is this needed? + +In the EVM ecosystem because you inherited from AxelarExecutable, the relayer already knows your contract’s function signature and where to call it. This is because on EVM chains contracts also hold their own storage. On Sui chains package logic is separate from objects that are holding the relevant state. As a result the destination that is sent from the source chain will be the `channel_id` as opposed to the `package_id`. In other words, the package ID just tells you which code to run; the channel ID tells you where to run it and which messages to pull in + +## Deploy To Sui Testnet + +At this point your `move` GMP Package is now complete. What remains is to deploy the contract to the Sui testnet and send/receive the cross-chain messages. + +To deploy the contract you can make use of [Sui's Typescript SDK](https://www.npmjs.com/package/@mysten/sui). + +### Setup Sui Deployment + +To get setup in the root of your project you can run `npm init -y` to generate a `package.json` file. Next, you can install the following dependencies + +- [dotenv](https://www.npmjs.com/package/dotenv) +- [mysten/sui](https://www.npmjs.com/package/@mysten/sui) +- [commander](https://www.npmjs.com/package/commander) +- [axelar-cgp-sui](https://www.npmjs.com/package/@axelar-network/axelar-cgp-sui) + +This can be done by running `npm i dotenv @mysten/sui commander @axelar-network/axelar-cgp-sui`. + +Open a new `scripts` directory and add a `deploy.js` file. + +You can then begin writing your deploy script by setting up your program command in your `deploy.js` file. + +```js +import { Command } from 'commander'; + + +const program = new Command(); +program + .description('Build and publish a Sui Move package with GMP support') + .action(async (opts) => { + try { + await run(opts); + } catch (err) { + console.error('❌ Error:', err.message || err); + process.exit(1); + } + }); + +program.parse(process.argv); +``` + +Then define an empty `run()` function up above that will be triggered you when run the script + +```js +async function run() {} +``` + +### Build Move Package + +You can begin by importing the `execSync` helper up top that will be used to run cli commands from your script. + +```js +import { execSync } from 'child_process'; +``` + +Then in the `run()` function you can use `exectSync()` to run the relevant Sui cli command to build the contract. + +```js +const buildOutput = execSync( + `sui move build --dump-bytecode-as-base64`, + { encoding: 'utf-8' } +); +``` + +This will return a `buildOutput`, which is the compiled `Move` bytecode serialized as `Base64` strings, packed into a `JSON` object. + +You can then obtain the `modules` and `dependencies` from the compiled `buildOutput`. + +```js +const { modules, dependencies } = JSON.parse(buildOutput); +``` + +At this point you should be able to run `node scripts/deploy.js` and build your function. The logs should appears as follows + +```bash +INCLUDING DEPENDENCY GasService +INCLUDING DEPENDENCY RelayerDiscovery +INCLUDING DEPENDENCY AxelarGateway +INCLUDING DEPENDENCY Utils +INCLUDING DEPENDENCY VersionControl +INCLUDING DEPENDENCY Sui +INCLUDING DEPENDENCY MoveStdlib +BUILDING gmp_example +``` + +### Configure Wallet Access for Deployment + +Before publishing to the blockchain you need to setup your wallet that will send the transaction. + +You can create a new `utils/index.js` file where you can define a new function called `getWallet()` + +This function will require several imports up top + +```js +import { ethers } from 'ethers'; +import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'; +import { SuiClient } from '@mysten/sui/client'; +import 'dotenv/config'; +``` + +In the `getWallet()` function will create a new [Ed25519Keypair](https://sdk.mystenlabs.com/typedoc/classes/_mysten_sui.keypairs_ed25519.Ed25519Keypair.html) and `client` object that can be returned to be used later. The keypair will be created based on your private key that should be saved in your `.env` file. + +```js +export function getWallet() { + const client = new SuiClient({ url: 'https://fullnode.testnet.sui.io/' }); + + const rawKey = process.env.PRIVATE_KEY; + if (!rawKey) { + console.error('PRIVATE_KEY not set in your .env'); + process.exit(1); + } + + const keypair = Ed25519Keypair.fromSecretKey(rawKey); + return [keypair, client]; +} +``` + +Now back in your main `deploy.js` script in your `run()` function you can call `getWallet()` as follows + +```js + const [keypair, client] = getWallet() +``` + + +### Publish the Package on-chain +To publish the package on chain you will need to sign a transaction from your Sui Wallet that deploys the package. + +First import the `Transaction` from the Sui SDK +```js +import { Transaction } from '@mysten/sui/transactions'; +``` + +Then back in your `run()` function you can execute the transaction publishing your package. + +```js +//create new tx +const tx = new Transaction(); +//publish the package +const [upgradeCap] = tx.publish({ modules, dependencies }); +``` + +The `modules` and `dependencies` being passed are the same ones that were destructured from the build output above. + +The returned `upgradeCap` is an on-chain resource that the Sui mints for you whenever you publish a package, the address that holds the `cap` is able to upgrade the package at a future point. Further reading on this can be found [here](https://sdk.mystenlabs.com/typescript/transaction-building/basics#transactions). To ensure you are the one with the ability to upgrade the package that you deploy you can pass the `cap` to your own address. + +This can be done as follows: + +```js +//get your sui address +const myAddress = keypair.getPublicKey().toSuiAddress(); + +//transfer upgrade capability to your address +tx.transferObjects([upgradeCap], myAddress); +``` + +Now you can go ahead and publish the transaction by calling the `signAndExecuteTransaction()` function from the Sui client. It expects three parameters: + +1. `signer`: The signer of the transaction +1. `transaction`: The transaction to be executed +1. `options`: Optional extra configurations to go along with the transaction + +You can make the call as follows: + +```js +const response = await client.signAndExecuteTransaction({ + signer: keypair, + transaction: tx, + options: { showObjectChanges: true }, +}); +console.log('✅ Publish succeeded!'); +``` + +At this point you will have successfully published your package! + +The final thing you will need is to get the `packageId` and the `singletonObjectId` for your package. + +At the bottom of your `run()` function you can obtain these two values as follows: + +```js +const publishedChange = response.objectChanges.find(c => c.type === 'published'); +console.log('📦 Published package ID:', publishedChange?.packageId); + + +const [gmpSingletonObjectId] = getObjectIdsByObjectTypes(response, [ +`${publishedChange.packageId}::gmp::Singleton`, +]); +console.log('🔑 GMP Singleton Object ID:', gmpSingletonObjectId); +``` + +The `packageId` can be found by going through the `objectChanges` in the `response` for the signed transaction. The `gmpSinlgetonObjectId` however requires a helper function called `getObjectIdsByObjectTypes()`. + +This helper function that is yet to be defined will find a specified object in a given transaction and return the object's `objectId`. In your case you need to fine the `objectId` for the `singleton`. The function can be written out as follows: + +```js +export const getObjectIdsByObjectTypes = (txn, objectTypes) => + objectTypes.map((objectType) => { + const objectId = txn.objectChanges.find((change) => + change.objectType?.includes(objectType) + )?.objectId; + + if (!objectId) { + throw new Error(`No object found for type: ${objectType}`); + } + return objectId; +}) +``` + + +Great! At this point when you run `node scripts/deploy.js` you should see the following logs. + +```bash +node scripts/deploy.js +📦 Building Move package +INCLUDING DEPENDENCY GasService +INCLUDING DEPENDENCY RelayerDiscovery +INCLUDING DEPENDENCY AxelarGateway +INCLUDING DEPENDENCY Utils +INCLUDING DEPENDENCY VersionControl +INCLUDING DEPENDENCY Sui +INCLUDING DEPENDENCY MoveStdlib +BUILDING gmp_example +🚀 Sending publish transaction… +✅ Publish succeeded! +📦 Published package ID: 0x9068ae5fb08615d7fd9f869d6d1cf47ec21fa687ca7ab3d7d68b45a7b2cfd041 +🔑 GMP Singleton Object ID: 0x9cbb3582c80ed49ca5d0cacce23b2cdb145bd10421f2c969d36799e3cbd78c52 +``` + + +## Interact With Contract + +The final (and most exciting) thing that needs to be done is to actually interact with the package now that it's live on-chain. In your `scripts` directory, next to your `deploy.js` script you can create a new script called `gmp.js`. + +### Setup + +This script will also user the `commander` tool to execute + +#### Command Setup + + + +Similarly to the `deploy` script, you can begin by setting up a new `Command`. This command however will require significantly more parameters than the deployment did, so as to specify the params for the `send_message()` function in your `move` package. + +This will prompt you to pass in +1. The `destination chain` +1. The `destination address` on the destination chain +1. The `id` of the singleton object (that should be logged in your deployment script) +1. The `fee` you are paying to the [axelar gas service](/dev/general-message-passing/sui/gmp-contracts/#sui-gas-service) when sending the cross-chain transaction. +1. The `payload` for the gmp message being sent +1. The `refundAddress` to receive any surplus funds sent to the gas service +1. The `packageId` of your live package on the Sui blockchain + +```js +const program = new Command() +program + .command('sendCall') + .description('Send a GMP call') + .requiredOption('--destChain ', 'Destination chain') + .requiredOption('--destAddress ', 'Destination address') + .requiredOption('--singletonId ', 'Singleton object ID') + .requiredOption('--fee ', 'Fee in atomic units') + .requiredOption('--payload ', 'Payload bytes (hex)') + .requiredOption('--refundAddress ', 'Refund address') + .requiredOption('--packageId ', 'Package ID') + .action(async (opts) => { + const args = { ...program.opts(), ...opts } + const [keypair, client] = getWallet() + try { + await run( + keypair, + client, + [ + args.destChain, + args.destAddress, + args.singletonId, + args.fee, + args.payload, + args.refundAddress, + ], + args.packageId + ) + } catch (error) { + console.error('❌ Error:', error.message); + process.exit(1); + } + }) + +program.parseAsync(process.argv) +``` + +In the `action()` for the command you trigger the `getWallet()` and `run()` functions. The `getWallet()` was previously defined in the `utils/index.js` helper file, it can be imported up top. + +The `run()` function can be defined up top we will return to this shortly. + +```js +async function run(keypair, client, args, packageId) {} +``` + +### Send Message + +In the `run()` function that you just defined you can begin to implement the functionality to interact with your contract. + +First, you can destructure the arguments that were passed in the command + +```js + const [ + destinationChain, + destinationAddress, + singletonId, + feeAmount, + payload, + refundAddress, + ] = args +``` + +Next, you can create a new `Transaction` object, make sure you import the transaction up top, the way you did in the `deployment` script. + +```js +import { Transaction } from '@mysten/sui/transactions' + +//back in your run() function add +const tx = new Transaction() +``` + +Now, you can begin to write up the `moveCall()` to trigger the `send_call()` function. The `moveCall()` will take two parameters + +1. `target`: Which entry-function in your module of that package should be invoked +1. `arguments`: The arguments to be passed into the function being called. + +Before writing the `moveCall()` it is worth to review the relevant params. Recall the `send_call()` function expects the following params + +```rust +public fun send_call( + singleton: &Singleton, + gateway: &Gateway, + gas_service: &mut GasService, + destination_chain: String, + destination_address: String, + payload: vector, + refund_address: address, + coin: Coin, + params: vector, +) {} +``` + +In our destructured array you hav already obtained most of these including; `singletonId`, `destination_chain`, `destination_address`, `payload`, and the `refund_address`. + +What you still need to pass in is the `gateway`, `gas_service`, `coin`, and the `params`. + +To obtain the four missing parameters you can add the following. First for the missing object ids of the Axelar Gateway](/dev/general-message-passing/sui/gmp-example/#sui-gateway) and [Gas Service](/dev/general-message-passing/sui/gmp-contracts/#sui-gas-service) (for the purpose of this demo) you can simply hardcode values of the relevant object ids. + +```js +const gasServiceId = '0xac1a4ad12d781c2f31edc2aa398154d53dbda0d50cb39a4319093e3b357bc27d' +const gatewayId = '0x6fc18d39a9d7bf46c438bdb66ac9e90e902abffca15b846b32570538982fb3db' +``` + +For the `coin` you must generate the appropriate [coin type](https://docs.sui.io/references/framework/sui/coin#sui_coin_Coin) that the package is expecting. This can be done by running the `splitCoins()` function, from the Sui SDK. + +```js +const unitAmount = getUnitAmount(feeAmount) +const [coin] = tx.splitCoins(tx.gas, [unitAmount]) +``` + +`getUnitAmount()` can be added as a helper function in your `./utils/index.js` file. + +```js +import { ethers } from 'ethers'; + +export function getUnitAmount(amount, decimals = 9) { + return ethers.utils.parseUnits(amount, decimals).toBigInt(); +} +``` + +Under the hood the `splitCoins()` function is expecting the `tx.gas`, which translates into your wallet's default gas coin and `unitAmount`, whih is the parsed amount of gas you are sending to pay for the call. The `splitCoins()` function will create a new object of exactly the `unitAmount` you passed in. Further reading can be found [here](https://sdk.mystenlabs.com/typescript/transaction-building/basics) + +Lastly to get the `payload` you can first `encode()` the `payload` into a `uint8array` of raw `bytes`. Then you can wrap that raw `bytes` array into Sui’s [BCS](https://sdk.mystenlabs.com/bcs) format for a `vector` + +```js +const encodedPayload = new TextEncoder().encode(payload) +const serializedPayload = bcs.vector(bcs.u8()).serialize(encodedPayload) +``` + +Finally, with all the required data you can pass it into the `moveCall()` function call from your `tx` object as follows: + +```js +tx.moveCall({ + target: `${packageId}::gmp::send_call`, + arguments: [ + tx.object(singletonId), + tx.object(gatewayId), + tx.object(gasServiceId), + tx.pure(bcs.string().serialize(destinationChain).toBytes()), + tx.pure(bcs.string().serialize(destinationAddress).toBytes()), + tx.pure(serializedPayload), // + tx.pure.address(refundAddress), + coin, // + tx.pure( + bcs + .vector(bcs.u8()) + .serialize(new Uint8Array(arrayify(0x0))) + .toBytes() + ), + ], +}) +``` + +Everything that is passed in here now has been either explicitly defined in the steps before or passed in as an argument when calling the script. The only item that is not is the very last item in the argument that goes into the `params` field in the `send_call()` function. This can simply be an empty `bcs` encoded `0x0` value. + +With the `tx` call now constructed you can trigger the `signAndExecuteTransaction()` on the Sui client to broadcast the transaction to the network. + +```js +const receipt = await client.signAndExecuteTransaction({ + signer: keypair, + transaction: tx, + options: { + showEffects: true, + showObjectChanges: true, + showEvents: true, + }, +}) + +console.log('✅ Tx', receipt.digest) +``` + +### Receive Message + +At this point your `gmp.js` script is now complete, there is no extra functionality that needs to be run to `execute()` each incoming message as it is submitted into Sui by the Axelar relayer. The only thing you will need to do is make sure to trigger the `register_transaction()` function that you have previously written ou on your package. We will return to this once the package is deployed. + + +## Testing + +### Deploy Package + +Let's now deploy your package to the Sui testnet using your `deploy.js` script. + +Run `node scripts/deploy.js` + +This returns + +```bash +❯ node scripts/deploy.js +📦 Building Move package +INCLUDING DEPENDENCY GasService +INCLUDING DEPENDENCY RelayerDiscovery +INCLUDING DEPENDENCY AxelarGateway +INCLUDING DEPENDENCY Utils +INCLUDING DEPENDENCY VersionControl +INCLUDING DEPENDENCY Sui +INCLUDING DEPENDENCY MoveStdlib +BUILDING gmp_example +🚀 Sending publish transaction… +✅ Publish succeeded! +📦 Published package ID: 0xb05b08f9edcde940dddb5da350b3cd1f4015785db0777079d0954e4bb9e04c3a +🔑 GMP Singleton Object ID: 0x4ecf424aafacc8bf1589ab557dd96aec51e4ed3d7a6bc5fb4f3acbdca54cd388 +``` + +### Interact + +Now that you have a live package you can begin to interact with it. For this test you can send a message from your new Sui package to an EVM contract on a given EVM chain. We will use this address `0x93294Ed80495194d069FB10636D16638139b0EbA` on the [Avalanche blockchain](https://testnet.snowtrace.io/address/0x93294Ed80495194d069FB10636D16638139b0EbA). The deployed contract corresponds to this [Solidity GMP contract](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/call-contract), it will simply receive an event on Avalanche, emit and `Executed` event and store the message in a storage variable. + +#### Sui --> Avalanche + +To send the message using your `gmp.js` you can call the script as follows. + +```bash +node scripts/gmp.js sendCall \ + --destChain avalanche \ + --destAddress 0x93294Ed80495194d069FB10636D16638139b0EbA \ + --singletonId 0x4ecf424aafacc8bf1589ab557dd96aec51e4ed3d7a6bc5fb4f3acbdca54cd388 \ + --fee 0.01 \ + --payload "hello from sui" \ + --refundAddress \ + --packageId 0xb05b08f9edcde940dddb5da350b3cd1f4015785db0777079d0954e4bb9e04c3a +``` + +This will log out the transaction hash + +```bash +✅ Tx 5xNRuT4wbFSCfgtN2ZVUHPntE5SRA5JATPWSqVKYdY2R +``` + +You can then search for your transaction on the [Axelarscan Explorer](https://testnet.axelarscan.io/gmp/5xNRuT4wbFSCfgtN2ZVUHPntE5SRA5JATPWSqVKYdY2R-1) + +Now, on the live contract on avalanche you should see the `Executed` event [being emitted](https://testnet.snowtrace.io/tx/0xf8a467a732dc58ff6f904b6cb5e2e601dac3ff5de8024c5f4ec559a8fcd10f85?chainid=43113) and when you query the `message` storage variable it should return `hello from sui`. + +#### Avalanche --> Sui + +With the Sui -> Avalanche transaction now working let's confirm that you can also receive message on you Sui contract from Avalanche. On the Avalanche side you can either interact with the contract through the explorer/cli/ or remix. We will use [Remix](https://remix.ethereum.org/?#gist=3ce3a199d93fb7b7f36e52082cca8bd5&lang=en&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.30+commit.73712a01.js) for simplicity. + +In your Solidity contract to send the message from Avalanche to Sui you can trigger the `setRemoteValue()` function in your contract and pass in + +1. `destinationChain`: `"sui"` +1. `destinationAddress`: `` +1. `message`: `"hello from avalanche"` + +The reason the `destinationAddress is "tbd" is because you need to first register your gmp package back on Sui with the `RelayerDiscovery`. You can writeup a script to do this but to showcase different ways of interacting with Sui, you can also do this via the [Sui Cli](https://docs.sui.io/references/cli). + +#### Register With Relayer Discover + +To register with the Relayer Discovery you can run the following command: + +```bash +sui client call \ + --package 0xb05b08f9edcde940dddb5da350b3cd1f4015785db0777079d0954e4bb9e04c3a \ + --module gmp \ + --function register_transaction \ + --args \ + 0xac080ff19b7d44c9362b83628253a4b55747779096034a72ca62ce89a188305e \ + 0x4ecf424aafacc8bf1589ab557dd96aec51e4ed3d7a6bc5fb4f3acbdca54cd388 \ + --gas-budget 5000000 +``` + +This will return a very large log message, the most important note for us however is in the `Transaction Block Events` logs where you can see the emitted `channel_id` for the `TransactionRegistered` event. You can grab that `channel_id` hex value and pass that in as the destiation chain address back on your Avalanche GMP call. An example of a `channel_id` is `0x317cb9668ef6a395eea3b3bf7734444564f5600c9f489d8f35aa197aa32ed324`. + + +Now, back on Avalanche you can complete the call by passing in `0x317cb9668ef6a395eea3b3bf7734444564f5600c9f489d8f35aa197aa32ed324` as the `destinationAddress` + +Once you trigger the `setRemoteValue()` (do not forget to pass in a `msg.value` to the call or the transaction will not execute) you should see the transaction going through on [Axelarscan](https://testnet.axelarscan.io/gmp/0xb453a3846ca877550ed90120816edbe0acf91109eca5f0458381acbe85742f42)! + +Great! At this point your `execute()` function on your `move` contract should be executing and you should see the `Executed` event being emitted on [Sui](https://suiscan.xyz/testnet/tx/FCMNF9dErhithDaeB5GP9kigtihCnfJbEoctrZqyLP7h). + + +## Conclusion + +You have now successfully built a `move` contract from scratch, deployed it on Sui testnet and sent a GMP message to and from an EVM chain with Sui, congratulations! We are looking forward to seeing what amazing Sui cross-chain GMP applications you will build. The next recommended reading is the Sui Interchain Token Service content to show you how to register fungible assets on Sui and send them to/from other chains connected to Axelar. + +Completed source code for this demo can be found [here](https://github.com/axelarnetwork/sui-gmp-demo). \ No newline at end of file diff --git a/src/content/docs/dev/general-message-passing/sui/intro.mdx b/src/content/docs/dev/general-message-passing/sui/intro.mdx new file mode 100644 index 000000000..a45f843dc --- /dev/null +++ b/src/content/docs/dev/general-message-passing/sui/intro.mdx @@ -0,0 +1,41 @@ +# Sui Integration Introduction + +import { Callout } from "../../../../../components/callout"; + +[Sui](https://sui.io/) is a blockchain that has been integrated with the Axelar Network via the [Interchain Amplifier](/dev/amplifier/introduction/). This integration enables cross-chain communication between Sui and other blockchains in the Axelar ecosystem. + +## Overview + +Sending messages between Sui and other blockchains follows similar patterns as [GMP messages](/dev/general-message-passing/overview/) on other chains, such as EVM chains. The core packages for Axelar's integration with Sui can be found in the [axelar-cgp-sui](https://github.com/axelarnetwork/axelar-cgp-sui) repository. + +The integration consists of two main components: + +1. **[Gateway Package](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/axelar_gateway)** - Facilitates the sending and receiving of cross-chain messages. +1. **[Gas Service](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/gas_service)** - Handles cross-chain gas payment for GMP requests. + +## Key Concepts + +### Channels + +In Sui, there is no ability to check the immediate caller of a message (unlike `msg.sender` in EVM). The `Channel` object serves as an identifier for who is calling and receiving messages in the Sui ecosystem. A Channel is a Move object that acts as a [capability](https://move-book.com/programmability/capability/)-backed on-chain identity with its own address. You create it and keep it; functions that take `&Channel` require the caller to hold that capability. + +### Message Flow + +Sending a message from Sui involves these key steps: + +1. Prepare the message via the Gateway. +1. Pay gas via the Gas Service. +1. Send the message via the Gateway. + +Receiving a message involves: + +1. Register your transaction with the [relayer discovery service](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/relayer_discovery). +1. Message approval by Axelar relayers. +1. Message execution on your Sui contract. + +## Resources + +- For a complete Sui GMP implementation, check out this [example](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/example). +- To interact with the example and send a GMP message, see this [script](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/sui/gmp.js). + +The following sections will provide more detailed information about the implementation and usage of the Sui integration with Axelar. diff --git a/src/content/docs/dev/general-message-passing/verify-gmp-tx.mdx b/src/content/docs/dev/general-message-passing/verify-gmp-tx.mdx new file mode 100644 index 000000000..8e3418fd8 --- /dev/null +++ b/src/content/docs/dev/general-message-passing/verify-gmp-tx.mdx @@ -0,0 +1,45 @@ +# GMP Message Verification + +Axelar enables messages to be sent between two different blockchains. When a message is sent from a source chain to a destination chain, Axelar verifies that the incoming message on the destination chain is the authentic message that was sent on the source chain, having passed through the Axelar blockchain and confirmed by Axelar's validators. + +## Ethereum Virtual Machine (EVM) + +On EVM based chains such as Ethereum or Avalanche, connections to Axelar are initiated via the [Gateway Contract](https://github.com/axelarnetwork/axelar-cgp-solidity/blob/main/contracts/AxelarGateway.sol). The Gateway is used on both the source and the destination chain. On the source chain it is used to trigger the interchain transaction, on the destination chain it is triggered by the [Axelar Executable](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/blob/main/contracts/executable/AxelarExecutable.sol) to [validate](https://github.com/axelarnetwork/axelar-cgp-solidity/blob/2023fadee722c3896f1071c2a9d578436643c5a7/contracts/AxelarGateway.sol#L233) an incoming GMP message. + +#### Validate Contract Call + +The `validateContractCall()` function is called on every inbound GMP message to ensure that the incoming message is authentic. This function receives the relevant parameters of a GMP call including; + +1. `CommandId`: A unique id for interchain messages +2. `SourceChain`: The source chain of the GMP message +3. `SourceAddress`: The source address of the contract call +4. `PayloadHash`: A hash of the GMP message that was sent with the call + +Using this information it confirms that the inbound call has indeed been verified by the Axelar network and that this data is the authentic data passed in from the source chain rather than a malicious execution with invalid data on the destination chain. + +Once this function has been called the transaction is marked as _Executed_ on the destination chain to avoid double execution. + +Please watch [here](https://www.youtube.com/watch?v=qF9cVhcD2CY) for more information on validating incoming messages. + +## Cosmos + +On Cosmos, [validation](/dev/general-message-passing/cosmos-gmp/overview/#establishing-a-path-of-trust) is conducted on Axelar before calling a destination contract. + +### Evm -> Cosmos + +For messages coming from [EVM to Cosmos](https://github.com/axelarnetwork/evm-cosmos-gmp-sample/tree/main/cosmwasm-integration#authenticate-the-sender), Axelar users a unique sender to handle communication `axelar1dv4u5k73pzqrxlzujxg3qp8kvc3pje7jtdvu72npnt5zhq05ejcsn5qme5`. Then on the destination chain itself Axelar derives a unique caller to execute the transaction. On your contract you simply must ensure that the address triggering the transaction is the unique Axelar address to know that this is the authentic call coming from the Axelar network. The Axelar account is derived via the `DeriveIntermediateSender` sender function. + +``` +func DeriveIntermediateSender(channel, originalSender, bech32Prefix string) (string, error) { + senderStr := fmt.Sprintf("%s/%s", channel, originalSender) + senderHash32 := address.Hash(types.SenderPrefix, []byte(senderStr)) + sender := sdk.AccAddress(senderHash32[:]) + return sdk.Bech32ifyAddressBytes(bech32Prefix, sender) +} +``` + +For the Neutron blockchain for example to derive the Axelar account you pass in `channel-2`, `axelar1dv4u5k73pzqrxlzujxg3qp8kvc3pje7jtdvu72npnt5zhq05ejcsn5qme5` , `neutron` to the `DeriveIntermediateSender` function. + +### IBC Hooks + +If you’re using [IBC hooks (iirc)](https://github.com/osmosis-labs/osmosis/tree/main/x/ibc-hooks#wasm-hooks) to trigger wasm contracts, it will derive the sender for the wasm call itself (rather than just the plain IBC sender). In this instance as well you can require the contract to expect this specific derived sender address. diff --git a/src/content/docs/dev/general-message-passing/xrpl/xrpl-gmp.mdx b/src/content/docs/dev/general-message-passing/xrpl/xrpl-gmp.mdx new file mode 100644 index 000000000..fdf6fa5d4 --- /dev/null +++ b/src/content/docs/dev/general-message-passing/xrpl/xrpl-gmp.mdx @@ -0,0 +1,196 @@ +# XRPL General Message Passing (GMP) + +The XRPL Blockchain is unique compared to other blockchains integrated with Axelar. Unlike other blockchains, XRPL does not support smart contracts. As such there is no Axelar Gateway and Axelar Gas Service deployed on the chain the way there is with other EVM and non-EVM blockchain integrations. Since XRPL has no contracts there is also no ability to receive [GMP messages](/dev/general-message-passing/overview/) from other blockchains, you can only send messages to other blockchains. + +## XRPL Gateway + +The integration leverages the [XRPL Multisig Signing](https://xrpl.org/docs/concepts/accounts/multi-signing) and proof of stake security via the [Amplifier Protocol](/dev/amplifier/introduction/#what-is-the-interchain-amplifier) to facilitate GMP. The gateway is controlled by the [Axelar Verifier set](https://axelarscan.io/verifiers). + +The testnet address for the XRPL Gateway is: [rNrjh1KGZk2jBR3wPfAQnoidtFFYQKbQn2](https://testnet.xrpl.org/accounts/rNrjh1KGZk2jBR3wPfAQnoidtFFYQKbQn2). + +The mainnet address for the XRPL Gateway is: [rfmS3zqrQrka8wVyhXifEeyTwe8AMz2Yhw](https://livenet.xrpl.org/accounts/rfmS3zqrQrka8wVyhXifEeyTwe8AMz2Yhw). + +## Send GMP Message + +### Overview + +The flow for sending a GMP message from XRPL involves sending a [payment transaction](https://xrpl.org/docs/references/protocol/transactions/types/payment) from your XRPL account to the XRPL Gateway with a specified [memo](https://xrpl.org/docs/references/protocol/transactions/common-fields#memos-field) field. Once the transaction is confirmed, Axelar's relayer will pickup any transaction sent to the Gateway with the `call_contract` message type specified at which the point the [Amplifier GMP flow](/dev/amplifier/introduction/#general-message-passing-with-amplifier) will commence. + +### Payment Transaction + +Payment transaction types in XRPL represent a transfer of value. They require the following fields: + +1. `Transaction Type`: The [type](https://xrpl.org/docs/references/protocol/transactions/types) of XRPL transaction being sent. +1. `Account`: The sender's account address. +1. `Amount`: The amount of XRP being sent to cover the [cross-chain transaction fees](/dev/gas-service/intro/). +1. `Destination`: The destination of the transaction. +1. `Memos`: A special field in the payment transaction that is used to specify the message type, destination chain, destination address, and GMP payload. + +### Memo + +When sending a GMP message the `memo` field contains the relevant metadata for the transaction. + +The memo must contain the following fields: + +1. `type`: The type of transaction being sent (in this case, it should be of type `call_contract`). +1. `destination_address`: The address of the destination contract on the destination chain. +1. `destination_chain`: The name of the destination chain. +1. `payload`: The payload of the transaction being sent. + +All the data passed into the memo must be encoded in hex format as a list of objects. Each object has a `MemoType` representing the type data being passed in as well as a `MemoData` representing the data being passed in. + +For a complete `JSON` example of the entire required XRPL GMP fields you can look at the following: + +```json +{ + TransactionType: "Payment", + Account: user.address, + Amount: "1000000", // (1 xrp) used to pay cross-chain transaction fees. + // Amount: { // alternatively, an IOU token amount can be used to cover gas fees + // currency: "ABC", // IOU's currency code + // issuer: "r4DVHyEisbgQRAXCiMtP2xuz5h3dDkwqf1", // IOU issuer's account address + // value: "1" // IOU amount to allocated to gas fees (in this case, 1 ABC.r4DVH) + // }, + Destination: gateway.address, + Memos: [ + { + Memo: { + MemoType: "74797065", // hex("type") + MemoData: "63616c6c5f636f6e7472616374" // hex("call_contract") + }, + }, + { + Memo: { + MemoType: "64657374696e6174696f6e5f61646472657373", // hex("destination_address") + MemoData: "30413930633041663142303766364143333466333532303334384462666165373342446133353845" // hex("0A90c0Af1B07f6AC34f3520348Dbfae73BDa358E"), in this case: (0x is omitted) + }, + }, + { + Memo: { + MemoType: "64657374696E6174696F6E5F636861696E", // hex("destination_chain") + MemoData: "7872706c2d65766d2d6465766e6574", // destination chain, hex encoded - hex("xrpl-evm-devnet"), in this case + }, + }, + { + Memo: { + MemoType: "7061796c6f6164", // hex("payload") + // abi-encoded payload for executable destination contract address: + MemoData: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000e474d5020776f726b7320746f6f3f000000000000000000000000000000000000", + }, + }, + ], +} +``` + +### Example Gmp + +A full example can be found [here](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/xrpl/call-contract.js). + +The example makes use of the [XRPL Client library](https://www.npmjs.com/package/xrpl) + +The XRPL client simplifies the process of connecting to the XRPL network, building transactions, signing them, and submitting them for processing. Key components of the XRPL client include: + +The key function in this example is the `callContract()` function written out as follows. + +```js +async function callContract(_config, wallet, client, chain, options, args) { + await client.sendPayment( + wallet, + { + destination: chain.contracts.AxelarGateway.address, + amount: parseTokenAmount(options.gasFeeToken, options.gasFeeAmount), // token is either "XRP" or "." + memos: [ + { memoType: hex('type'), memoData: hex('call_contract') }, + { memoType: hex('destination_address'), memoData: hex(args.destinationAddress.replace('0x', '')) }, + { memoType: hex('destination_chain'), memoData: hex(args.destinationChain) }, + { memoType: hex('payload'), memoData: options.payload }, + ], + }, + options, + ); +} +``` + +This function constructs the `memo` that will be used for the transaction, passing in the `type`, `destination_address`, `destination_chain`, and `payload`. The [request](https://js.xrpl.org/classes/Client.html#request) functionality of the XRPL client is then used to submit a [signed](https://js.xrpl.org/classes/Wallet.html#sign) transaction. + + +To interact with the example run the following command + +```bash +node xrpl/call-contract.js -e testnet -n xrpl xrpl-evm 0x72d12C77D1eE1DB002F4437E4a96bAc87c3EF948 --gasFeeAmount 1 --gasFeeToken XRP --payload 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000 -y +``` + +This will send a message to the `0x72d12C77D1eE1DB002F4437E4a96bAc87c3EF948` address on the `XRPL-EVM` chain, with an abi encoded message of '*hello*'. + +Once the command is run you should see a [transaction](https://testnet.axelarscan.io/gmp/0xa229274f4903c539be1d7b60ca03332484b11029f1f5c4d6fd086a62d066ca92) on the Axelarscan explorer where you can track the entire cross-chain transaction. + +## Add Gas + +When making cross-chain transactions gas payments are paid out entirely on the source chain by the sender. Axelar's microservices handle the gas payments on the destination chain as well as on the Axelar network itself. In the event that the gas payment made on the source chain is insufficient to cover the gas fees of the cross-chain transaction, the transaction may get stuck mid-way through the cross-chain transaction. This can happen for a number of reasons for example if the gas price on the destination chain spikes after the transaction has already been sent on the source chain. To unblock a stuck transaction you can make use of the `add_gas` message to the XRPL Gateway to top up the underfunded transaction. + +The memo must contain the following fields: + +1. `type`: The type of message being sent, in this case, it should be of type `add_gas`. +1. `msg_id`: The transaction hash of the underfunded message that needs to be topped up. + +The message id must be passed as a hex encoded string. For example the message for the [transaction](https://devnet-amplifier.axelarscan.io/gmp/c7c653d2df83622c277da55df7fe6466098f5bc2e466e1251f42772d07016c8c) with the id `c7c653d2df83622c277da55df7fe6466098f5bc2e466e1251f42772d07016c8c` must be passed in as `6367636535636464646638333632326332373764613535646637666536343630363039386635626332653436366531323531663432373732643037303136633863` (hex encoded). + +For a complete `JSON` example of the entire required XRPL Add Gas fields you can look at the following: + +```json +{ + TransactionType: "Payment", + Account: user.address, // sender's account address + Amount: "1000000", // amount of XRP, in drops (in this case, 1 XRP), to top-up gas fees with + Destination: gateway.address, // Axelar gateway's account address + Memos: [ + { + Memo: { + MemoType: "74797065", // hex("type") + MemoData: "6164645f676173" // hex("add_gas") + }, + }, + { + Memo: { + MemoType: "6d73675f6964", // hex("msg_id") + MemoData: "63376336353364326466383336323263323737646135356466376665363436363039386635626332653436366531323531663432373732643037303136633863" + }, + }, + ], + ... +} +``` + +### Example Add Gas + +A full example can be found [here](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/xrpl/add-gas.js). + +The key function in this example is the `addGas()` function written out as follows. + +```js +async function callContract(config, wallet, client, chain, options, args) { + await client.sendPayment( + wallet, + { + destination: chain.contracts.AxelarGateway.address, + amount: parseTokenAmount(options.token, options.amount), + memos: [ + { memoType: hex('type'), memoData: hex('add_gas') }, + { memoType: hex('msg_id'), memoData: hex(options.msgId.toLowerCase().replace('0x', '')) }, + ], + }, + options, + ); +} +``` + +This function constructs the `memo` that will be used for the transaction, passing in the `type` and `msg_id`. + + +To interact with the example run the following command + +```bash +node xrpl/add-gas.js -e devnet-amplifier -n xrpl-dev --amount 0.1 --token XRP --msgId +``` + +This will send `0.1` XRP to the underfunded transaction with the `msg-id` that you specify. diff --git a/src/content/docs/dev/ibc-chain-onboarding.mdx b/src/content/docs/dev/ibc-chain-onboarding.mdx new file mode 100644 index 000000000..27051b233 --- /dev/null +++ b/src/content/docs/dev/ibc-chain-onboarding.mdx @@ -0,0 +1,42 @@ +import { Callout } from "../../../../src/components/callout"; + +# Onboard your IBC-compatible chain + +Follow these steps to onboard your Cosmos or IBC-compatible chain to the Axelar network. + +## Complete the connection request form + +Fill out the designated [Cosmos Chain Connection Request Form](https://docs.google.com/forms/d/18as2Dn7mrcxoic1K4UwnqnViU6QQx3cSuduHBVqYNCQ/edit#response=ACYDBNilAOeWdjJ8cnWODTkG-srrvfmGbwB3gMEw-dUo34OV26h8sA9uNk7_JHSE2U6GO9U). This form collects essential information about your chain and your team, which is important for a smooth integration process. Please ensure all provided information is accurate and complete. + +## Create an IBC channel with prerequisites + +Create an [Inter-Blockchain Communication (IBC)](https://tutorials.cosmos.network/academy/3-ibc/) channel that meets the following prerequisites: + +- **Auto-update by relayers** — Your IBC channel must be automatically updated by relayers every few hours (ideally every 2 to 3 hours). This ensures that the connection remains active and functional without manual intervention in the case of low transfer activity. +- **Trusting period for Axelar client** — Your Axelar client's trusting period should be set to **112 hours**. This duration corresponds to two-thirds of the unbonding period, aligning with security protocols. +- **Trusting period for your chain's IBC client** — Similarly, the trusting period for your chain’s IBC client should be set to exactly two-thirds of your chain's unbonding period. This is the recommended conservative configuration for trusting the IBC client state when the stake changes on the counterparty chain, accounting for potential downtimes. + +### Highly recommended: use a relayer service + +We strongly recommend partnering with a relayer to manage your IBC channel. A professional relayer can operate, update, and monitor your channel, ensuring its optimal performance and reliability. Utilizing a relayer service significantly reduces the risk of channel expiration and other potential issues. + + + It's the responsibility of the team to operate the relayer (including light + clients update, monitoring, etc) associated with the IBC channel. + + +## Configure your Keplr wallet + +In the connection request form, provide the URL or necessary details where we can retrieve the Keplr wallet configuration. + +## Transfer tokens + +Once you submit the connection request form, we will provide an address for you to send tokens to. Sending tokens is necessary for testing the integration and ensuring that transactions can be successfully completed across the established IBC channel. + +## Submit your chain’s logo + +Please provide your chain's logo **in both PNG and SVG formats** in the connection request form. High-quality logos are essential for visibility and recognition across our platforms and interfaces. + +## Feedback + +If you have any feedback or would like to report a bug, please file an issue in the [Axelar Developer Support repository](https://github.com/axelarnetwork/support/issues). The Interop Labs team is available to assist you with any questions you may have along the way. diff --git a/src/content/docs/dev/indexers/_meta.json b/src/content/docs/dev/indexers/_meta.json new file mode 100644 index 000000000..8ea4a479f --- /dev/null +++ b/src/content/docs/dev/indexers/_meta.json @@ -0,0 +1,3 @@ +{ + "overview": "Indexers" +} diff --git a/src/content/docs/dev/indexers/overview.md b/src/content/docs/dev/indexers/overview.md new file mode 100644 index 000000000..1e7b107fd --- /dev/null +++ b/src/content/docs/dev/indexers/overview.md @@ -0,0 +1,7 @@ +# Overview + +Indexers, in a broad context, play a fundamental role in organising and optimising data retrieval within various systems. These tools act as navigational aids, allowing efficient access to specific information by creating structured indexes. In the realm of databases and information management, indexers enhance query performance by creating a roadmap to swiftly locate data entries. + +In the context of blockchain and dApps, indexers go beyond traditional databases, facilitating streamlined access to on-chain data. This includes transaction histories, smart contract states, and event logs. In the dynamic and decentralised world of blockchain, indexers contribute to the efficiency of data queries, supporting real-time updates and ensuring the seamless functionality of diverse applications and platforms. + +There are several indexer solutions available, each offering different levels of decentralisation, ease of development, and performance for you to consider. These solutions serve as intermediaries to assist in indexing the Axelar network. diff --git a/src/content/docs/dev/indexers/subquery.md b/src/content/docs/dev/indexers/subquery.md new file mode 100644 index 000000000..39772467e --- /dev/null +++ b/src/content/docs/dev/indexers/subquery.md @@ -0,0 +1,24 @@ +# SubQuery + +## Intro + +SubQuery is a leading blockchain data indexer that provides developers with fast, flexible, universal, open source and decentralised APIs for web3 projects. SubQuery SDK allows developers to get rich indexed data and build intuitive and immersive decentralised applications in a faster and more efficient way. SubQuery supports 100+ ecosystems including Axelar, Cosmos, Ethereum, Polygon, Polkadot, Algorand, NEAR, and Avalanche. + +Another one of SubQuery's competitive advantages is the ability to aggregate data not only within a chain but across multiple blockchains all within a single project. This allows the creation of feature-rich dashboard analytics, multi-chain block scanners, or projects that index IBC transactions across zones. + +Other advantages include superior performance with multiple RPC endpoint configurations, multi-worker capabilities and a configurable caching architecture. To find out more, visit our [documentation](https://academy.subquery.network/). + +**Useful resources**: + +- SubQuery Docs: [SubQuery Academy (Documentation)](https://academy.subquery.network/) +- Intro Quick Start Guide: [1. Create a New Project](https://academy.subquery.network/quickstart/quickstart.html) +- [Axelar Starter Project](https://github.com/subquery/cosmos-subql-starter/tree/main/Axelar/axelar-starter) +- For technical questions and support reach out to us start@subquery.network + +## Running and Hosting your Axelar SubQuery APIs + +SubQuery is open-source, meaning you have the freedom to run it in the following three ways: + +- Locally on your own computer (or a cloud provider of your choosing), [view the instructions on how to run SubQuery Locally](https://academy.subquery.network/run_publish/run.html). +- You can publish it to SubQuery's enterprise-level [Managed Service](https://managedservice.subquery.network/), where we'll host your SubQuery project in production ready services for mission critical data with zero-downtime blue/green deployments. There even is a generous free tier. [Find out how](https://academy.subquery.network/run_publish/publish.html). +- You can publish it to the decentralised [SubQuery Network](https://subquery.network/network), the most open, performant, reliable, and scalable data service for dApp developers. The SubQuery Network indexes and services data to the global community in an incentivised and verifiable way and supports Axelar from launch. diff --git a/src/content/docs/dev/intro.mdx b/src/content/docs/dev/intro.mdx new file mode 100644 index 000000000..32f5ecad1 --- /dev/null +++ b/src/content/docs/dev/intro.mdx @@ -0,0 +1,60 @@ +import EVMInterchainToken from "../../../components/getting-started/interchain-tokens-evm.astro"; +import NonEVMInterchainToken from "../../../components/getting-started/interchain-tokens-non-evm.astro"; +import SendTokens from "../../../components/getting-started/send-tokens.astro"; +import GMP from "../../../components/getting-started/gmp.astro"; + +# Axelar for Developers + +Axelar enables secure token transfers and communication across different blockchains, regardless of consensus mechanisms or message payloads. It’s based on the same [proof-of-stake security model](/learn/security#proof-of-stake-consensus) as many of the chains it connects. Interchain apps built on Axelar are truly permissionless: their transactions cannot be censored by any oracle, relayer, or validator. + +To make an interchain transaction with Axelar: + +1. Call the Gateway contract method on the source chain: + - [`callContract()`](/dev/general-message-passing/gmp-messages/) to send messages without tokens. + - [`callContractWithToken()`](/dev/general-message-passing/gmp-tokens-with-messages/) to send messages along with a [gateway token](/dev/send-tokens/introduction/#gateway-tokens/). +1. Pay gas to the [`AxelarGasService`](/dev/gas-service/intro/) contract on the source chain. + +You can then use [Axelarscan](/dev/intro/#check-interchain-transactions), Axelar’s dedicated blockchain explorer, to execute, recover, or check the status of your transaction. + +## Get started + +### Interchain Tokens (EVM) + + + +### Interchain Tokens (Non-EVM) + + + +### Send tokens across chains + + + +### Pass messages between chains + + + +### Manage cross-chain gas payments + +
      +
    • [Transaction pricing](/dev/gas-service/pricing/)
    • +
    • [Estimate and pay gas](/dev/gas-service/pay-gas/)
    • +
    • [Increase gas](/dev/gas-service/increase-gas/)
    • +
    • [Refund prepaid gas](/dev/gas-service/refund/)
    • +
    + +### Check interchain transactions + +
      +
    • [Axelarscan (Mainnet)](https://axelarscan.io/)
    • +
    • + [Axelarscan (Testnet)](https://testnet.axelarscan.io/) +
    • +
    + +## Tools and resources + +- [`axelar-examples`](https://github.com/axelarnetwork/axelar-examples) – Cross-chain sample apps using Axelar that can be executed locally or deployed to testnets +- [`foundry-axelar-gmp-example`](https://github.com/axelarnetwork/foundry-axelar-gmp-example) – A sample app that integrates with [Axelar GMP](/dev/general-message-passing/overview/) using the [Foundry](https://github.com/foundry-rs/foundry) framework +- [AxelarJS SDK](/dev/axelarjs-sdk/intro/) – an [npm](https://www.npmjs.com/package/@axelar-network/axelarjs-sdk/) library with a collection of APIs and query tools +- [`axelar-local-dev`](https://github.com/axelarnetwork/axelar-local-dev) – A local cross-chain development environment where you can deploy an app to simulated EVM chains. These chains are preloaded with the [`AxelarGateway`](https://github.com/axelarnetwork/axelar-cgp-solidity/blob/main/contracts/AxelarGateway.sol), `AxelarGasReceiver`, and routed ERC-20 (axlUSDC) token contracts. Deployed apps can be tested against the RPC endpoints and contract addresses of your local development environment. diff --git a/src/pages/dev/reference/mainnet-chain-names.mdx b/src/content/docs/dev/reference/mainnet-chain-names.mdx similarity index 78% rename from src/pages/dev/reference/mainnet-chain-names.mdx rename to src/content/docs/dev/reference/mainnet-chain-names.mdx index b94493213..bd29832a7 100644 --- a/src/pages/dev/reference/mainnet-chain-names.mdx +++ b/src/content/docs/dev/reference/mainnet-chain-names.mdx @@ -1,4 +1,4 @@ -import ChainList from '../../../components/chainlist'; +import ChainList from "../../../../components/chainlist"; # Chain names: Mainnet @@ -8,6 +8,6 @@ The contract call approval at the Axelar gateway and contracts inheriting `Axela Note these names are case-sensitive. - + -{/* @TODO get rid of this page and forward to the global resources page. */} \ No newline at end of file +{/* @TODO get rid of this page and forward to the global resources page. */} diff --git a/src/content/docs/dev/reference/mainnet-contract-addresses.mdx b/src/content/docs/dev/reference/mainnet-contract-addresses.mdx new file mode 100644 index 000000000..17d467e64 --- /dev/null +++ b/src/content/docs/dev/reference/mainnet-contract-addresses.mdx @@ -0,0 +1,23 @@ +import EVMChains from "../../../../components/evm/chains"; +import EVMAssets from "../../../../components/evm/assets"; + +# Contract addresses: Mainnet + +
    + ### EVM Chains + + +`Create3 Address Deployer`: `0x6513Aedb4D1593BA12e50644401D976aebDc90d8` + +`Create2 Address Deployer`: `0x98b2920d53612483f91f12ed7754e51b4a77919e` + +`Interchain Token Service`: [`0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C`](https://etherscan.io/address/0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C) + +`Interchain Token Factory`: [`0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66`](https://etherscan.io/address/0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66) + +
    + +
    + ### Assets + +
    diff --git a/src/pages/dev/reference/testnet-chain-names.mdx b/src/content/docs/dev/reference/testnet-chain-names.mdx similarity index 80% rename from src/pages/dev/reference/testnet-chain-names.mdx rename to src/content/docs/dev/reference/testnet-chain-names.mdx index ac42d2b41..5e28b37f5 100644 --- a/src/pages/dev/reference/testnet-chain-names.mdx +++ b/src/content/docs/dev/reference/testnet-chain-names.mdx @@ -1,4 +1,4 @@ -import ChainList from '../../../components/chainlist'; +import ChainList from "../../../../components/chainlist"; # Chain names: Testnet @@ -8,6 +8,6 @@ The contract call approval at the Axelar gateway and contracts inheriting `Axela Note these names are case-sensitive. - + {/* @TODO get rid of this page and forward to the global resources page. */} diff --git a/src/pages/dev/reference/testnet-contract-addresses.mdx b/src/content/docs/dev/reference/testnet-contract-addresses.mdx similarity index 70% rename from src/pages/dev/reference/testnet-contract-addresses.mdx rename to src/content/docs/dev/reference/testnet-contract-addresses.mdx index aa2b8a8f3..bac9b0acb 100644 --- a/src/pages/dev/reference/testnet-contract-addresses.mdx +++ b/src/content/docs/dev/reference/testnet-contract-addresses.mdx @@ -1,7 +1,7 @@ -import EVMChains from "../../../components/evm/chains"; -import EVMAssets from "../../../components/evm/assets"; +import EVMChains from "../../../../components/evm/chains"; +import EVMAssets from "../../../../components/evm/assets"; -# Chain names: Testnet-1 (Lisbon) +# Chain names: Testnet (Lisbon)
    ### EVM Chains diff --git a/src/content/docs/dev/send-tokens/deprecated/deposit-address.mdx b/src/content/docs/dev/send-tokens/deprecated/deposit-address.mdx new file mode 100644 index 000000000..4a544debe --- /dev/null +++ b/src/content/docs/dev/send-tokens/deprecated/deposit-address.mdx @@ -0,0 +1,17 @@ +import { Callout } from "/src/components/callout"; + + +# Transfer assets using a deposit address (Deprecated) + + + Note: Transfering assets via `deposit addresses` are deprecated. For gateway tokens it is recommended to use `callContractWithToken()` and for other tokens it is recommended to use the `Interchain Token Service`. + + +A [deposit address](/dev/axelarjs-sdk/token-transfer-dep-addr/) is a temporary one-time address created and monitored by Axelar’s Relayer Services. Deposit addresses generally function for up to 24 hours. + +Use a deposit address if: + +- You need functionality not offered by the `sendToken()` method, such as Cosmos-to-X. +- You want to allow token transfers from wallets that do not interact with Axelar, such as when withdrawing funds from a centralized exchange. + +To transfer assets using a deposit address, install the AxelarJS SDK and initiate an `AxelarAssetTransfer`. \ No newline at end of file diff --git a/src/content/docs/dev/send-tokens/deprecated/send-tokens.mdx b/src/content/docs/dev/send-tokens/deprecated/send-tokens.mdx new file mode 100644 index 000000000..8eda75d87 --- /dev/null +++ b/src/content/docs/dev/send-tokens/deprecated/send-tokens.mdx @@ -0,0 +1,158 @@ +import { Callout } from "/src/components/callout"; + + +# Send Tokens Cross-Chain (Deprecated) + + + Note: Transfering assets via `sendToken()` is deprecated. For gateway tokens it is recommended to use `callContractWithToken()` and for other tokens it is recommended to use the `Interchain Token Service`**.** + + + +## Call `sendToken()` on an EVM source chain + +To send a token from an EVM source chain: + +### 1. Find the source chain’s Gateway contract address + +Locate the source chain’s Gateway contract address on either the [mainnet](/dev/reference/mainnet-contract-addresses/) or the [testnet](/dev/reference/testnet-contract-addresses/). + +EVM chains use Axelar Gateway smart contracts to send tokens. These are application-layer smart contracts that send and receive payloads as well as monitor transaction state. + +All Gateway contracts implement the [`IAxelarGateway`](https://github.com/axelarnetwork/axelar-cgp-solidity/blob/main/contracts/interfaces/IAxelarGateway.sol/) interface, which has a public method called `sendToken()` that transfers tokens between chains: + +```solidity +function sendToken( + string memory destinationChain, + string memory destinationAddress, + string memory symbol, + uint256 amount +) external; +``` + +### 2. Call the source chain’s `approve()` method + +Transferring tokens through a Gateway is similar to doing a typical ERC-20 token transfer. You’ll need to call the source chain’s `approve()` method (inherited from the [ERC-20 interface](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/) to allow the Gateway to transfer a specific token in a specific amount. + +```solidity +function approve(address spender, uint256 amount) external returns (bool); +``` + +`spender` is the source chain’s Gateway contract address on either the mainnet or the testnet. + +### 3. Call `sendToken()` on the source chain’s Gateway contract + +Call `sendToken()` on the source chain’s Gateway contract to transfer the tokens. For example: + +```solidity +sendToken( + "avalanche", // destination chain name + "0xF16DfB26e1FEc993E085092563ECFAEaDa7eD7fD", // some destination wallet address (should be your own) + "axlUSDC", // asset symbol, can be differ by chain, see above + 100000000 // amount (in atomic units) +) +``` + +Once you call `sendToken()`, watch for the tokens to appear at the address on the destination chain. + +## Call `sendToken()` on a Cosmos-based source chain + +For Cosmos-based source chains, `sendToken()` is a simple IBC transfer of any asset supported on the Axelar network. The message is sent to the address `axelar1dv4u5k73pzqrxlzujxg3qp8kvc3pje7jtdvu72npnt5zhq05ejcsn5qme5`, which is the designated address on the Axelar network for receiving [GMP](/dev/general-message-passing/overview/) messages, and includes a `memo` field with the following payload: + +```typescript + { + destination_chain, + destination_address, + payload: null, + type: 3, // corresponds to the `sendToken` command on Axelar + } +``` + +## Use the AxelarJS SDK to call `sendToken()` + +The AxelarJS SDK allows any frontend application to call `sendToken()` with one line of JS code. + +### EVM chain example + +```typescript +import { + AxelarAssetTransfer, + CHAINS, + Environment, + SendTokenParams, +} from "@axelar-network/axelarjs-sdk"; +import { ethers, Wallet } from "ethers"; + +const api = new AxelarAssetTransfer({ environment: Environment.TESTNET }); + +const getSigner = () => { + const privateKey = PRIVATE_KEY; + return new Wallet(privateKey); +}; + +async function test() { + const provider = new ethers.providers.JsonRpcProvider( + "https://api.avax-test.network/ext/bc/C/rpc", + ); + const signer = getSigner().connect(provider); + const requestOptions: SendTokenParams = { + fromChain: CHAINS.TESTNET.AVALANCHE, + toChain: CHAINS.TESTNET.OSMOSIS, + destinationAddress: "osmo1x3z2vepjd7fhe30epncxjrk0lehq7xdqe8ltsn", + asset: { symbol: "aUSDC" }, + amountInAtomicUnits: "5000000", + options: { + evmOptions: { + signer, + provider, + txOptions: null as any, + approveSendForMe: true, + }, + }, + }; + return api.sendToken(requestOptions); +} +``` + +### Cosmos-based chain example + +```typescript +import { + AxelarAssetTransfer, + CHAINS, + Environment, + SendTokenParams, +} from "@axelar-network/axelarjs-sdk"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const api = new AxelarAssetTransfer({ environment: Environment.TESTNET }); + +const getSigner = async () => { + const mnemonic = MNEMONIC; + return DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { prefix: "osmo" }); +}; + +async function test() { + const offlineSigner = await getSigner(); + const requestOptions: SendTokenParams = { + fromChain: CHAINS.TESTNET.OSMOSIS, + toChain: CHAINS.TESTNET.AVALANCHE, + destinationAddress: "0xB8Cd93C83A974649D76B1c19f311f639e62272BC", + asset: { + denom: + "ibc/6F34E1BD664C36CE49ACC28E60D62559A5F96C4F9A6CCE4FC5A67B2852E24CFE", + }, //aUSDC + amountInAtomicUnits: "1000000", + options: { + cosmosOptions: { + cosmosDirectSigner: offlineSigner, + rpcUrl: "https://rpc.osmotest5.osmosis.zone/", + fee: { + gas: "250000", + amount: [{ denom: "uosmo", amount: "30000" }], + }, + }, + }, + }; + return api.sendToken(requestOptions); +} +``` \ No newline at end of file diff --git a/src/content/docs/dev/send-tokens/glossary.mdx b/src/content/docs/dev/send-tokens/glossary.mdx new file mode 100644 index 000000000..c834523d9 --- /dev/null +++ b/src/content/docs/dev/send-tokens/glossary.mdx @@ -0,0 +1,52 @@ +# Interchain Token Glossary + +## Interchain Token + +An Interchain Token is an ERC-20 token that can be transferred between blockchains, preserving native token qualities. At the core, an Interchain Token is an ERC-20 contract on a public blockchain secured by a dynamic validator set. If this contract implements the [`IInterchainToken`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interfaces/IInterchainToken.sol) interface, it will have knowledge of its own [Token Manager](/dev/send-tokens/glossary#token-manager) and will contain all of the Token Manager’s transfer methods. If it does not implement this interface, token transfers must be done through explicit function calls on the Token Manager. + +## Interchain Token Service + +The Interchain Token Service is a [smart contract](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol) deployed by Axelar that manages the creation and management of Interchain Tokens and Token Managers. Its address on both mainnet and testnet is [`0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C`](https://etherscan.io/address/0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C) ([testnet deployment](https://sepolia.etherscan.io/address/0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C)). + +## Canonical Interchain Token + +A canonical Interchain Token is a token originally deployed on one chain that now has interchain capabilities through ITS. The Interchain Token Service wraps the token on the original chain to give it these capabilities, then duplicates the wrapped original on all other chains. This standardization ensures consistent behavior and enables interoperability between blockchains, allowing cross-chain transactions and interactions within blockchain networks that support various chains. + +Every ERC-20 token can only have one canonical chain. It will be deployed to all other chains as a [standardized token](/dev/send-tokens/glossary#standardized-token). + +## Custom Token + +A custom token is an ERC-20 token that is designed to serve specific use cases within the blockchain ecosystem. Unlike [standardized tokens](/dev/send-tokens/glossary#standardized-token), custom tokens are highly customizable, allowing their creators to define unique features, functionalities, and rules. For example, a standardized token will have the same name and symbol on all chains, but a custom token can have a different name and symbol on each chain. Custom tokens can optionally implement the [`IInterchainToken`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interfaces/IInterchainToken.sol) interface for transfer methods directly on the ERC-20 contract. + +## Standardized Token + +In the context of Axelar’s Interchain Token Service, a standardized token is a ERC-20 contract that implements the [`IInterchainToken`](https://github.com/axelarnetwork/interchain-token-service/blob/8d66c0b4d42fa7c3918ee9e2ccb9d80b7a4e3b1b/contracts/interfaces/IInterchainToken.sol) and [`IStandardizedToken`](https://github.com/axelarnetwork/interchain-token-service/blob/8d66c0b4d42fa7c3918ee9e2ccb9d80b7a4e3b1b/contracts/interfaces/IStandardizedToken.sol) interfaces and can be deployed by the Interchain Token Service. + +## Token ID + +A token ID is a token’s unique identifier within a blockchain network. It remains the same across all the chains that the token is deployed to. + +## Token Manager + +A [`TokenManager`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/token-manager/TokenManager.sol) is a contract that is responsible for managing interchain tokens. There are two types of token managers: + +- [Lock/Unlock](/dev/send-tokens/glossary#lockunlock) — can lock and release token supply +- [Mint/Burn](/dev/send-tokens/glossary#mintburn) — can mint or burn tokens + +Token Managers must be designated either Lock/Unlock or Mint/Burn. + +## Lock/Unlock + +To lock or unlock a smart contract means to temporarily restrict or restore the transfer of tokens or assets within the contract. Locking can be used in smart contracts to enforce specific conditions or trigger events only when certain criteria are met. + +## Mint/Burn + +Minting refers to the creation of new tokens, typically increasing the total supply. Burning involves permanently removing tokens from circulation, reducing the total supply. In the Interchain Token Service, the contract’s Token Manager will mint new tokens on its chain when there are incoming token transfers, and burn the received tokens when there are outgoing token transfers. + +## Distributor Role + +The distributor is a permission role for custom tokens within the Axelar ecosystem. Tokens with distributor permissions can mint and burn tokens. This role is essential for managing the token supply and ensuring its proper functioning. + +## Operator + +In Interchain Token Service, the Operator is a role for a Token Manager that can set the `flowLimit` to control the influx and outflux of tokens on an ERC-20 contract. diff --git a/src/content/docs/dev/send-tokens/interchain-tokens/create-new-interchain-token.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/create-new-interchain-token.mdx new file mode 100644 index 000000000..e16044a84 --- /dev/null +++ b/src/content/docs/dev/send-tokens/interchain-tokens/create-new-interchain-token.mdx @@ -0,0 +1,55 @@ +import { Callout } from "/src/components/callout"; + +# Create New Token + +Interchain Tokens are tokens deployed via the [Interchain Token Service (ITS)](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol). These tokens are relatively simple ERC-20 contracts with built-in ITS integration, making them bridgeable to other blockchains as soon as they are deployed. + +If you are starting fresh and want to deploy a brand new token that will have bridging capabilities from day one, ITS offers the ability to deploy a token directly through the [Interchain Token Factory](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenFactory.sol). + +## Deploy an Interchain Token + +Use the `deployInterchainToken` function to deploy a new interchain token on your preferred chain. + +```solidity +function deployInterchainToken( + bytes32 salt, // unique salt for token deployment + string calldata name, // token name + string calldata symbol, // token symbol + uint8 decimals, // token decimals + uint256 initialSupply, // initial token supply + address minter // address receiving the initially minted tokens +) external payable returns (bytes32 tokenId) {}; +``` + +This function [deploys an interchain token](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenFactory.sol#L133), connects it to ITS upon deployment, and returns the unique token ID. + +## Deploy a Remote Interchain Token + +Use the [`deployRemoteInterchainToken`](https://github.com/axelarnetwork/interchain-token-service/blob/94677f1072da127a0ee7ff5ab6784dcfe11789e8/contracts/InterchainTokenFactory.sol#L249) function to deploy the token on a remote chain as a cross-chain transaction. +Using this function, there is no minter role assigned if you need to deploy a token on a remote chain with a minter, use the [`deployRemoteInterchainTokenWithMinter`](https://github.com/axelarnetwork/interchain-token-service/blob/94677f1072da127a0ee7ff5ab6784dcfe11789e8/contracts/InterchainTokenFactory.sol#L269) function. + +```solidity +function deployRemoteInterchainToken( + bytes32 salt, // your unique salt value + string calldata destinationChain, // destination chain name + uint256 gasValue // gas sent for token deployment +) external payable returns (bytes32 tokenId) {}; +``` + +This function deploys a remote interchain token on a specified destination chain and returns a token ID. + + + **NOTE:** The security of your token is only as strong as the security of the + chains with which it integrates. When deploying an interchain token, ensure + that all target chains are trustworthy. + + +## What's Next + +You can initiate an interchain transfer from your source chain to a destination chain by using the [`interchainTransfer`](/dev/send-tokens/interchain-tokens/interchain-transfer/) method on the [ITS contract](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol). + +For further examples utilizing the Interchain Token Service, check out the [`axelar-examples`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm) repository on GitHub. There you will find an example implementation titled [`its-interchain-token`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-interchain-token), which demonstrates how to deploy Interchain Tokens across EVM chains and how to transfer tokens between them. + +## Tutorial + +For a step-by-step guide on deploying an Interchain Token, check out the [Programmatically Create a New Token Using the Interchain Token Service](/dev/send-tokens/interchain-tokens/developer-guides/programmatically-create-a-token/) tutorial. diff --git a/src/content/docs/dev/send-tokens/interchain-tokens/developer-guides/link-custom-tokens-deployed-across-multiple-chains-into-interchain-tokens.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/developer-guides/link-custom-tokens-deployed-across-multiple-chains-into-interchain-tokens.mdx new file mode 100644 index 000000000..ba757bbcd --- /dev/null +++ b/src/content/docs/dev/send-tokens/interchain-tokens/developer-guides/link-custom-tokens-deployed-across-multiple-chains-into-interchain-tokens.mdx @@ -0,0 +1,818 @@ +# Link Custom Tokens Deployed Across Multiple Chains + +import { Callout } from "/src/components/callout"; + +Custom ERC-20 tokens deployed on multiple chains with specific minting policies, ownership structures, rate limits, and other bespoke functionalities can be turned into Interchain Tokens through the [Interchain Token Service](/dev/send-tokens/interchain-tokens/intro/). + +In this tutorial, you will: + +- Link custom tokens deployed across multiple chains into Interchain Tokens +- Deploy a simple ERC-20 token on the BSC chain +- Deploy a simple ERC-20 token on the Avalanche Fuji chain +- Register token metadata with the ITS Contract on both BSC and Avalanche Fuji chain +- Register the custom token with the [Interchain Token Factory](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenFactory.sol) on BSC and Avalanche Fuji chain +- Link custom token with the [Interchain Token Factory](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenFactory.sol) from BSC to Avalanche Fuji chain +- Assign the minter role to your token's Token Manager on BSC and Avalanche Fuji chain + +## Prerequisites + +You will need: + +- A basic understanding of [Solidity](https://www.tutorialspoint.com/solidity/index.htm) and [JavaScript](https://www.w3schools.com/js/) +- A [MetaMask wallet](https://metamask.io/) with tBNB and Avax funds for testing. If you don't have these funds, you can get tBNB from the [BSC faucet](https://www.bnbchain.org/en/testnet-faucet) and Avax from the Avalanche Fuji faucets ([1](https://faucets.chain.link/fuji), [2](https://core.app/tools/testnet-faucet/)). + +## Deploy an ERC-20 token on the BSC and Avalanche Fuji testnets + +Deploy the following `SimpleCustomToken` on the BSC and Avalanche Fuji testnets. + +This code utilizes OpenZeppelin's libraries to create a custom ERC-20 token with functionalities for minting, burning, and access control. The token includes a minter role, which enables designated addresses to mint or burn tokens. Additionally, it incorporates ERC20Permit for gasless transactions. The contract starts with a predefined supply of tokens minted to the deployer's address and establishes roles for a default administrator and minter: + +```solidity + +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +// Import OpenZeppelin contracts for ERC-20 standard token implementations, +// burnable tokens, access control mechanisms, and permit functionality +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; + +contract SimpleCustomToken is ERC20, ERC20Burnable, AccessControl, ERC20Permit { + +// Define a constant for the minter role using keccak256 to generate a unique hash + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + + constructor(address defaultAdmin, address minter) + ERC20("SimpleCustomToken", "SCT") // Set token name and symbol + ERC20Permit("SimpleCustomToken") // Initialize ERC20Permit with the token name + { + // Mint an initial supply of tokens to the message sender + _mint(msg.sender, 10000 * 10 ** decimals()); + + + // Grant the DEFAULT_ADMIN_ROLE to the specified defaultAdmin address + _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin); + + + // Grant the MINTER_ROLE to the specified minter address + // Addresses with the minter role are allowed to mint new tokens + _grantRole(MINTER_ROLE, minter); + } + + // Mint new tokens. Only addresses with the MINTER_ROLE can call this function + function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) { + _mint(to, amount); + } + + // Burn tokens from a specified account + function burn(address account, uint256 amount) public onlyRole(MINTER_ROLE) { + _burn(account, amount); + } +} +``` + +Check out this [Hardhat guide](https://hardhat.org/tutorial) to learn how to deploy your ERC-20 token using Hardhat step by step. + +## Set up your development environment + +### Create and initialize a project + +Open up your terminal and navigate to any directory of your choice. Run the following commands to create and initiate a project: + +```bash +mkdir custom-interchain-token-project && cd custom-interchain-token-project +npm init -y +``` + +# Install Hardhat and the AxelarJS SDK + +Install Hardhat and the AxelarJS SDK with the following commands: + +```bash +npm install --save-dev hardhat@2.18.1 dotenv@16.3.1 +npm install @axelar-network/axelarjs-sdk@0.13.9 crypto@1.0.1 @nomicfoundation/hardhat-toolbox@2.0.2 +``` + +### Set up project ABIs + +Next, set up the ABIs for the [Interchain Token Service](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol) and the contract from the token you deployed. + +Create a folder named `utils`. Inside the folder, create the following new files and add the respective ABIs: + +- Add the [Interchain Token Service ABI](https://gist.github.com/Olanetsoft/2a632784e6753d34ca7ffc4f73bf58ed) to `interchainTokenServiceABI.json`. +- Add the [Interchain Token Factory ABI](https://gist.github.com/Olanetsoft/7d24e936f4cf6bd3d10d7b4f9a18d838) to `interchainTokenFactoryABI.json`. +- Add your custom token ABI to `customTokenABI.json`. You can get this from [BSC Scan](https://testnet.bscscan.com/) or [Avalanche Fuji Scan](https://testnet.snowtrace.io/) with the address of your deployed token if your contract is verified. Otherwise, you can get it from the same service on which you deployed the `SimpleCustomToken`. + +## Set up an RPC for the local chain + +Set up an RPC for the BSC and Avalanche Fuji testnet in the root directory. + +### Create an `.env` file + +To make sure you're not accidentally publishing your private key, create an [.env file](https://blog.bitsrc.io/a-gentle-introduction-to-env-files-9ad424cc5ff4) to store it in: + +```bash +touch .env +``` + +### Add your private key to `.env` and `hardhat.config.js.` + +[Export your private key](https://support.metamask.io/managing-my-wallet/secret-recovery-phrase-and-private-keys/how-to-export-an-accounts-private-key/) and add it to the  `.env` file you just created: + +```bash +PRIVATE_KEY= // Add your account private key here +``` + + + If you will push this project on GitHub, create a `.gitignore` file and + include `.env`. + + +Then, create a file with the name `hardhat.config.js` and add the following code snippet: + +```javascript +require("@nomicfoundation/hardhat-toolbox"); +require("dotenv").config({ path: ".env" }); + +const PRIVATE_KEY = process.env.PRIVATE_KEY; + +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: "0.8.18", + networks: { + bsc: { + url: "https://bsc-testnet.drpc.org/", + chainId: 97, + accounts: [PRIVATE_KEY], + }, + avalanche: { + url: "https://avalanche-fuji-c-chain-rpc.publicnode.com/", + chainId: 43113, + accounts: [PRIVATE_KEY], + }, + }, +}; +``` + +## Register token metadata with the ITS Contract on both BSC and Avalanche Fuji chain + +Now that you have set up an RPC for the BSC and Avalanche Fuji testnet, you can register token metadata with the ITS Contract on both chains. +The token metadata registers the metadata for a token on the ITS Hub. This metadata is used to scale linked tokens. + +### Create a `customInterchainToken.js` script + +Create a new file named `customInterchainToken.js` and import the required dependencies: + +- `Ethers.js` +- The [AxelarJS SDK](https://github.com/axelarnetwork/axelarjs-sdk) +- The custom token contract ABI +- The address of the [`InterchainTokenService`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol) contract +- The address of your token deployed on BSC and Avalanche Fuji testnet + +```javascript +const hre = require("hardhat"); +const crypto = require("crypto"); +const ethers = hre.ethers; + +const interchainTokenServiceContractABI = require("./utils/interchainTokenServiceABI"); +const interchainTokenFactoryContractABI = require("./utils/interchainTokenFactoryABI"); +const customTokenABI = require("./utils/customTokenABI"); + +const MINT_BURN = 4; + +const interchainTokenServiceContractAddress = + "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C"; +const interchainTokenFactoryContractAddress = + "0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66"; + +const bscCustomTokenAddress = "0x0b769061149B1267e1979C4EA0b57b178dB9a53D"; // Replace with your token address on BSC +const avalancheCustomTokenAddress = + "0xA41E40930CBCDB9fcC63A6307199b0EABC33b4A5"; // Replace with your token address on Avalanche Fuji +``` + +### Get the signer + +Next, create a `getSigner()` function in `customInterchainToken.js`. This will obtain a signer for a secure transaction: + +```javascript +//... + +async function getSigner() { + const [signer] = await ethers.getSigners(); + return signer; +} +``` + +### Get the contract instance + +Then, create a `getContractInstance()` function in `customInterchainToken.js`. This will get the contract instance based on the contract's address, ABI, and signer: + +```javascript +//... + +async function getContractInstance(contractAddress, contractABI, signer) { + return new ethers.Contract(contractAddress, contractABI, signer); +} +``` + +### Register token metadata with the ITS Contract on BSC + +Create a `registerTokenMetadataOnBSC` function for the BSC testnet. This will register the token metadata on BSC. + +```javascript +//... + +// register token metadata : bsc +async function registerTokenMetadataOnBSC() { + // Get a signer to sign the transaction + const signer = await getSigner(); + + // Get the InterchainTokenService contract instance + const interchainTokenServiceContract = await getContractInstance( + interchainTokenServiceContractAddress, + interchainTokenServiceContractABI, + signer, + ); + + // Register token metadata + const deployTxData = + await interchainTokenServiceContract.registerTokenMetadata( + bscCustomTokenAddress, + ethers.utils.parseEther("0.0001"), // gas value + { value: ethers.utils.parseEther("0.001") }, + ); + + console.log(`Transaction Hash: ${deployTxData.hash},`); +} + +//... +``` + +### Register token metadata with the ITS Contract on Avalanche Fuji + +Create a `registerTokenMetadataOnAvalanche` function for the Avalanche Fuji testnet. This will register the token metadata on Avalanche Fuji. + +```javascript +// register token metadata : avalanche +async function registerTokenMetadataOnAvalanche() { + // Get a signer to sign the transaction + const signer = await getSigner(); + + // Get the InterchainTokenService contract instance + const interchainTokenServiceContract = await getContractInstance( + interchainTokenServiceContractAddress, + interchainTokenServiceContractABI, + signer, + ); + + // Register token metadata + const deployTxData = + await interchainTokenServiceContract.registerTokenMetadata( + avalancheCustomTokenAddress, + ethers.utils.parseEther("0.0001"), // gas value + { value: ethers.utils.parseEther("0.001") }, + ); + + console.log(`Transaction Hash: ${deployTxData.hash},`); +} +``` + +### Add a `main()` function + +Add a `main()` function to execute the `customInterchainToken.js` script and handle any errors that may arise: + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + case "registerTokenMetadataOnBSC": + await registerTokenMetadataOnBSC(); + break; + case "registerTokenMetadataOnAvalanche": + await registerTokenMetadataOnAvalanche(); + break; + default: + console.error(`Unknown function: ${functionName}`); + process.exitCode = 1; + return; + } +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); +``` + +### Run the `customInterchainToken.js` script to deploy to BSC + +Run the script in your terminal to register and deploy the token, specifying the `bsc` testnet: + +```bash +FUNCTION_NAME=registerTokenMetadataOnBSC npx hardhat run customInterchainToken.js --network bsc +``` + +If you see something similar to the following on your console, you have successfully registered your token metadata on BSC + +```bash +Transaction Hash: 0xf860bd8802d046fb0c752c355bc73c87e69f701348420c6cbdf82534b87c4822, + +``` + +### Run the `customInterchainToken.js` script to deploy to Avalanch Fuji + +Run the script in your terminal to register and deploy the token, specifying the `avalanche` testnet: + +```bash +FUNCTION_NAME=registerTokenMetadataOnAvalanche npx hardhat run customInterchainToken.js --network avalanche +``` + +If you see something similar to the following on your console, you have successfully registered your token metadata on Avalanche Fuji. + +```bash +Transaction Hash: 0x026ee7992de2108ecb83f37119ec84ebed371ff724d38e8fd055cbecde5b77e6, + +``` + +### Check the transaction on the BSC testnet scanner + +Check the [BSC testnet scanner](https://testnet.bscscan.com/) to see if you have successfully [registered your token metadata](https://testnet.bscscan.com/tx/0xf860bd8802d046fb0c752c355bc73c87e69f701348420c6cbdf82534b87c4822). + +### Check the transaction on the Avalanche Fuji testnet scanner + +Check the [Avalanche Fuji testnet scanner](https://testnet.snowtrace.io/) to see if you have successfully [registered your token metadata](https://testnet.snowtrace.io/tx/0xe3bb64c76637fcd4d9ce9a5bab013fcda95e7040292531230be70daa4f5bd9a1). + +## Register the custom token with the Interchain Token Factory + +You've registered your token metadata on BSC and Avalanche Fuji. Now, register the custom token with the Interchain Token Factory on the BSC. + +To do that, use the following code snippet: create a function with the name `registerCustomTokenOnBSC`. This function registers an existing ERC20 token under a `tokenId` computed from the provided `salt`. + +```javascript +async function registerCustomTokenOnBSC() { + // Generate random salt + const salt = "0x" + crypto.randomBytes(32).toString("hex"); + + // Get a signer to sign the transaction + const signer = await getSigner(); + + // Get the interchainTokenFactory contract instance + const interchainTokenFactoryContract = await getContractInstance( + interchainTokenFactoryContractAddress, + interchainTokenFactoryContractABI, + signer, + ); + + // Register token metadata + const deployTxData = await interchainTokenFactoryContract.registerCustomToken( + salt, // salt + bscCustomTokenAddress, // token address + MINT_BURN, // token management type + "0x510e5EA32386B7C48C4DEEAC80e86859b5e2416C", // the address of the operator + { value: ethers.utils.parseEther("0.001") }, + ); + + console.log(` + Transaction Hash: ${deployTxData.hash}, + salt: ${salt}`); +} + +//... +``` + +### Update `main()` to register custom token + +Update `main()` to execute `registerCustomTokenOnBSC()` : + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + //... + case "registerCustomTokenOnBSC": + await registerCustomTokenOnBSC(); + break; + default: + //... + } +} + +//... +``` + +### Run the `customInterchainToken.js` script to deploy to BSC + +Run the script in your terminal to register the custom token, once again specifying the `BSC` testnet (the source chain where all transactions are taking place): + +```javascript +FUNCTION_NAME=registerCustomTokenOnBSC npx hardhat run customInterchainToken.js --network bsc +``` + +You should see something similar to the following on your console: + +```bash +Transaction Hash: 0xf0c3fbbece17cc12d9de76182540afb4f5c6c47aeca65c40f9d58f71e362dffe, +salt: 0xd58c9142d863dde9f0b9ea68b10cce9470626040187a00c16b7b3d4edae70cf9 + +``` + +## Link custom token with the Interchain Token Factory from BSC to Avalanche Fuji chain + +In this section, you must link the custom token using the Interchain Token Factory between the chains where your token exists. + +The key difference between `registerCustomToken` and `linkToken` lies in their purpose and scope. `registerCustomToken` is used exclusively by the Interchain Token Factory to register custom tokens on the current chain, enabling them to be linked later. It deploys a token manager for the token but does not facilitate cross-chain linking. On the other hand, `linkToken` is a more general function that links a token to a destination chain by deploying a token manager on the target chain. It allows users to connect tokens across chains, enabling interchain transfers. While `registerCustomToken` is limited to local registration, `linkToken` extends functionality to cross-chain interoperability. + +To do that, create a function named `linkCustomToken` with the following code snippet. + +```javascript +async function linkCustomToken() { + // Get a signer to sign the transaction + const signer = await getSigner(); + + // Get the interchainTokenFactory contract instance + const interchainTokenFactoryContract = await getContractInstance( + interchainTokenFactoryContractAddress, + interchainTokenFactoryContractABI, + signer, + ); + + // Register token metadata + const deployTxData = await interchainTokenFactoryContract.linkToken( + "0xd58c9142d863dde9f0b9ea68b10cce9470626040187a00c16b7b3d4edae70cf9", // salt, same as previously used + "Avalanche", // destination chain + avalancheCustomTokenAddress, // destination token address + MINT_BURN, // token manager type + "0x510e5EA32386B7C48C4DEEAC80e86859b5e2416C", // the address of the operator - linkParams + ethers.utils.parseEther("0.001"), // gas value + { value: ethers.utils.parseEther("0.001") }, + ); + + console.log(`Transaction Hash: ${deployTxData.hash}`); +} + +//... +``` + +### Update `main()` to link custom token + +Update `main()` to execute `linkCustomToken()` : + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + //... + case "linkCustomToken": + await linkCustomToken(); + break; + default: + //... + } +} + +//... +``` + +### Run the `customInterchainToken.js` script to deploy to BSC + +Run the script in your terminal to register the custom token, once again specifying the `BSC` testnet (the source chain where all transactions are taking place): + +```javascript +FUNCTION_NAME=linkCustomToken npx hardhat run customInterchainToken.js --network bsc +``` + +You should see something similar to the following on your console: + +```bash +Transaction Hash: 0x11c2a212180d7ea2babe7aceb66c32c1e235cc159bceeb4dd6d04411f4a9669f + +``` + +### Check the transaction on the Axelar testnet scanner + +Check the [Axelarscan testnet scanner](https://testnet.axelarscan.io/) to see if you have successfully registered the custom token on the Avalanche Fuji testnet. It should look something like [this](https://testnet.axelarscan.io/gmp/0x11c2a212180d7ea2babe7aceb66c32c1e235cc159bceeb4dd6d04411f4a9669f). + +Add gas if needed. Ensure that Axelar shows a successful transaction before continuing to the next step. + +## Assign the minter role to your token's Token Manager on BSC and Avalanche Fuji chain + +You must transfer mint access to the Token Manager address on both chains before you can mint and burn tokens while moving assets between chains. + +### Transfer mint access to the Token Manager address on the BSC testnet + +Create a `transferMintAccessToTokenManagerOnBSC()` function that will perform the mint access transfer on the BSC testnet. The token manager is a contract needed for moving your asset from one chain to the other. You need to first retrieve the token manager address using the token ID. So, let's start with that. To do that, use the following code snippet. + +```javascript +async function getTokenManagerAddress() { + // Get a signer to sign the transaction + const signer = await getSigner(); + + // Get the InterchainTokenService contract instance + const interchainTokenServiceContract = await getContractInstance( + interchainTokenServiceContractAddress, + interchainTokenServiceContractABI, + signer, + ); + + // Get the interchainTokenFactory contract instance + const interchainTokenFactoryContract = await getContractInstance( + interchainTokenFactoryContractAddress, + interchainTokenFactoryContractABI, + signer, + ); + + // Retrieve linked token id + const tokenId = await interchainTokenFactoryContract.linkedTokenId( + "0x510e5EA32386B7C48C4DEEAC80e86859b5e2416C", // sender + "0xd58c9142d863dde9f0b9ea68b10cce9470626040187a00c16b7b3d4edae70cf9", // salt, same as previously used + ); + + const tokenManagerAddress = + await interchainTokenServiceContract.tokenManagerAddress(tokenId); + + console.log(` + Token Manager Address: ${tokenManagerAddress}, + Token ID: ${tokenId}`); +} +``` + +### Update `main()` to retrieve the token manager address + +Update `main()` to execute `getTokenManagerAddress()` : + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + //... + case "getTokenManagerAddress": + await getTokenManagerAddress(); + break; + default: + //... + } +} + +//... +``` + +### Run the `customInterchainToken.js` script to retrieve the token manager address + +Run the script in your terminal to retrieve the token manager address. + +```javascript +FUNCTION_NAME=getTokenManagerAddress npx hardhat run customInterchainToken.js --network bsc +``` + +You should see something similar to the following on your console: + +```bash +Token Manager Address: 0x1Ca3eAcB1e8C72869d8962f425631A24e19e8a80, +Token ID: 0xe0898500c75902b24ca99e2bcb77317acfdf01e66b1cacfd1daf75c66ecd8dfb + +``` + +Next, save your token ID details(you will need them later in this tutorial) and use the token manager address as a parameter to transfer Mint access on both chains. Start with BSC using the folllowing code snippet: + +```javascript +//... + +// Transfer mint access on all chains to the Expected Token Manager : BSC +async function transferMintAccessToTokenManagerOnBSC() { + // Get a signer to sign the transaction + const signer = await getSigner(); + + const tokenContract = await getContractInstance( + bscCustomTokenAddress, + customTokenABI, + signer, + ); + + // Get the minter role + const getMinterRole = await tokenContract.MINTER_ROLE(); + + const grantRoleTxn = await tokenContract.grantRole( + getMinterRole, + "0x1Ca3eAcB1e8C72869d8962f425631A24e19e8a80", // your token manager address + ); + + console.log("grantRoleTxn: ", grantRoleTxn.hash); +} +``` + +### Update `main()` to transfer mint access on the BSC testnet + +Update `main()` to execute `transferMintAccessToTokenManagerOnBSC()` : + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + //... + case "transferMintAccessToTokenManagerOnBSC": + await transferMintAccessToTokenManagerOnBSC(); + break; + default: + //... + } +} + +//... +``` + +### Run the `customInterchainToken.js` script to deploy to the BSC testnet + +Run the script in your terminal to transfer mint access to the Token Manager specifying the `BSC` testnet: + +```bash +FUNCTION_NAME=transferMintAccessToTokenManagerOnBSC npx hardhat run customInterchainToken.js --network bsc +``` + +You should see something similar to the following on your console: + +```bash +grantRoleTxn: 0x82f2fdc151e865d08f776485076cb1e5ba8ffb865f5c4f7e6fedbbe046d5e4e3 + +``` + +Next, grant mint access to the Avalanche Fuji testnet using the following code snippet: + +```javascript +//... + +// Transfer mint access on all chains to the Expected Token Manager : Avalanche +async function transferMintAccessToTokenManagerOnAvalanche() { + // Get a signer to sign the transaction + const signer = await getSigner(); + + const tokenContract = await getContractInstance( + bscCustomTokenAddress, + customTokenABI, + signer, + ); + + // Get the minter role + const getMinterRole = await tokenContract.MINTER_ROLE(); + + const grantRoleTxn = await tokenContract.grantRole( + getMinterRole, + "0x1Ca3eAcB1e8C72869d8962f425631A24e19e8a80", // your token manager address + ); + + console.log("grantRoleTxn: ", grantRoleTxn.hash); +} +``` + +### Update `main()` to transfer mint access on the Avalanche Fuji testnet + +Update `main()` to execute `transferMintAccessToTokenManagerOnAvalanche()` : + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + //... + case "transferMintAccessToTokenManagerOnAvalanche": + await transferMintAccessToTokenManagerOnAvalanche(); + break; + default: + //... + } +} + +//... +``` + +### Run the `customInterchainToken.js` script to deploy to Avalanche Fuji testnet + +Run the script in your terminal to transfer mint access to the Token Manager specifying the `Avalanche Fuji` testnet: + +```bash +FUNCTION_NAME=transferMintAccessToTokenManagerOnAvalanche npx hardhat run customInterchainToken.js --network avalanche +``` + +You should see something similar to the following on your console: + +```bash +grantRoleTxn: 0xdff5ef006caf387b2f86db5ad09837b72107ba9f95561ee47560a05ce55f2cad + +``` + +## Transfer your token between chains + +Now that you have deployed a granted mint access to the token manager on both BSC and Avalanche testnet, you can transfer your token between those two chains using the [interchainTransfer()](/dev/send-tokens/interchain-tokens/interchain-transfer/) method. + +### Initiate a remote token transfer + +In `customInterchainToken.js`, create a `transferTokens()` function to facilitate remote token transfers between chains. Change the token ID to the `tokenId` that you saved from an earlier step, and change the receiver address to your wallet address: + +```javascript +//... + +// Transfer tokens : BSC -> Avalanche Fuji +async function transferTokens() { + // Get a signer to sign the transaction + const signer = await getSigner(); + + const interchainTokenServiceContract = await getContractInstance( + interchainTokenServiceContractAddress, + interchainTokenServiceContractABI, + signer, + ); + + const transfer = await interchainTokenServiceContract.interchainTransfer( + "0xe0898500c75902b24ca99e2bcb77317acfdf01e66b1cacfd1daf75c66ecd8dfb", // tokenId, the one you store in the earlier step + "Avalanche", // destination chain + "0x510e5EA32386B7C48C4DEEAC80e86859b5e2416C", // receiver address + ethers.utils.parseEther("5"), // amount of token to transfer + "0x", + ethers.utils.parseEther("0.001"), // gasValue + { + // Transaction options should be passed here as an object + value: ethers.utils.parseEther("0.001"), + }, + ); + + console.log("Transfer Transaction Hash:", transfer.hash); +} +``` + +### Update `main()` to execute token transfer + +Update the `main()` to execute `transferTokens()`: + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + //... + case "transferTokens": + await transferTokens(); + break; + default: + //... + } +} + +//... +``` + +### Run the `customInterchainToken.js` script to transfer tokens + +Run the script in your terminal, specifying the `BSC` testnet: + +```bash +FUNCTION_NAME=transferTokens npx hardhat run customInterchainToken.js --network bsc +``` + +You should see something similar to the following on your console: + +```bash +Transfer Transaction Hash: 0xbb7d242ead9fda8ce8d20654fb1c404c611c04bbb198fe15668a17272862e95b + +``` + +If you see this, your interchain transfer has been successful! 🎉 + +### Check the transaction on the Axelar testnet scanner + +Check the [Axelarscan testnet scanner](https://testnet.axelarscan.io/) to see if you have successfully transferred SCT from the [BSC testnet](https://testnet.ftmscan.com/token/0x8D4a6B2A784749BBc412A41C1440C5A67EAB57EE) to the Avalanche Fuji testnet. It should look something like [this](https://testnet.axelarscan.io/gmp/0xbb7d242ead9fda8ce8d20654fb1c404c611c04bbb198fe15668a17272862e95b). + +## Congratulations! + +You have now programmatically linked custom tokens deployed on multiple chains as Interchain Tokens, using Axelar's Interchain Token Service to transfer them between chains. + +Great job making it this far! To show your support for the author of this tutorial, please post about your experience and tag [@axelarnetwork](https://x.com/axelar) on Twitter (X). + +## What's next + +For further examples utilizing the Interchain Token Service, check out the following in the [`axelar-examples`](https://github.com/axelarnetwork/axelar-examples/tree/main) repo on GitHub: + +- [`its-custom-token`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-custom-token) — Demonstrates how to use the ITS with a custom token implementation. +- [`its-interchain-token`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-interchain-token) — Demonstrates how to deploy Interchain Tokens that are connected across EVM chains and how to send some tokens across. +- [`its-canonical-token`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-canonical-token) - Demonstrates how to deploy canonical Interchain Token and send cross-chain transfer for these tokens. +- [`its-lock-unlock-fee`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-lock-unlock-fee) Demonstrates how to deploy deploy interchain token with lock/unlock_fee token manager type. +- [`its-executable`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-executable) Demonstrates how to deploy interchain token and send a cross-chain transfer along with a message. +- [`its-mint-burn-from`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-mint-burn-from) Demonstrates how to deploy interchain token with uses `burnFrom()` on token being bridged rather than `burn()`. + +## References + +- [Interchain Token Service Documentation](/dev/send-tokens/interchain-tokens/intro/) +- [Interchain Tokens GitHub Repository](https://github.com/axelarnetwork/interchain-token-service/tree/main) +- [AxelarJS SDK](https://github.com/axelarnetwork/axelarjs-sdk) diff --git a/src/content/docs/dev/send-tokens/interchain-tokens/developer-guides/programmatically-create-a-canonical-token.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/developer-guides/programmatically-create-a-canonical-token.mdx new file mode 100644 index 000000000..6021f069e --- /dev/null +++ b/src/content/docs/dev/send-tokens/interchain-tokens/developer-guides/programmatically-create-a-canonical-token.mdx @@ -0,0 +1,497 @@ +import { Callout } from "/src/components/callout"; + +# Programmatically Create a Canonical Interchain Token Using the Interchain Token Service + +If you have an [ERC-20](https://docs.openzeppelin.com/contracts/4.x/erc20) token on one or more blockchains and you want to make the token interoperable across chains, the [Interchain Token Service](/dev/send-tokens/interchain-tokens/intro/) provides a solution. You can transform an ERC-20 token into an Interchain Token by deploying a [token manager](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/token-manager/TokenManager.sol). + +If you would like to create a wrapped, bridgeable version of your ERC-20 token on other chains, you can register it as a [Canonical Interchain Token](/dev/send-tokens/interchain-tokens/register-existing-token/) using the [`InterchainTokenFactory`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenFactory.sol) [contract](https://etherscan.io/address/0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66). + +**Each token can only be registered once as a Canonical Interchain Token.** This ensures unique and streamlined token management across different blockchains. Though you can register your Canonical Interchain Token directly through the [Interchain Token Portal](https://testnet.interchain.axelar.dev/), there are times where you may want to do so programmatically, such as when you have already deployed a token on one chain and wish to deploy a wrapped version of that token on another chain. + +In this tutorial, you will learn how to: + +- Programmatically create a Canonical Interchain Token from scratch using Axelar's Interchain Token Service +- Register a Canonical Interchain Token on the BSC chain +- Deploy remote Canonical Interchain Token on the Avalanche Fuji chain +- Transfer your token between BSC and Avalanche Fuji + +## Prerequisites + +You will need: + +- A basic understanding of [Solidity](https://www.tutorialspoint.com/solidity/index.htm) and [JavaScript](https://www.w3schools.com/js/) +- - A [MetaMask wallet](https://metamask.io/) with tBNB and Avax funds for testing. If you don’t have these funds, you can get tBNB from the [BSC faucet](https://www.bnbchain.org/en/testnet-faucet) and Avax from the Avalanche Fuji faucets ([1](https://faucets.chain.link/fuji), [2](https://core.app/tools/testnet-faucet/)). + +## Deploy an ERC-20 token on the BSC testnet + +[Create a Simple ERC-20 token](https://bakemytoken.com/binance) and give it a name and symbol. You can skip this step if you already have an ERC-20 token deployed on the BSC testnet. + +## **Set up your development environment** + +### Create and initialize a project + +Open up your terminal and navigate to any directory of your choice. Run the following commands to create and initiate a project: + +```bash +mkdir canonical-interchain-token-project && cd canonical-interchain-token-project +npm init -y +``` + +### Install Hardhat and the AxelarJS SDK + +Install Hardhat and the AxelarJS SDK with the following commands: + +```bash +npm install --save-dev hardhat@2.18.1 dotenv@16.3.1 +npm install @axelar-network/axelarjs-sdk@0.13.9 crypto@1.0.1 @nomicfoundation/hardhat-toolbox@2.0.2 +``` + +### Set up project ABIs + +Next, set up the ABIs for the [Interchain Token Service](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol), [Interchain Token Factory](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenFactory.sol), and the contract from the token you deployed. + +Create a folder named `utils`. Inside the folder, create the following new files and add the respective ABIs: + +- Add the [Interchain Token Service ABI](https://gist.github.com/Olanetsoft/2a632784e6753d34ca7ffc4f73bf58ed) to `interchainTokenServiceABI.json`. +- Add the [Interchain Token Factory ABI](https://gist.github.com/Olanetsoft/7d24e936f4cf6bd3d10d7b4f9a18d838) to `interchainTokenFactoryABI.json`. +- Add your custom token ABI to `customTokenABI.json`. You can get this from [BSC Scan](https://testnet.bscscan.com/) with the address of your deployed token. + +## **Set up an RPC for the local chain** + +Back in the root directory, set up an RPC for the BSC testnet. You will use this as your local (source) chain. + +### Create an `.env` file + +To make sure you’re not accidentally publishing your private key, create an [**`.env`** file](https://blog.bitsrc.io/a-gentle-introduction-to-env-files-9ad424cc5ff4) to store it in: + +```bash +touch .env +``` + +### Add your private key to `.env` and `hardhat.config.js` + +[Export your private key](https://support.metamask.io/managing-my-wallet/secret-recovery-phrase-and-private-keys/how-to-export-an-accounts-private-key/) and add it to the  **`.env`** file you just created: + +```bash +PRIVATE_KEY= // Add your account private key here +``` + + + +If you will push this project on GitHub, create a `.gitignore` file and include `.env`. + + + +Then, create a file with the name `hardhat.config.js` and add the following code snippet: + +```javascript +require("@nomicfoundation/hardhat-toolbox"); +require("dotenv").config({ path: ".env" }); + +const PRIVATE_KEY = process.env.PRIVATE_KEY; + +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: "0.8.18", + networks: { + bsc: { + url: "https://bsc-testnet.drpc.org/", + chainId: 97, + accounts: [PRIVATE_KEY], + }, + }, +}; +``` + +## Register a Canonical Interchain Token on a local chain + +Now that you have set up an RPC for the BSC testnet, you can register a Canonical Interchain Token. + +### Create a `canonicalInterchainToken.js` script + +Create a new file named `canonicalInterchainToken.js` and import the required dependencies: + +- `Ethers.js` +- The [AxelarJS SDK](https://github.com/axelarnetwork/axelarjs-sdk) +- The custom token contract ABI +- The address of the [`InterchainTokenService`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol) contract +- The address of the [`InterchainTokenFactory`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenFactory.sol) contract + +```javascript +const hre = require("hardhat"); +const crypto = require("crypto"); +const { + AxelarQueryAPI, + Environment, + EvmChain, + GasToken, +} = require("@axelar-network/axelarjs-sdk"); + +const interchainTokenServiceContractABI = require("./utils/interchainTokenServiceABI"); +const interchainTokenFactoryContractABI = require("./utils/interchainTokenFactoryABI"); +const customTokenContractABI = require("./utils/customTokenABI"); + +const MINT_BURN = 0; +const LOCK_UNLOCK = 2; + +// Addresses on mainnet/testnet +const interchainTokenServiceContractAddress = + "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C"; +const interchainTokenFactoryContractAddress = + "0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66"; +const customTokenAddress = "0x0EF6280417A1BF22c8fF05b54D7A7928a173E605"; // your token address +``` + +### Get the signer + +Next, create a `getSigner()` function in `canonicalInterchainToken.js`. This will obtain a signer for a secure transaction: + +```javascript +//... + +async function getSigner() { + const [signer] = await ethers.getSigners(); + return signer; +} +``` + +### Get the contract instance + +Then, create a `getContractInstance()` function in `canonicalInterchainToken.js` . This will get the contract instance based on the contract’s address, ABI, and signer: + +```javascript +//... + +async function getContractInstance(contractAddress, contractABI, signer) { + return new ethers.Contract(contractAddress, contractABI, signer); +} +``` + +## Register Canonical Interchain Token + +Now you’re ready to register your token as a Canonical Interchain Token! Create a `registerCanonicalInterchainToken()` function for the BSC testnet. This will register a Canonical Interchain Token with your custom token address: + +```javascript +// Register Canonical Interchain Token to the BSC chain. +async function registerCanonicalInterchainToken() { + // Get a signer to sign the transaction + const signer = await getSigner(); + + // Create contract instances + const interchainTokenFactoryContract = await getContractInstance( + interchainTokenFactoryContractAddress, + interchainTokenFactoryContractABI, + signer, + ); + const interchainTokenServiceContract = await getContractInstance( + interchainTokenServiceContractAddress, + interchainTokenServiceContractABI, + signer, + ); + + // Register a new Canonical Interchain Token + const deployTxData = + await interchainTokenFactoryContract.registerCanonicalInterchainToken( + customTokenAddress, // Your token address + ); + + // Retrieve the token ID of the newly registered token + const tokenId = + await interchainTokenFactoryContract.canonicalInterchainTokenId( + customTokenAddress, + ); + + const expectedTokenManagerAddress = + await interchainTokenServiceContract.tokenManagerAddress(tokenId); + + console.log( + ` + Transaction Hash: ${deployTxData.hash}, + Token ID: ${tokenId}, + Expected Token Manager Address: ${expectedTokenManagerAddress}, + `, + ); +} +``` + +### Add a `main()` function + +Add a `main()` function to execute the `canonicalInterchainToken.js` script. It will handle any errors that may arise: + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + case "registerCanonicalInterchainToken": + await registerCanonicalInterchainToken(); + break; + default: + console.error(`Unknown function: ${functionName}`); + process.exitCode = 1; + return; + } +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); +``` + +### Run the `canonicalInterchainToken.js` script to deploy to BSC + +Run the script in your terminal to register and deploy the token, specifying the `BSC` testnet: + +```bash +FUNCTION_NAME=registerCanonicalInterchainToken npx hardhat run canonicalInterchainToken.js --network bsc +``` + +If you see something similar to the following on your console, you have successfully registered your token as a Canonical Interchain Token. + +```bash +Transaction Hash: 0x4ba22486dda650578ed782b8fd4e9a394664e9b4dcb8c2cbd99403543a749325, +Token ID: 0x90d04b71cd22ebcf0821ff59dd15d10865bf927ed36f0ad6b8c4a8686f0ffe58, +Expected Token Manager Address: 0xEb910958C32fEB6D85cd1f7c04216BD354834D86, +``` + +### Store the token ID + +Copy the token ID and store it somewhere safe. You will need it to initiate a remote token transfer in a later step. + +### Check the transaction on the BSC testnet scanner + +Check the [BSC testnet scanner](https://testnet.bscscan.com/) to see if you have successfully registered your [token as a Canonical Interchain Token](https://testnet.bscscan.com/tx/0x4ba22486dda650578ed782b8fd4e9a394664e9b4dcb8c2cbd99403543a749325). + +## Deploy Remote Canonical Interchain Token + +You’ve just successfully a Canonical Interchain Token to BSC, which you are using as your local chain. Now, deploy the token remotely to Avalanche Fuji, which will be the remote chain in this tutorial. Remember that you can specify any two chains to be your local and remote chains. + +### Estimate gas fees + +In `canonicalInterchainToken.js`, call `estimateGasFee()` from the [AxelarJS SDK](https://www.notion.so/bd238d757a144a069501f0b481488ef3?pvs=21) to estimate the actual cost of deploying your remote Canonical Interchain Token on a remote chain: + +```javascript +//... + +const api = new AxelarQueryAPI({ environment: Environment.TESTNET }); + +// Estimate gas costs. +async function gasEstimator() { + const gas = await api.estimateGasFee( + EvmChain.BINANCE, + EvmChain.AVALANCHE, + GasToken.ETH, + 700000, + 1.1, + ); + + return gas; +} + +//... +``` + +### Perform remote token deployment + +Create a `deployRemoteCanonicalInterchainToken()` function that will perform token remote canonical deployment on the Avalanche Fuji testnet. + +```javascript +//... + +// deployRemoteCanonicalInterchainToken: On Avalanche Fuji +async function deployRemoteCanonicalInterchainToken() { + // Get a signer for authorizing transactions + const signer = await getSigner(); + + // Get contract for remote deployment + const interchainTokenFactoryContract = await getContractInstance( + interchainTokenFactoryContractAddress, + interchainTokenFactoryContractABI, + signer, + ); + + // Estimate gas fees + const gasAmount = await gasEstimator(); + + // Initiate transaction + const txn = await interchainTokenFactoryContract[ + "deployRemoteCanonicalInterchainToken(address,string,uint256)" + ](customTokenAddress, "Avalanche", gasAmount, { value: gasAmount }); + + console.log(`Transaction Hash: ${txn.hash}`); +} + +//... +``` + +### Update `main()` to deploy to remote chains + +Update `main()` to execute `deployRemoteCanonicalInterchainToken()` : + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + //... + case "deployRemoteCanonicalInterchainToken": + await deployRemoteCanonicalInterchainToken(); + break; + default: + //... + } +} + +//... +``` + +### Run the `canonicalInterchainToken.js` script to deploy to Avalanche Fuji testnet + +Run the script in your terminal to to deploy remote Canonical Interchain Token, once again specifying the `BSC` testnet (the source chain where all transactions are taking place): + +```bash +FUNCTION_NAME=deployRemoteCanonicalInterchainToken npx hardhat run canonicalInterchainToken.js --network bsc +``` + +You should see something similar to the following on your console: + +```bash +Transaction Hash: 0x3c36b04418aca90393435dbe9c2b65d26acc6e9f86aba1f34db27b41d82fda13 +``` + +### Check the transaction on the Axelar testnet scanner + +Check the [Axelarscan testnet scanner](https://testnet.axelarscan.io/) to see if you have successfully deployed the remote Canonical Interchain Token “HM” on the Avalanche Fuji testnet. It should look something like [this](https://testnet.axelarscan.io/gmp/0x3c36b04418aca90393435dbe9c2b65d26acc6e9f86aba1f34db27b41d82fda13). Make sure that Axelar shows a successful transaction before continuing on to the next step. + +## Transfer your token between chains + +Now that you have registered and deployed a Canonical Interchain Token, both locally to BSC and remotely to Avalanche Fuji, you can transfer between those two chains via the [`interchainTransfer()`](/dev/send-tokens/interchain-tokens/interchain-transfer/) method. + +### Initiate a remote token transfer + +In `canonicalInterchainToken.js`, create a `transferTokens()` function that will facilitate remote token transfers between chains. Change the token ID to the `tokenId` that you [saved from an earlier step](#store-the-token-id), and change the address in `transfer` to your own wallet address: + +```javascript +//... + +// Transfer token between chains. +async function transferTokens() { + const signer = await getSigner(); + + const interchainTokenServiceContract = await getContractInstance( + interchainTokenServiceContractAddress, + interchainTokenServiceContractABI, + signer, + ); + + const customTokenContract = await getContractInstance( + customTokenAddress, + customTokenContractABI, + signer, + ); // Approve ITS to spend tokens + + await customTokenContract.approve( + interchainTokenServiceContractAddress, + ethers.utils.parseEther("50"), + ); + + const gasAmount = await gasEstimator(); + + // Send via token + const transfer = await interchainTokenServiceContract.interchainTransfer( + "0x90d04b71cd22ebcf0821ff59dd15d10865bf927ed36f0ad6b8c4a8686f0ffe58", // token ID from registerCanonicalInterchainToken + "Avalanche", // Destination chain + "0x510e5EA32386B7C48C4DEEAC80e86859b5e2416C", // Destination address. Update with your own wallet address + ethers.utils.parseEther("50"), // Amount to transfer + "0x00", + gasAmount, // gasValue + { value: gasAmount }, + ); + + console.log("Transfer Transaction Hash:", transfer.hash); +} +``` + +### Update `main()` to execute token transfer + +Update the `main()` to execute `transferTokens()`: + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + //... + case "transferTokens": + await transferTokens(); + break; + default: + //... + } +} + +//... +``` + +### Run the `canonicalInterchainToken.js` script to transfer tokens + +Run the script in your terminal, specifying the `BSC` testnet: + +```bash +FUNCTION_NAME=transferTokens npx hardhat run canonicalInterchainToken.js --network bsc +``` + +You should see something similar to the following on your console: + +```bash +Transfer Transaction Hash: 0xd46a1941e04d06084eb7df3b1933617eccfb21a77dbcfb3b0399e1ac1c0ee6c9 +``` + +If you see this, it means that your interchain transfer has been successful! 🎉 + + + **Note:** If you get the following `nonce too low` error, wait a few minutes + and run `canonicalInterchainToken.js` again. Some chains have a longer + transaction time than others. + + +```bash +reason: 'nonce has already been used', +code: 'NONCE_EXPIRED', +error: ProviderError: nonce too low +``` + +### Check the transaction on the Axelar testnet scanner + +Check the [Axelarscan testnet scanner](https://testnet.axelarscan.io/) to see if you have successfully transferred HM from the BSC testnet to the Avalanche Fuji testnet. It should look something like [this](https://testnet.axelarscan.io/gmp/0xd46a1941e04d06084eb7df3b1933617eccfb21a77dbcfb3b0399e1ac1c0ee6c9). + +### Import the new token into your wallet + +You can also import the new token into your own wallet with its contract address that you saved from BSC Scan. + +## Congratulations! + +You have now programmatically created a Canonical Interchain Token using Axelar’s Interchain Token Service and transferred it between two chains. You should now be able to confidently create and manage your own Interchain Tokens, opening up a wide range of possibilities for token transfers and asset bridges. + +Great job making it this far! To show your support to the author of this tutorial, please post about your experience and tag [@axelarnetwork](https://x.com/axelar) on Twitter (X). + +## What’s next + +For further examples utilizing the Interchain Token Service, check out the following in the [`axelar-examples`](https://github.com/axelarnetwork/axelar-examples/tree/main) repo on GitHub: + +- [`its-custom-token`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-custom-token) — Demonstrates how to use the ITS with a custom token implementation. +- [`its-interchain-token`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-interchain-token) — Demonstrates how to deploy Interchain Tokens that are connected across EVM chains and how to send some tokens across. +- [`its-canonical-token`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-canonical-token) - Demonstrates how to deploy canonical Interchain Token and send cross-chain transfer for these tokens. +- [`its-lock-unlock-fee`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-lock-unlock-fee) Demonstrates how to deploy deploy interchain token with lock/unlock_fee token manager type. +- [`its-executable`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-executable) Demonstrates how to deploy interchain token and send a cross-chain transfer along with a message. +- [`its-mint-burn-from`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-mint-burn-from) Demonstrates how to deploy interchain token with uses `burnFrom()` on token being bridged rather than `burn()`. + +## References + +- [Interchain Token Service Documentation](/dev/send-tokens/interchain-tokens/intro/) +- [Interchain Tokens GitHub Repository](https://github.com/axelarnetwork/interchain-token-service/tree/main) +- [AxelarJS SDK](https://github.com/axelarnetwork/axelarjs-sdk) diff --git a/src/content/docs/dev/send-tokens/interchain-tokens/developer-guides/programmatically-create-a-token.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/developer-guides/programmatically-create-a-token.mdx new file mode 100644 index 000000000..afc5353fa --- /dev/null +++ b/src/content/docs/dev/send-tokens/interchain-tokens/developer-guides/programmatically-create-a-token.mdx @@ -0,0 +1,495 @@ +# Create a new Interchain Token + +[Interchain Tokens](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interchain-token/InterchainToken.sol) are created and managed by Axelar’s [Interchain Token Service](https://github.com/axelarnetwork/interchain-token-service/tree/main), which uses [GMP messages](https://docs.axelar.dev/dev/general-message-passing/overview) to send tokens cross-chain. With it, you can build your own asset bridges, build asset transfers into your interchain dApp, and [take on many other use cases](https://community.axelar.network/t/expanding-the-axelar-ecosystem-ideas-for-infrastructure-projects/2583/2). + +The workflow can be summarized in three steps: + +1. The user obtains a token `x` from chain A. +2. A message is sent to chain B specifying where the token should be transferred. +3. Finally, Chain B receives the message is received and transfers token `x` to the appropriate destination address. + +In this tutorial, you will learn how to: + +- Programmatically create a new Interchain Token from scratch using Axelar's Interchain Token Service +- Register and deploy the token locally on the Binance Smart chain (BSC) +- Register and deploy the token remotely on the Avalanche Fuji chain +- Transfer your token between those chains + +## **Prerequisites** + +You will need: + +- A basic understanding of [Solidity](https://www.tutorialspoint.com/solidity/index.htm) and [JavaScript](https://www.w3schools.com/js/) +- A [MetaMask wallet](https://metamask.io/) with tBNB and Avax funds for testing. If you don’t have these funds, you can get tBNB from the [BSC faucet](https://www.bnbchain.org/en/testnet-faucet) and Avax from the Avalanche Fuji faucets ([1](https://faucets.chain.link/fuji), [2](https://core.app/tools/testnet-faucet/)). + +## **Set up your development environment** + +### Create and initialize a project + +Open up your terminal and navigate to any directory of your choice. Run the following commands to create and initiate a project: + +```bash +mkdir interchain-token-project && cd interchain-token-project +npm init -y +``` + +### Install Hardhat and the AxelarJS SDK + +Install [Hardhat](https://hardhat.org/) and the [AxelarJS SDK](https://github.com/axelarnetwork/axelarjs-sdk) with the following commands: + +```bash +npm install --save-dev hardhat@2.18.1 dotenv@16.3.1 +npm install @axelar-network/axelarjs-sdk@0.13.9 crypto@1.0.1 @nomicfoundation/hardhat-toolbox@2.0.2 +``` + +### Set up project ABIs + +Next, set up the ABIs for the Interchain Token Service, Interchain Token Factory, and Interchain Token Contract, as they will be needed during deployment. + +Create a folder named `utils`. Inside the folder, create the following new files and add the respective ABIs: + +- Add the [Interchain Token Service ABI](https://gist.github.com/Olanetsoft/2a632784e6753d34ca7ffc4f73bf58ed) to `interchainTokenServiceABI.json`. +- Add the [Interchain Token Factory ABI](https://gist.github.com/Olanetsoft/7d24e936f4cf6bd3d10d7b4f9a18d838) to `interchainTokenFactoryABI.json`. +- Add the [Interchain Token ABI](https://gist.github.com/Olanetsoft/39051a113dfa080d7c58e6cfc8d878cc) to `interchainTokenABI.json`. + +## **Set up an RPC for the local chain** + +Next, set up an RPC for the BSC testnet, which you will be using as your local (source) chain. + +### Create an `.env` file + +To make sure you’re not accidentally publishing your private key, create an [**`.env`** file](https://blog.bitsrc.io/a-gentle-introduction-to-env-files-9ad424cc5ff4) to store it in: + +```bash +touch .env +``` + +### Add your private key to `.env` and `hardhat.config.js` + +[Export your private key](https://support.metamask.io/managing-my-wallet/secret-recovery-phrase-and-private-keys/how-to-export-an-accounts-private-key/) and add it to the `.env` file you just created: + +```bash +PRIVATE_KEY= // Add your account private key here +``` + + + +Then, create a file with the name `hardhat.config.js` and add the following code snippet: + +```javascript +require("@nomicfoundation/hardhat-toolbox"); +require("dotenv").config({ path: ".env" }); + +const PRIVATE_KEY = process.env.PRIVATE_KEY; + +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: "0.8.18", + networks: { + bsc: { + url: "https://bsc-testnet.drpc.org/", + chainId: 97, + accounts: [PRIVATE_KEY], + }, + }, +}; +``` + +## Register and deploy a new Interchain Token to the local chain + +Now that you’ve set up a BSC testnet RPC, you can register and deploy a new Interchain Token. For the purposes of this tutorial, the token you’ll create will be called “New Interchain Token” and have the symbol “NIT”: + +### Create a `newInterchainToken.js` script + +Create a new file named `newInterchainToken.js` and import the required dependencies: + +- Ethers.js +- The AxelarJS SDK +- The contract ABIs +- The address of the Interchain Token Service contract +- The address of the Interchain Token Factory contract + +```javascript +const hre = require("hardhat"); +const crypto = require("crypto"); +const ethers = hre.ethers; +const { + AxelarQueryAPI, + Environment, + EvmChain, + GasToken, +} = require("@axelar-network/axelarjs-sdk"); + +const interchainTokenServiceContractABI = require("./utils/interchainTokenServiceABI"); +const interchainTokenFactoryContractABI = require("./utils/interchainTokenFactoryABI"); +const interchainTokenContractABI = require("./utils/interchainTokenABI"); + +const interchainTokenServiceContractAddress = + "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C"; +const interchainTokenFactoryContractAddress = + "0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66"; +``` + +### Get the signer + +Next, create a `getSigner()` function in `newInterchainToken.js`. This will obtain a signer for a secure transaction: + +```javascript +//... + +async function getSigner() { + const [signer] = await ethers.getSigners(); + return signer; +} +``` + +### Get the contract instance + +Then, create a `getContractInstance()` function in `newInterchainToken.js` . This will get the contract instance based on the contract’s address, ABI, and signer: + +```javascript +//... + +async function getContractInstance(contractAddress, contractABI, signer) { + return new ethers.Contract(contractAddress, contractABI, signer); +} +``` + +### Add a deployment function + +Now you’re ready to register and deploy your token! Create a `registerAndDeploy()` function for the BSC testnet. This will create a new token called “New Interchain Token” with the symbol “NIT”: + +```javascript +// Register and deploy a new interchain token to the BSC testnet +async function registerAndDeploy() { + // Generate random salt + const salt = "0x" + crypto.randomBytes(32).toString("hex"); + + // Create a new token + const name = "New Interchain Token"; + const symbol = "NIT"; + const decimals = 18; + + // Initial token supply + const initialSupply = ethers.utils.parseEther("1000"); + + // Get a signer to sign the transaction + const signer = await getSigner(); + + // Create contract instances + const interchainTokenFactoryContract = await getContractInstance( + interchainTokenFactoryContractAddress, + interchainTokenFactoryContractABI, + signer, + ); + const interchainTokenServiceContract = await getContractInstance( + interchainTokenServiceContractAddress, + interchainTokenServiceContractABI, + signer, + ); + + // Generate a unique token ID using the signer's address and salt + const tokenId = await interchainTokenFactoryContract.interchainTokenId( + signer.address, + salt, + ); + + // Retrieve new token address + const tokenAddress = + await interchainTokenServiceContract.interchainTokenAddress(tokenId); + + // Retrieve token manager address + const expectedTokenManagerAddress = + await interchainTokenServiceContract.tokenManagerAddress(tokenId); + + // Deploy new Interchain Token + const deployTxData = + await interchainTokenFactoryContract.deployInterchainToken( + salt, + name, + symbol, + decimals, + initialSupply, + signer.address, + ); + + console.log( + ` + Deployed Token ID: ${tokenId}, + Token Address: ${tokenAddress}, + Transaction Hash: ${deployTxData.hash}, + salt: ${salt}, + Expected Token Manager Address: ${expectedTokenManagerAddress}, + `, + ); +} +``` + +### Add a `main()` function + +Add a `main()` function for executing the `newInterchainToken.js` script. It will handle any errors that may arise: + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + case "registerAndDeploy": + await registerAndDeploy(); + break; + default: + console.error(`Unknown function: ${functionName}`); + process.exitCode = 1; + return; + } +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); +``` + +### Run the `newInterchainToken.js` script to deploy to BSC + +Run the script in your terminal to register and deploy the token, specifying the BSC testnet: + +```bash +FUNCTION_NAME=registerAndDeploy npx hardhat run newInterchainToken.js --network bsc +``` + +You should see something similar to the following on your console: + +```javascript +Deployed Token ID: 0x46883a49f2798ae966b1bb98f1c2d577d6b4edbcd1fca9d0a28cc2a254852f1e, +Token Address: 0x5dcDf836212CAc43dacb81af07fF84D805422f6c, +Transaction Hash: 0xa9a7054dbb348eecbe4f1486d58cda758442489f4a9f0a20d70d1fce63a179dd, +salt: 0x2ed5cdfe34cf85a1e46aa19679ad29d17d07e8a6197433a2738fabc5e7365d2d, +Expected Token Manager Address: 0xA7a00f1c3028c81d69F22232822DE82fC8f08403, +``` + +This shows that you have created a new interchain token called New Interchain Token (NIT) and deployed it on the BSC testnet. + +### Check the transaction on the BSC testnet scanner + +Check the [BSC testnet scanner](https://testnet.bscscan.com/) to see if you have successfully [created](https://testnet.bscscan.com/tx/0xa9a7054dbb348eecbe4f1486d58cda758442489f4a9f0a20d70d1fce63a179dd) and [locally deployed](https://testnet.bscscan.com/tx/0xa9a7054dbb348eecbe4f1486d58cda758442489f4a9f0a20d70d1fce63a179dd) a new Interchain Token on the BSC testnet. + +### Get new token address + +On BSC Scan, navigate to the **ERC-20 Tokens Transferred** section and click **New Interchain Token (NIT)**. This should take you to a page for your new token. Copy the token contract address from the **Other Info** section and store it somewhere safe. You will need it to initiate a remote transfer from the token in a later step. + +## Deploy an Interchain Token to a remote chain + +You’ve just successfully deployed an Interchain Token to BSC, which you are using as your local chain. Now, deploy it to Avalanceh Fuji, which will be the remote chain in this tutorial. Remember that you can specify any two chains to be your local and remote chains. + +### Estimate gas fees + +In `newInterchainToken.js`, call `estimateGasFee()` from the [AxelarJS SDK](https://www.npmjs.com/package/@axelar-network/axelarjs-sdk) to estimate the actual cost of deploying your token on a remote chain: + +```javascript +//... + +const api = new AxelarQueryAPI({ environment: Environment.TESTNET }); + +// Estimate gas costs. +async function gasEstimator() { + const gas = await api.estimateGasFee( + EvmChain.BINANCE, + EvmChain.AVALANCHE, + GasToken.ETH, + 700000, + 1.1, + ); + + return gas; +} + +//... +``` + +### Perform remote token deployment + +Create a `deployToRemoteChain()` function that will perform token remote deployment on the Avlanche Fuji testnet. Make sure to replace the `salt` value with the salt returned to your terminal from when you ran `registerAndDeploy()`: + +```javascript +//... + +// Deploy to remote chain: Avalanche Fuji +async function deployToRemoteChain() { + // Get a signer for authorizing transactions + const signer = await getSigner(); + // Get contract for remote deployment + const interchainTokenFactoryContract = await getContractInstance( + interchainTokenFactoryContractAddress, + interchainTokenFactoryContractABI, + signer, + ); + + // Estimate gas fees + const gasAmount = await gasEstimator(); + + // Salt value from registerAndDeploy(). Replace with your own + const salt = + "0x2ed5cdfe34cf85a1e46aa19679ad29d17d07e8a6197433a2738fabc5e7365d2d"; + + // Initiate transaction + const txn = await interchainTokenFactoryContract[ + "deployRemoteInterchainToken(bytes32,string,uint256)" + ](salt, "Avalanche", gasAmount, { value: gasAmount }); + + console.log(`Transaction Hash: ${txn.hash}`); +} + +//... +``` + +### Update `main()` to deploy to remote chains + +Update `main()` to execute `deployToRemoteChain()` : + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + //... + case "deployToRemoteChain": + await deployToRemoteChain(); + break; + default: + //... + } +} + +//... +``` + +### Run the `newInterchainToken.js` script to deploy to Avalanche Fuji + +Run the script in your terminal to register and deploy the token, once again specifying the `bsc` testnet (the source chain where all transactions are taking place): + +```javascript +FUNCTION_NAME=deployToRemoteChain npx hardhat run newInterchainToken.js --network bsc +``` + +You should see something similar to the following on your console: + +```bash +Transaction Hash: 0x7ad7cbbb7b8a76b26eccd97f6c41d6f38066d829f7e0554ab60223b18665f98a +``` + +### Check the transaction on the Axelar testnet scanner + +Check the [Axelarscan testnet scanner](https://testnet.axelarscan.io/) to see if you have successfully created and remotely deployed NIT on the Avalanche Fuji testnet. It should look something like [this](https://testnet.axelarscan.io/gmp/0x7ad7cbbb7b8a76b26eccd97f6c41d6f38066d829f7e0554ab60223b18665f98a). Make sure that Axelar shows a successful transaction before continuing on to the next step. + +## Transfer your token between chains + +Now that you have deployed your token both locally to BSC and remotely to Avalanche Fuji, you can transfer between those two chains using the NIT you just deployed via the [`interchainTransfer()`](https://github.com/axelarnetwork/interchain-token-service/blob/9edc4318ac1c17231e65886eea72c0f55469d7e5/contracts/interfaces/IInterchainTokenStandard.sol#L19) method. + +### Initiate a remote token transfer directly from the token + +In `newInterchainToken.js`, create a `transferTokens()` function that will facilitate remote token transfers between chains. Change the address in `interchainToken` to the new token address from the FTM scan that you saved from an earlier step, and change the address in `transfer` to your own wallet address: + +```javascript +//... + +async function transferTokens() { + // Get signer + const signer = await getSigner(); + + const interchainToken = await getContractInstance( + "0x5dcDf836212CAc43dacb81af07fF84D805422f6c", // Update with new token address + interchainTokenContractABI, // Interchain Token contract ABI + signer, + ); + + // Calculate gas amount + const gasAmount = await gasEstimator(); + + // Initiate transfer via token + const transfer = await interchainToken.interchainTransfer( + "Avalanche", // Destination chain + "0x510e5EA32386B7C48C4DEEAC80e86859b5e2416C", // Update with your own wallet address + ethers.utils.parseEther("25"), // Transfer 25 tokens + "0x", // Empty data payload + { value: gasAmount }, // Transaction options + ); + console.log("Transfer Transaction Hash:", transfer.hash); +} + +//... +``` + +### Update `main()` to execute token transfer + +Update the `main()` to execute `transferTokens()`: + +```javascript +//... + +async function main() { + const functionName = process.env.FUNCTION_NAME; + switch (functionName) { + //... + case "transferTokens": + await transferTokens(); + break; + default: + //... + } +} + +//... +``` + +### Run the `newInterchainToken.js` script to transfer tokens + +Run the script in your terminal, specifying the `BSC` testnet: + +```javascript +FUNCTION_NAME=transferTokens npx hardhat run newInterchainToken.js --network bsc +``` + +You should see something similar to the following on your console: + +```bash +Transfer Transaction Hash: 0x495f530e603e3bfe425998dcced66e849353a4ba0196cbc0a041ac2f28eb8f96 +``` + +If you see this, it means that your interchain transfer has been successful! 🎉 + +### Check the transaction on the Axelar testnet scanner + +Check the [Axelarscan testnet scanner](https://testnet.axelarscan.io/) to see if you have successfully transferred NIT from the BSC testnet to the Avalanche Fuji testnet. It should look something like [this](https://testnet.axelarscan.io/gmp/0x495f530e603e3bfe425998dcced66e849353a4ba0196cbc0a041ac2f28eb8f96). + +### Import the new token into your wallet + +You can also import the new token into your own wallet with its contract address that you saved from BSC Scan. You should have 975 NIT on BSC and 25 NIT on Avalanche Fuji. + +## Congratulations! + +You have now programmatically created a new interchain token called NIT using Axelar’s Interchain Token Service and transferred it between two chains. You should now be able to confidently create and manage your own Interchain Tokens, opening up a wide range of possibilities for token transfers and asset bridges. + +Great job making it this far! To show your support to the author of this tutorial, please post about your experience and tag [@axelarnetwork](https://x.com/axelar) on Twitter (X). + +## What’s next + +For further examples utilizing the Interchain Token Service, check out the following in the [`axelar-examples`](https://github.com/axelarnetwork/axelar-examples/tree/main) repo on GitHub: + +- [`its-custom-token`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-custom-token) — Demonstrates how to use the ITS with a custom token implementation. +- [`its-interchain-token`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-interchain-token) — Demonstrates how to deploy Interchain Tokens that are connected across EVM chains and how to send some tokens across. +- [`its-canonical-token`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-canonical-token) - Demonstrates how to deploy canonical Interchain Token and send cross-chain transfer for these tokens. +- [`its-lock-unlock-fee`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-lock-unlock-fee) Demonstrates how to deploy deploy interchain token with lock/unlock_fee token manager type. +- [`its-executable`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-executable) Demonstrates how to deploy interchain token and send a cross-chain transfer along with a message. +- [`its-mint-burn-from`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-mint-burn-from) Demonstrates how to deploy interchain token with uses `burnFrom()` on token being bridged rather than `burn()`. + +## References + +- [Interchain Token Service Documentation](/dev/send-tokens/interchain-tokens/intro/) +- [Interchain Tokens GitHub Repository](https://github.com/axelarnetwork/interchain-token-service/tree/main) +- [AxelarJS SDK](https://github.com/axelarnetwork/axelarjs-sdk) diff --git a/src/pages/dev/reference/interchain-token-service-rate-limit.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/flow-limit.mdx similarity index 80% rename from src/pages/dev/reference/interchain-token-service-rate-limit.mdx rename to src/content/docs/dev/send-tokens/interchain-tokens/flow-limit.mdx index 739b170ac..854401ed5 100644 --- a/src/pages/dev/reference/interchain-token-service-rate-limit.mdx +++ b/src/content/docs/dev/send-tokens/interchain-tokens/flow-limit.mdx @@ -1,12 +1,12 @@ -# Rate Limit in Interchain Token Service +# Flow Limit in Interchain Token Service ## Overview -`FlowLimit` ensures the stability and security of interchain operations by setting constraints on the volume of tokens that can be transferred within a specified time frame. This prevents system abuse and overload, which is crucial in Interchain transfers. `FlowLimit` is managed by the [`FlowLimit` contract](https://github.com/axelarnetwork/interchain-token-service/blob/v1.0.0/contracts/utils/FlowLimit.sol), a core component of the [Interchain Token Service (ITS)](https://github.com/axelarnetwork/interchain-token-service/blob/v1.0.0/contracts/InterchainTokenService.sol) designed to regulate the flow of tokens across different blockchains. +A `FlowLimit` ensures the stability and security of interchain operations by setting constraints on the volume of tokens that can be transferred within a specified time frame. This prevents system abuse and overload, which is crucial in Interchain transfers, and can be used to prevent transfers of a token on a chain that is undergoing an emergency situation. Flow limits are managed by the [`FlowLimit` contract](https://github.com/axelarnetwork/interchain-token-service/blob/v1.0.0/contracts/utils/FlowLimit.sol). -The `FlowLimit` contract is [integrated](https://github.com/axelarnetwork/interchain-token-service/blob/0a00533f19197a285d6bddc8ec0c2e908094ebfe/contracts/InterchainTokenService.sol#L520) into the token manager contracts within the Interchain Token Service. These token managers, responsible for handling tokens before and after interchain transfers, utilize the `FlowLimit` functionalities to regulate token transfers and maintain system integrity. +The `FlowLimit` contract is [used by](https://github.com/axelarnetwork/interchain-token-service/blob/v1.0.0/contracts/token-manager/TokenManager.sol#L15) the [token manager contract](https://github.com/axelarnetwork/interchain-token-service/blob/v1.0.0/contracts/token-manager/TokenManager.sol#L21). These token managers, use the `FlowLimit` functionalities to set cross-chain transfer volume going in and out of a given blockchain. -This guide provides a comprehensive understanding of how the `FlowLimit` contract operates within the context of [Interchain](https://github.com/axelarnetwork/interchain-token-service/blob/v1.0.0/contracts/InterchainTokenService.sol) token transfers. +This guide provides a comprehensive understanding of how the `FlowLimit` contract operates within the context of [Interchain token transfers](https://github.com/axelarnetwork/interchain-token-service/blob/v1.0.0/contracts/InterchainTokenService.sol#L455). ## Core Aspects @@ -31,7 +31,7 @@ The `FlowLimit` contract contains the following public functions. ### `flowLimit()` Returns the current flow limit value. - + ```solidity /** * @notice Returns the current flow limit. @@ -43,11 +43,11 @@ function flowLimit() public view returns (uint256 flowLimit_) { } } ``` - + ### `flowOutAmount()` Returns the current total amount of tokens that have flowed out in the current epoch. - + ```solidity /** * @notice Returns the current flow out amount. @@ -62,11 +62,11 @@ function flowOutAmount() external view returns (uint256 flowOutAmount_) { } } ``` - + ### `flowInAmount()` Returns the current total amount of tokens that have flowed in the current epoch. - + ```solidity /** * @notice Returns the current flow in amount. @@ -81,7 +81,7 @@ function flowInAmount() external view returns (uint256 flowInAmount_) { } } ``` - + ## Internal Management Functions The `FlowLimit` contract contains the following internal functions. @@ -89,7 +89,7 @@ The `FlowLimit` contract contains the following internal functions. ### `_setFlowLimit(uint256, bytes32)` Sets the flow limit for a specific token. - + ```solidity /** * @notice Internal function to set the flow limit. @@ -104,11 +104,11 @@ function _setFlowLimit(uint256 flowLimit_, bytes32 tokenId) internal { emit FlowLimitSet(tokenId, msg.sender, flowLimit_); } ``` - + ### `_addFlowOut(uint256)` Adds to the flow out amount, ensuring it does not exceed the flow limit. - + ```solidity /** * @notice Adds a flow out amount. @@ -125,11 +125,11 @@ function _addFlowOut(uint256 flowOutAmount_) internal { _addFlow(flowLimit_, slotToAdd, slotToCompare, flowOutAmount_); } ``` - + ### `_addFlowIn(uint256)` Adds to the flow in amount, also ensuring adherence to the flow limit. - + ```solidity /** * @notice Adds a flow in amount. @@ -154,25 +154,28 @@ There are several options for setting and overriding flow limits in the Intercha ### Fully managed flow limits If you want Axelar to manage the flow limits for the token and not deal with it yourself: + - Deploy the token with the `minter` address set to `address(0)` ### Partially managed flow limits If you want to manage the flow limits together with Axelar: + - Deploy the token with the `minter` address set to your Deployer account or a multi-sig wallet -If you want to manage the flow limits alone: + If you want to manage the flow limits alone: - Deploy the token with the `minter` address set to your Deployer account - Call `tokenManager.removeFlowLimiter(itsAddress)` to remove flow limit management by Axelar ### Unmanaged flow limits If you don't want anyone to manage flow limits: + - Deploy the token with the `minter` address set to your Deployer account - Call `tokenManager.removeFlowLimiter(itsAddress)` to remove flow limit management by Axelar - Call `tokenManager.removeFlowLimiter(minter)` to remove flow limit management by the minter - Call `tokenManager.transferOperatorship(address(0))` to remove operatorship -The following is an example of how to set a flow limit using the `setFlowLimits` method. You might want to increase the limit to the max before removing access granted to yourself. +The following is an example of how to set a flow limit using the `setFlowLimits` method. You might want to increase the limit to the max before removing access granted to yourself. ```solidity /** diff --git a/src/content/docs/dev/send-tokens/interchain-tokens/integrate-custom-token.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/integrate-custom-token.mdx new file mode 100644 index 000000000..7b5e07f51 --- /dev/null +++ b/src/content/docs/dev/send-tokens/interchain-tokens/integrate-custom-token.mdx @@ -0,0 +1,154 @@ +# Integrate Custom Token + +import { Callout } from "/src/components/callout"; + +Custom tokens are independently deployed tokens, as opposed to [InterchainTokens](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interchain-token/InterchainToken.sol) deployed via the [Interchain Token Service (ITS)](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol). These tokens are integrated with ITS across different chains by deploying a Token Manager for each. + +Once a custom token has a Token Manager deployed on a given chain, it becomes bridgeable between blockchains that also have a token connected to a Token Manager sharing the same [`interchainTokenId`](/dev/send-tokens/interchain-tokens/intro/#interchain-token-id). + +## Install the Axelar ITS Dependency + +Install the Axelar [Interchain Token Service (ITS) package](https://www.npmjs.com/package/@axelar-network/interchain-token-service) using npm or any other node package manager: + +```bash +npm i @axelar-network/interchain-token-service +``` + +## Build and Deploy Your ERC-20 Token on Multiple Chains + +Build your ERC-20 token and deploy it on multiple chains. You can use a tool like the [Create3 Deployer](/dev/solidity-utilities/#create3-deployer) to ensure your token has the same address across chains. + +Example token contract: + +```solidity +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; + +contract MyCustomToken is ERC20, ERC20Burnable { + constructor(address initialOwner) + ERC20("My Custom Token", "MCT") + { + // Initialization code here + } + + function mint(address to, uint256 amount) public onlyMinter { + _mint(to, amount); + } + + function burn(address from, uint256 amount) public onlyMinter { + _burn(from, amount); + } +} +``` + +This token is a simple implementation of an ERC-20 token that includes the critical functions needed to integrate with ITS: the ability to `mint()` and `burn()` tokens. ITS calls these functions when bridging tokens between chains. + +You can also inherit from the [InterchainTokenStandard](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interchain-token/InterchainTokenStandard.sol#L12) so your token has built-in cross-chain functionality, such as the [interchainTransfer()](/dev/send-tokens/interchain-tokens/interchain-transfer/) function. + +## Integrate Custom Token with ITS + +After deploying your custom tokens on your preferred chains, the next step is to integrate your token with ITS by following these steps: + +1. [Register token metadata with the ITS Contract](#register-token-metadata-with-the-its-contract) +2. [Register custom token with the Interchain Token Factory](#register-custom-token-with-the-interchain-token-factory) +3. [Link custom token with the Interchain Token Factory](#link-custom-token-with-the-interchain-token-factory) +4. [Assign the minter role to your token's Token Manager](#assign-the-minter-role-to-your-tokens-token-manager) + +### Register Token Metadata with the ITS Contract + +Register your token metadata using the [`registerTokenMetadata`](https://github.com/axelarnetwork/interchain-token-service/blob/94677f1072da127a0ee7ff5ab6784dcfe11789e8/contracts/InterchainTokenService.sol#L274) function on the ITS contract. This function registers metadata for a token on the ITS Hub. This metadata is used for scaling linked tokens. +For example, if you are integrating your custom token on chains A, B, and C, you should register token metadata on each chain separately. The `registerTokenMetadata()` function must be called on each chain the token will be linked on. When triggered, a cross-chain message will be sent from your source chain to ITS Hub on Axelar. + +```solidity +function registerTokenMetadata( + address tokenAddress, // your token address + uint256 gasValue // gas value +) external payable {}; +``` + +This function registers metadata for a token on the [ITS Hub](/dev/amplifier/its-hub/introduction/). This metadata is used for scaling linked tokens. + +> **Note:** Token metadata must be registered before [`linkToken`](https://github.com/axelarnetwork/interchain-token-service/blob/94677f1072da127a0ee7ff5ab6784dcfe11789e8/contracts/InterchainTokenService.sol#L329) can be called for the corresponding token. This function links a remote token on `destinationChain` to a local token corresponding to the `tokenId` computed from the provided `salt`. + +You can see a real example of this function being used in [this transaction on Axelarscan](https://testnet.axelarscan.io/gmp/0xf860bd8802d046fb0c752c355bc73c87e69f701348420c6cbdf82534b87c4822-2), which demonstrates registering a token metadata on BNB. + + +### Register Custom Token with the Interchain Token Factory + +The [registerCustomToken()](https://github.com/axelarnetwork/interchain-token-service/blob/cc6ef7282e18c6b2842cbf1098b06161e38ea32e/contracts/InterchainTokenService.sol#L298) function registers an existing ERC-20 token (your custom token) under an `interchainTokenId` computed from the provided `salt`. Once executed, your token's [token manager](/dev/send-tokens/interchain-tokens/token-manager/) will be deployed for that blockchain. This function only needs to be called once on a single "home" chain that your token is being integrated with, as opposed to the `registerTokenMetadata()` function that must be triggered on each chain the token will be linked on. + +```solidity +function registerCustomToken( + bytes32 salt, // your unique salt value + address tokenAddress, // your custom token address + TokenManagerType tokenManagerType, // token manager type + address operator // operator address +) external payable returns (bytes32 tokenId) {}; +``` + +This function is called from the [Interchain Token Factory](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenFactory.sol) rather than directly from ITS because the Factory provides additional utility functions and standardized `interchainTokenId` computation logic. + + + **Security Note:** The key used to register custom tokens is critical for + security. If that key is compromised, the token can be compromised across + multiple chains. - Interchain native tokens can only be deployed to additional + chains via the same deployer key, so that key must be securely retained. - + Tokens registered on ITS should be cautious about granting mint/burn + permissions to other contracts. For example, sharing mint permission with the + Polygon native bridge is not supported (the Polygon native bridge only looks + for burns, which ITS uses—potentially allowing duplicate sends). + + + +#### Parameters + +1. `salt:` The salt is used to compute the `interchainTokenId`. It must be unique for your token integration to ensure the `interchainTokenId` does not intersect with another `interchainTokenId`. If the combination of the `salt` and `sender` is not unique, the transaction will revert. +1. `tokenAddress`: The token address being linked. +1. `tokenManagerType`: The [type](/dev/send-tokens/interchain-tokens/token-manager/#token-manager-types) of manager being integrated. The value passed in must correspond to the `enum` value of the manager. (ie 2 for [lockUnlock](/dev/send-tokens/interchain-tokens/token-manager/#lockunlock), 4 for [mintBurn](/dev/send-tokens/interchain-tokens/token-manager/#mintburn)). +1. `operator`: The address that will hold the [operator](/dev/send-tokens/interchain-tokens/minter-operator-roles/#operator-role) role for this token's token manager. + + +You can see a real example of this function being used in [this transaction on BSC Scan](https://testnet.bscscan.com/tx/0xf0c3fbbece17cc12d9de76182540afb4f5c6c47aeca65c40f9d58f71e362dffe), which demonstrates registering a custom token on BNB. + + +### Link Custom Token with the Interchain Token Factory + +To connect your custom tokens between different chains, you can use the [`linkToken`](https://github.com/axelarnetwork/interchain-token-service/blob/94677f1072da127a0ee7ff5ab6784dcfe11789e8/contracts/InterchainTokenFactory.sol#L541) function. This can only be called once your token metadata has been [registered](/dev/send-tokens/interchain-tokens/integrate-custom-token/#register-token-metadata-with-the-its-contract) on both chains and at least one of your tokens has been registered on a given "home" chain via the [registerCustomToken()](/dev/send-tokens/interchain-tokens/integrate-custom-token/#register-custom-token-with-the-interchain-token-factory) function. + +```solidity +function linkToken( + bytes32 salt, // your unique salt value previously used + string calldata destinationChain, // destination chain + bytes calldata destinationTokenAddress, // destination custom token address + TokenManagerType tokenManagerType, // token manager type + bytes calldata linkParams, // operator address + uint256 gasValue // gas value +) external payable returns (bytes32 tokenId) {} +``` + +This function does the following: + +1. It computes a `interchainTokenId` using the same salt you used during token registration. +2. Creates a cross-chain message that instructs the destination chain to deploy a [Token Manager](/dev/send-tokens/interchain-tokens/token-manager/) for your token. +3. Establishes the connection between your tokens across chains by associating them with the same `interchainTokenId`. +4. Sets up the appropriate [Token Manager](/dev/send-tokens/interchain-tokens/token-manager/#token-manager-types) type that defines how tokens will be bridged (lock/unlock, mint/burn, etc.). + +You can see a real example of this function being used in [this transaction on Axelarscan](https://testnet.axelarscan.io/gmp/0x11c2a212180d7ea2babe7aceb66c32c1e235cc159bceeb4dd6d04411f4a9669f), which demonstrates linking a token between BNB chain and Avalanche. + + +### Assign the `minter` Role to Your Token's Token Manager + +Transfer the minter / burn role to the [Token Manager](/dev/send-tokens/interchain-tokens/token-manager/) using the [transferMintership()](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/utils/Minter.sol#L31) function on your token (or any AccessControls contract that may be handling role management for your token). To retrieve your token manager address, use the `tokenManagerAddress` function on the ITS contract by specifying your `tokenId`. This is role transfer is necessary because when your token is bridged to a destination chain, the `msg.sender` of the `mint()` call will be the Token Manager. + + +## What's Next + +For further examples utilizing the Interchain Token Service, check out the [`axelar-examples`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm) repository on GitHub. There, you can find implementations such as: + +- [`its-custom-token`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-custom-token) — Demonstrates how to use ITS with a custom token implementation. +- [`its-executable`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-executable) — Demonstrates how to deploy an interchain token and send a cross-chain transfer along with a message. +- [`its-mint-burn-from`](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-mint-burn-from) — Demonstrates how to deploy an interchain token that uses `burnFrom()` instead of `burn()` when bridging tokens. + +## Tutorial + +For a step-by-step guide on integrating a custom token, check out the [Link Custom Tokens Deployed Across Multiple Chains into Interchain Tokens](/dev/send-tokens/interchain-tokens/developer-guides/link-custom-tokens-deployed-across-multiple-chains-into-interchain-tokens/) tutorial. diff --git a/src/content/docs/dev/send-tokens/interchain-tokens/interchain-token-executable.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/interchain-token-executable.mdx new file mode 100644 index 000000000..de97f4619 --- /dev/null +++ b/src/content/docs/dev/send-tokens/interchain-tokens/interchain-token-executable.mdx @@ -0,0 +1,127 @@ +# Interchain Token Service Executable + +import { Callout } from "/src/components/callout"; + +You can use the [Axelar Interchain Token Service (ITS)](https://github.com/axelarnetwork/interchain-token-service/tree/main) to create a new Interchain Token or integrate an existing ERC-20 token to ITS to give your token bridging functionality. ITS also allows you to send custom messages when making a cross-chain transfer for an ITS token, enabling you to execute specific logic on the destination chain. + +## Setting Up an Executable Token + +If you want your token transfers to trigger custom logic on the destination chain, the destination contract must implement the [InterchainTokenExecutable](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/executable/InterchainTokenExecutable.sol) interface. + +Once your token has been integrated with ITS, you can use the executable functionality to send messages along with your cross-chain token transfer. + +## Send Token + Message from Source Chain + +To send a token transfer with a custom message, use the `callContractWithInterchainToken()` function from the Interchain Token Service contract. +You should provide the `tokenId`, `destinationChain`, `destinationAddress`, `amount`, and `data` as parameters. + +```solidity +/** + * @notice Initiates an interchain transfer of tokens through the token service. + * @param tokenId The token ID. + * @param destinationChain The destination chain. + * @param destinationAddress The destination address (bytes format). + * @param amount The amount of tokens to transfer. + * @param data Metadata for the cross-chain transfer. To execute a contract on the destination, + * format as bytes.concat(bytes4(0), yourCustomPayload). + */ +function callContractWithInterchainToken( + bytes32 tokenId, + string calldata destinationChain, + bytes calldata destinationAddress, + uint256 amount, + bytes calldata data +) external payable +``` + + + - The `destinationAddress` should be an address encoded as bytes. Use the + [toBytes()](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/blob/main/contracts/libs/AddressBytes.sol#L30) + method to accomplish this on-chain. + - To execute code on the destination + chain, the `metadata` parameter should be formatted as: + `bytes.concat(bytes4(0), yourCustomPayload)`. The leading `bytes4(0)` signals + this is an executable transfer. + + +## Execute on Destination Chain + +When the tokens arrive on the destination chain, if the destination address implements the `InterchainTokenExecutable` interface, the system will: + +1. Transfer the tokens to your contract. +1. Call the `_executeWithInterchainToken()` function on your contract. + +Your contract needs to implement the `_executeWithInterchainToken()` function that contains your custom logic: + +```solidity +/** + * @notice Internal function containing the logic to be executed with interchain token transfer. + * derived contracts must implement @dev Logic. + * @param commandId The unique message id. + * @param sourceChain The source chain of the token transfer. + * @param sourceAddress The source address of the token transfer. + * @param data The custom data payload you included in the metadata. + * @param tokenId The token ID. + * @param token The token address. + * @param amount The amount of tokens being transferred. + */ +function _executeWithInterchainToken( + bytes32 commandId, + string calldata sourceChain, + bytes calldata sourceAddress, + bytes calldata data, + bytes32 tokenId, + address token, + uint256 amount +) internal virtual; +``` + +The transferred amount is accessible in the `amount` parameter, and any additional data you included is available in the `data` parameter. + +## Implementation Example + +Here's a simple example of a contract that implements the InterchainTokenExecutable interface: + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@axelar-network/interchain-token-service/contracts/executable/InterchainTokenExecutable.sol"; + +contract MyDestinationContract is InterchainTokenExecutable { + // Event to log received transfers + event TokensReceived( + string sourceChain, + bytes sourceAddress, + uint256 amount, + bytes data + ); + + /** + * @notice Handle incoming token transfers with custom logic + */ + function _executeWithInterchainToken( + bytes32 commandId, + string calldata sourceChain, + bytes calldata sourceAddress, + bytes calldata data, + bytes32 tokenId, + address token, + uint256 amount + ) internal override { + // Access the transferred amount directly from the amount parameter + + // Decode any custom data you sent + // Example: (uint256 value) = abi.decode(data, (uint256)); + + // Your custom logic here + + // Emit an event for logging + emit TokensReceived(sourceChain, sourceAddress, amount, data); + } +} +``` + +## What’s next + +To find more examples of how to utilize the Interchain Token Service and test the Interchain Token Service Executable, please refer to the [its executable example](https://github.com/axelarnetwork/axelar-examples/blob/main/examples/evm/its-executable/README.md) on GitHub. diff --git a/src/content/docs/dev/send-tokens/interchain-tokens/interchain-transfer.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/interchain-transfer.mdx new file mode 100644 index 000000000..3401c754f --- /dev/null +++ b/src/content/docs/dev/send-tokens/interchain-tokens/interchain-transfer.mdx @@ -0,0 +1,92 @@ +import { Callout } from "/src/components/callout"; + +# Interchain Transfer + +Tokens connected to the Interchain Token Service (ITS) can be transferred between chains by using the `interchainTransfer()` function. The `interchainTransfer()` function is [defined](https://github.com/axelarnetwork/interchain-token-service/blob/releases/2.1.x/contracts/InterchainTokenService.sol#L559) on the ITS edge contract. In addition to existing on the ITS contract itself, tokens inheriting from the [Interchain Token Standard](https://github.com/axelarnetwork/interchain-token-service/blob/releases/2.1.x/contracts/interchain-token/InterchainTokenStandard.sol) will also have access to the `interchainTransfer()` function, so you can send an interchain transfer directly from the token contract itself. + +The `interchainTransfer()` function takes the following parameters + +1. `tokenId`: The [interchainTokenId](/dev/send-tokens/interchain-tokens/intro/#interchain-token-id) of the token being sent. +1. `destinationChain`: The name of the chain the token is being sent to. +1. `destinationAddress`: The receiving address of the cross-chain transfer. +1. `amount`: The amount of tokens being sent. + +It is defined as follows: + +```solidity +function interchainTransfer( + bytes32 tokenId, + string calldata destinationChain, + bytes calldata destinationAddress, + uint256 amount +) external payable{} +``` + +## What It Does + +When triggered, ITS via the [Token Handler](/dev/send-tokens/interchain-tokens/intro/#token-handler) Pulls the tokens from `msg.sender` using [takeToken()](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/TokenHandler.sol#L67) function. For mint/burn managers, this will involve burning the token on the source whereas for lock/unlock managers, this will involve escrows/locks on the source via the `safeTransferFrom()` function. The `takeToken()` function will also decrement the [flow limit](/dev/send-tokens/interchain-tokens/token-manager/#flow-limits) for the token being moved out of that blockchain. + +With the token now either burnt or held by the Token Manager ITS will then send a cross-chain [GMP message](/dev/general-message-passing/overview/) with a payload containing the following: + +```solidity +bytes memory payload = abi.encode( + MESSAGE_TYPE_INTERCHAIN_TRANSFER, //message type identifier + tokenId, + sourceAddress.toBytes(), + destinationAddress, + amount, + data +); +``` + +Once the GMP message arrives to the destination chain, ITS will then call the [giveToken()](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/TokenHandler.sol#L33) function to either `mint` or `unlock` tokens to for the end receiver (depending on which Token Manager Type is used). The `giveToken()` function will also increment the [flow limit](/dev/send-tokens/interchain-tokens/token-manager/#flow-limits) for the token being moved into that blockchain. + +You can see a live example of an interchain transfer being called [here on the Axelarscan Explorer](https://testnet.axelarscan.io/gmp/0xbb7d242ead9fda8ce8d20654fb1c404c611c04bbb198fe15668a17272862e95b-3). + +## Diagram + +Refer to the diagram below to see how the `interchainTransfer()` function works. + + + + + Your browser does not support SVG + + + + +## Error Handling + +Common errors and their meanings: + +| Error | Description | Resolution | +|-------|-------------|------------| +| `NotToken` | Caller is not the expected token | Only the token contract can call certain functions | +| `ZeroAmount` | Transfer amount is 0 | Provide a non-zero amount | +| `EmptyDestinationAddress` | No destination address provided | Include valid destination address | +| `FlowLimitExceeded` | Transfer exceeds flow limit | Wait for next epoch or reduce amount | +| `UntrustedChain` | Destination chain not trusted | Contact operators to add chain | +| `Paused` | Service is paused | Wait for service to be unpaused | +| `TakeTokenFailed` | Failed to take tokens from sender | Ensure sufficient balance and approval | +| `GiveTokenFailed` | Failed to give tokens to recipient | Check token manager configuration | + +## Best Practices + +1. **Always verify destination chain names** - Use exact chain names as registered in ITS +2. **Encode addresses correctly** - Follow chain-specific encoding requirements +3. **Provide sufficient gas** - Calculate gas needs based on destination chain costs +4. **Monitor flow limits** - Check current flow before large transfers +5. **Handle failures gracefully** - Implement retry logic for failed transfers +6. **Test on testnet first** - Verify complete flow before mainnet deployment +7. **Use event monitoring** - Track `InterchainTransfer` events for confirmation +8. **Implement receive handlers** - For contract calls, ensure proper token handling diff --git a/src/content/docs/dev/send-tokens/interchain-tokens/intro.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/intro.mdx new file mode 100644 index 000000000..9a5376d97 --- /dev/null +++ b/src/content/docs/dev/send-tokens/interchain-tokens/intro.mdx @@ -0,0 +1,73 @@ +import { Callout } from "../../../../../components/callout"; + +import InterchainTokenIntro from "../../../../../components/interchain-token-intro.astro"; + + + +The [Token Whitelisting for Squid Router form](https://github.com/axelarnetwork/axelar-configs/blob/main/cli/wizard/commands/list-squid-token/README.md) is now live! Download the [axelar-configs](https://github.com/axelarnetwork/axelar-configs) repo, install dependencies, and `npm run wizard` on the command line to access +the interactive form through the wizard. + + + +
    + +# Interchain Token Service + +Web3 has gone cross-chain, with assets bridging between blockchains and +developers deploying applications on multiple chains. However, connecting tokens +that are deployed on multiple chains has always been a cumbersome process. + +Interchain Tokens go beyond legacy bridges. The [Interchain Token Service (ITS)](https://axelar.network/its) allows ERC-20 tokens to be available on multiple blockchains. It preserves native +token qualities while allowing you to easily manage token features and token supply. +Interchain Tokens run on [open-source code](https://github.com/axelarnetwork/interchain-token-service/tree/main) via smart contracts on a public blockchain secured by a dynamic validator set. +With ITS, you can have multiple blockchains with canonical versions of your token +that all share a single EVM address. + +You can either create new [Interchain Tokens](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interchain-token/InterchainToken.sol#L19) from scratch or update tokens that already exist on a [supported blockchain](/resources/contract-addresses/mainnet/). + +### Key ITS Contract addresses + +**Interchain Token Service:** [0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C](https://etherscan.io/address/0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C) +**Interchain Token Factory:** [0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66](https://etherscan.io/address/0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66) + +## Key Concepts + +### Interchain Token Service + +The edge contract deployed on external blockchains. This contract is responsible for facilitating interchain token transfers. It (mostly) does not handle tokens, but is responsible for the messaging that needs to occur for interchain transfers to happen. There are different variations depending on which blockchain is deployed on. + +- [Solidity Implementation](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol) +- [Move Implementation for Sui](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/interchain_token_service.move) +- [Rust Implementation for Stellar](https://github.com/axelarnetwork/axelar-amplifier-stellar/blob/main/contracts/stellar-interchain-token/src/contract.rs) + +### Interchain Token Service Factory + +An additional [contract](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenFactory.sol) deployed on each chain connected to ITS. This contract interact with the main Interchain Token Service contract. It is responsible for deploying new interchain tokens and managing their token managers. + +### Interchain Token Service Hub + +ITS hub is a central routing contract on the Axelar network itself that coordinates token operations across chains. The hub allows for a simpler centralized state for interlinked tokens compared to purely pairwise connections between ITS edged contracts. Further reading can be done [here](https://docs.axelar.dev/dev/amplifier/its-hub/introduction/) + +### Interchain Token Service Portal + +A [no-code portal](https://interchain.axelar.dev/) to be able to quick deploy new tokens and register existing tokens to ITS + +### Token Handler + +A separate [contract](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/TokenHandler.sol) used by ITS to interact with tokens it is moving between chains. This will be the contract that is actually existing your token's `mint`, `burn` functions. + +### Token Manager + +A contract that facilitates integration between your token and ITS. Each token integration on a given chain will have its own unique token manager. It is responsible for managing tokens, such as setting locking token balances, or setting flow limits, for interchain transfers. Further reading can be done [here](https://docs.axelar.dev/dev/send-tokens/interchain-tokens/token-manager/) + +### Interchain Token ID + +An `interchainTokenId` is how ITS uniquely registers a given token integration between chains. The id must match across all chains so that when a token is moved out of one chain it is moved into the token with corresponding `interchainTokenId` on the destination chain. This id is calculated by running `keccak256(abi.encode(PREFIX_INTERCHAIN_TOKEN_ID, sender, salt))`. The unique sender address combined with salt ensures that the id is deterministic and collision resistant. + +### Interchain Token + +A token deployed by ITS itself. Whereas a custom token deployed by an individual developer that gets integrated to ITS, an interchain token is pre-written [contract](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interchain-token/InterchainToken.sol) that ITS deploys. This is the token that is deployed by the ITS portal. + +## Guides + + diff --git a/src/content/docs/dev/send-tokens/interchain-tokens/minter-operator-roles.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/minter-operator-roles.mdx new file mode 100644 index 000000000..ed9302c3f --- /dev/null +++ b/src/content/docs/dev/send-tokens/interchain-tokens/minter-operator-roles.mdx @@ -0,0 +1,129 @@ +# Minter and Operator Roles in Interchain Token Service + +The [Interchain Token Service (ITS)](https://github.com/axelarnetwork/interchain-token-service/tree/main) uses two key roles to manage permissions and control: **Minter** and **Operator**. These roles implement access control mechanisms that determine who can perform specific actions on tokens and token managers. + +## Minter Role + +The Minter role controls who can create (mint) and destroy (burn) tokens. This role is critical for managing the token supply across different chains. + +Based on the [`IMinter`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interfaces/IMinter.sol) interface and the contract implementations, a Minter can: + +1. **Mint new tokens**: Create new tokens and assign them to any address. +2. **Burn tokens**: Destroy tokens from circulation. +3. **Transfer mintership**: Transfer the minter role to another address. +4. **Propose mintership change**: Propose a new minter (two-step transfer process). + +### Implementation Details + +When a new Interchain Token is deployed: + +- ITS is initially set as the minter for Native Interchain Tokens. +- The token manager needs to have the minter role in order to mint tokens when receiving them from another chain and burn tokens when sending them to another chain. + +There are two primary ways mintership is transferred to the token manager: + +1. Automatic Migration: The [`TokenHandler.sol`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/TokenHandler.sol) contract contains an automatic migration mechanism that transfers mintership from ITS to the token manager when tokens are processed: + +```solidity +function _migrateToken(address tokenManager, address tokenAddress, uint256 tokenManagerType) internal { + if (tokenManagerType == uint256(TokenManagerType.NATIVE_INTERCHAIN_TOKEN) && IMinter(tokenAddress).isMinter(address(this))) { + IMinter(tokenAddress).transferMintership(tokenManager); + } +} +``` + +2. Manual Migration: Developers can also explicitly migrate mintership by calling the migrateInterchainToken function on the InterchainTokenService contract: + +```solidityC +function migrateInterchainToken(bytes32 tokenId) external onlyOwner { + ITokenManager tokenManager_ = deployedTokenManager(tokenId); + address tokenAddress = tokenManager_.tokenAddress(); + IMinter(tokenAddress).transferMintership(address(tokenManager_)); +} +``` + +#### Why Token Managers Need Minter Rights: + +For the interchain token system to work properly, token managers need minting and burning capabilities because: + +- When tokens are sent from Chain A to Chain B, tokens are burned (or locked) on Chain A and must be minted on Chain B. +- Without minter rights, the token manager cannot mint the corresponding tokens on the destination chain. +- Having the token manager as the minter creates a trustless system where ITS doesn't need to maintain privileged access to tokens. +- It allows the token manager to directly control token supply according to cross-chain message validation. + +### Token Manager Integration + +For [`NATIVE_INTERCHAIN_TOKEN`](https://github.com/axelarnetwork/interchain-token-service/blob/4ba40851ee13cf98077e38b49f2c106d09a2f67c/contracts/interfaces/ITokenManagerType.sol#L11) and [`MINT_BURN`](https://github.com/axelarnetwork/interchain-token-service/blob/4ba40851ee13cf98077e38b49f2c106d09a2f67c/contracts/interfaces/ITokenManagerType.sol#L15) token manager types, the minter role allows the token manager to mint tokens upon receiving them from another chain and burn tokens when sending them to another chain. +Its important to note that token manager is required to be whitelisted for these manager types to be used otherwise the manager will not be able to mint/burn. + +## Operator Role + +The Operator role controls who can manage the token manager's configuration and operations. This role has administrative powers over how tokens are handled during cross-chain transfers. + +Based on the [`IOperator`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interfaces/IOperator.sol) interface and contract implementations, an Operator can: + +1. **Set flow limits**: Control the rate at which tokens can flow into or out of a chain. +2. **Approve service**: Grant permission to the ITS to operate on behalf of the token manager. +3. **Transfer operatorship**: Transfer the operator role to another address. +4. **Propose operatorship change**: Propose a new operator (two-step transfer process). + +### Implementation Details + +ITS operators are set during token manager deployment: + +```solidity +// From InterchainTokenFactory.sol + +bytes memory linkParams = ''; +if (operator != address(0)) { + linkParams = operator.toBytes(); +} +``` + +The `linkParams` is used to specify the operator address for the token manager. + +## Role Transitions and Ownership + +Both roles feature a secure two-step transfer process: + +1. The current role holder (operator or minter) proposes a new address (`proposeOperatorship` or `proposeMintership`). +2. The proposed address must accept the role (`acceptOperatorship` or `acceptMintership`). + +This prevents accidental transfers to invalid addresses. + +## Practical Applications + +### Minter Role Usage + +1. **Token Supply Management**: The minter can control the total supply by minting or burning tokens. +2. **Cross-Chain Transfers**: For mint/burn token managers, the minter mints tokens on the destination chain equivalent to what was burned on the source chain. +3. **Token Migration**: The [`migrateInterchainToken`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol) function in ITS shows how mintership is transferred to optimize token operations. + +### Operator Role Usage + +1. **Flow Control**: Operators can set _flow limits_ for how many tokens can flow in or out of a chain in a given period. +3. **Service Authorization**: Operators can authorize ITS to interact with token managers. + +## Role Interaction in ITS + +- The ITS contract initially holds the minter role for native interchain tokens. +- The token manager typically becomes the minter to handle cross-chain transfers. +- Custom operators can be specified for token managers. +- When deploying tokens, the factory allows specifying both minter and operator roles: + +```solidity +// From InterchainTokenFactory.sol + +token.transferMintership(minter); +tokenManager.removeFlowLimiter(address(this)); +tokenManager.addFlowLimiter(minter); +tokenManager.transferOperatorship(minter); +``` + +## Security Considerations + +1. **Role Separation**: Minter and Operator roles can be held by different entities for better security. +2. **Flow Limits**: Operators can set flow limits to prevent large-scale attacks. +3. **Careful Role Transfer**: The two-step transfer process mitigates the risk of losing control. + +The Minter and Operator roles form the foundation of ITS's permission system. Developers can build secure and efficient cross-chain token solutions by understanding how these roles function and interact. \ No newline at end of file diff --git a/src/content/docs/dev/send-tokens/interchain-tokens/no-code.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/no-code.mdx new file mode 100644 index 000000000..00ccdd078 --- /dev/null +++ b/src/content/docs/dev/send-tokens/interchain-tokens/no-code.mdx @@ -0,0 +1,41 @@ + + The [Token Whitelisting for Squid Router + form](https://github.com/axelarnetwork/axelar-configs/blob/main/cli/wizard/commands/list-squid-token/README.md) + is now live! Download the + [`axelar-configs`](https://github.com/axelarnetwork/axelar-configs) repo, + install dependencies, and `npm run wizard` on the command line to access the + interactive form through the wizard. + + +# No Code Setup + +import { Callout } from "/src/components/callout"; + +The quickest way to begin exploring and deploying [interchain tokens](/dev/send-tokens/glossary/#interchain-token) is with Axelar's no code [frontend portal](https://interchain.axelar.dev/). (Click [here](https://testnet.interchain.axelar.dev/) for testnet). + +The portal offers two main paths. You can either deploy a fresh new token on multiple chains at once or you can connect a pre-existing token to ITS. Once integrated, you can then deploy additional interchain tokens on other blockchains to be bridgeable with your token that you had previously integrated. + +## Deploy New Token + +To deploy a new token: + +1. Connect your wallet. +1. Select a source network where you have funds available. +1. Click **Deploy a new Interchain Token**. +1. Add your new token’s name, symbol, decimals, and amount to mint. You can also mark the token as `mintable`, which will allow the token minter to mint new tokens. +1. Select additional chains for your token to be available on. You can optionally add the token amount to mint on each selected chain. + +If your connected wallet has enough funds, your new token will become available on each chain you selected. It will follow the [Interchain Token Standard](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interfaces/IInterchainTokenStandard.sol), so users can call the [`interchainTransfer()`](/dev/send-tokens/interchain-tokens/interchain-transfer/) method on the token itself to transfer between blockchains. + +## Connect Existing Token + +1. Connect your wallet. +1. Select a source network where you have funds available. +1. Paste in the address of your token that you want to connect to ITS +1. Click the **Register interchain token** button. +1. Select additional chains for your token's to be available on. +1. This will register a [lock/unlock](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interfaces/ITokenManagerType.sol#L13) Token Manager for your custom token on the home chain and a [native interchain token](https://github.com/axelarnetwork/interchain-token-service/blob/7df851d8a4ec4df819961d704bf3067ee8d37521/contracts/interfaces/ITokenManagerType.sol#L11) on any of the remote chains you register your token on. + +## Tutorial + +For detailed steps on using the portal to create a new token, check out the [How to Create an Interchain Token with Axelar in 4 Steps](https://axelar.network/blog/how-to-create-an-interchain-token-with-axelar-in-4-steps) tutorial. diff --git a/src/content/docs/dev/send-tokens/interchain-tokens/register-existing-token.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/register-existing-token.mdx new file mode 100644 index 000000000..a8ddb2bb9 --- /dev/null +++ b/src/content/docs/dev/send-tokens/interchain-tokens/register-existing-token.mdx @@ -0,0 +1,67 @@ +import { Callout } from "/src/components/callout"; + +# Register Existing Token + +If you own an ERC-20 token on a single chain and want a wrapped, bridgeable version on other chains, you can register it as a [Canonical Interchain Token](/dev/send-tokens/glossary/#canonical-interchain-token) using the [Interchain Token Factory contract](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenFactory.sol). Each token can only be registered once as a canonical token on its "home" chain. + +You can register your existing token directly via the contract or use the [ITS Portal](/dev/send-tokens/interchain-tokens/no-code/) no-code solution. Take a look at the diagram below to understand the process of registering an existing token as a Canonical Interchain Token. + + + + Your browser does not support SVG + + +## Register Your Token as a Canonical Token Using the Interchain Token Factory + +Use the [registerCanonicalInterchainToken](https://github.com/axelarnetwork/interchain-token-service/blob/94677f1072da127a0ee7ff5ab6784dcfe11789e8/contracts/InterchainTokenFactory.sol#L402) function to register your token. + +```solidity +function registerCanonicalInterchainToken( + address tokenAddress // address of your token +) external payable returns (bytes32 tokenId) {} +``` + +This function deploys a [Lock/Unlock Token Manager](/dev/send-tokens/glossary/#lockunlock) on the source chain, connects it to ITS upon deployment, and returns a unique token ID. Triggering the `registerCanonicalInterchainToken()` function initiates the process of registering your custom token with a Lock/Unlock token manager type on your token's _home chain_. + +Once your token is registered on the home chain, you can call the `deployRemoteCanonicalInterchainToken()` function. This will deploy an Interchain Token on a different blockchain that connects to your canonical token on the home chain. + +## Deploy a Remote Canonical Interchain Token + +Use the [deployRemoteCanonicalInterchainToken](https://github.com/axelarnetwork/interchain-token-service/blob/94677f1072da127a0ee7ff5ab6784dcfe11789e8/contracts/InterchainTokenFactory.sol#L450) function to deploy the token on a remote chain as a cross-chain transaction: + +```solidity +function deployRemoteCanonicalInterchainToken( + address originalTokenAddress, // original token address + string calldata destinationChain, // destination chain name + uint256 gasValue // gas value +) public payable returns (bytes32 tokenId) {}; +``` + +This function deploys a token connected to your registered token on the home chain, making it bridgeable to the destination chain, and returns a token ID. + + + **NOTE:** The security of your token is only as strong as the security of the + chains with which it integrates. When deploying an interchain token, ensure + that all target chains are trustworthy. + + + +## What's Next + +You can initiate an interchain transfer from your source chain to a destination chain by using the [interchainTransfer()](/dev/send-tokens/interchain-tokens/interchain-transfer/) method on the [ITS contract](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol). + +For further examples utilizing the Interchain Token Service, check out the [Axelar Examples](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm) repository on GitHub. There, you will find an example implementation titled [its-canonical-token](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-canonical-token), which demonstrates how to deploy canonical Interchain Tokens and perform cross-chain transfers. + +## Tutorial + +For a step-by-step guide on registering an existing token, check out the [Programmatically Create a Canonical Interchain Token Using the Interchain Token Service](/dev/send-tokens/interchain-tokens/developer-guides/programmatically-create-a-canonical-token/) tutorial. diff --git a/src/content/docs/dev/send-tokens/interchain-tokens/token-manager.mdx b/src/content/docs/dev/send-tokens/interchain-tokens/token-manager.mdx new file mode 100644 index 000000000..6822067f3 --- /dev/null +++ b/src/content/docs/dev/send-tokens/interchain-tokens/token-manager.mdx @@ -0,0 +1,58 @@ +# Token Managers + +[Token Managers](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/token-manager/TokenManager.sol#L22) are contracts that facilitate connection between your interchain token to the [Interchain Token Service (ITS)](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol). For certain manager types, such as `mint/burn` Token Manager, the manager is the `msg.sender` of the transaction being executed on the destination chain for the token when it is bridged in. + +## Token Manager Types + +There are different [types](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interfaces/ITokenManagerType.sol#L10) of token managers available for developers to offer different types of integrations to ITS. These are; `nativeInterchain`, `mintBurnFrom`, `lockUnlock`, `lockUnlockFee`, and `mintBurn`. + +Each of these types correspond to an `enum` value. When integrating with ITS, developers must pass in the [corresponding value](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/interfaces/ITokenManagerType.sol) for their desired token manager type. + +- `NativeInterchainToken`: `0` +- `Mint/BurnFrom`: `1` +- `Lock/Unlock`: `2` +- `Lock/UnlockFee`: `3` +- `Mint/Burn`: `4` + +### Native Interchain Token + +For tokens that are deployed [directly from ITS itself](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenFactory.sol#L133) they use a native interchain token manager. Tokens that are deployed via the [frontend portal](/dev/send-tokens/interchain-tokens/no-code/) also use this type of manager. + +For more details checkout this [native interchain token example](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-interchain-token). + +### Mint/Burn From + +The `mint/burnFrom` token manager type, allows tokens to be burnt on the source chain when they are transferred out of that chain and minted when they are transferred back into the source chain. As the name suggests when the token is burnt on the source chain the manager is looking to trigger the `burnFrom()` function on the token rather than the `burn()` function. + +The main implication is that ITS must be approved to call `burnFrom()` by the token. The manager must be granted the role to be able to `mint()` the token on the destination chain. + +For more details checkout this [Mint/BurnFrom example](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-mint-burn-from). + +### Lock/Unlock + +Token integrations using the `lock/unlock` token manager will have their token locked with their token's manager. Only a single `lock/unlock` manager can exist for a token as having multiple `lock/unlock` managers would make it substantially more difficult to manage liquidity across many different blockchains. These token managers are best used in the case where a token has a "home chain" where a token can be locked. On the remote chains users can then use a wrapped version of that token which derives it's value from a locked token back on the home chain. + +Canonical tokens for example [deployed via ITS](https://github.com/axelarnetwork/interchain-token-service/blob/0dad750abe866ec8e77ea43a2d1563335d14bd32/contracts/InterchainTokenFactory.sol#L402) are examples where a `lock/unlock` token manager type is useful. When bridging tokens out of the destination chain (locking them at the manager) ITS [will call](https://github.com/axelarnetwork/interchain-token-service/blob/0dad750abe866ec8e77ea43a2d1563335d14bd32/contracts/TokenHandler.sol#L102) the `transferTokenFrom()` function, which in turn will call the `safeTranferFrom()` function. For this transaction to be successful, ITS must be `approved()` to call the `safeTransferFrom()` function, otherwise the call will revert. + +For more details checkout this [Canonical token example](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-canonical-token). Canonical tokens [use](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenFactory.sol#L387) `lock/unlock` token managers on their "home" chain. + +### Lock/Unlock Fee + +This manager type is similar to the `lock/unlock` token manager, where the manager locks the token on it's "home chain" when it is bridged out and unlocks it when it is bridged back. The key feature with this token manager is that you have the option to set a fee that will be [deducted](https://github.com/axelarnetwork/interchain-token-service/blob/0dad750abe866ec8e77ea43a2d1563335d14bd32/contracts/TokenHandler.sol#L148) when executing an `interchainTransfer()`. + +For more details checkout this [Lock/UnlockFee example](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-lock-unlock-fee). + +### Mint/Burn + +The `mint/burn` token manager type is used when your token is native (all chains are considered a "home" chain) and allows you to `burn()` tokens from the source chain and `mint()` tokens on the destination chain. The manager will need to be granted the role to be able to execute the `mint()` and `burn()` function on the token. + +For more details checkout this [Mint/Burn example](https://github.com/axelarnetwork/axelar-examples/tree/main/examples/evm/its-custom-token). + +## Flow Limits + +Token Managers handle the flow limits for a token's ITS integration. A `flowLimit` is a set amount that controls the amount in which a token can be sent in/out of a given blockchain. This can have a variety of different usecases including for security emergencies on a given chain where you want to restrict the flow of your token for that particular blockchain. + +For each cross-chain transaction that goes through ITS the `flowIn` & `flowAmount` amount are increased to track the [inflow](https://github.com/axelarnetwork/interchain-token-service/blob/0dad750abe866ec8e77ea43a2d1563335d14bd32/contracts/TokenHandler.sol#L33) and [outflow](https://github.com/axelarnetwork/interchain-token-service/blob/0dad750abe866ec8e77ea43a2d1563335d14bd32/contracts/TokenHandler.sol#L67) of tokens. To [set](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/token-manager/TokenManager.sol#L167) the `flowLimit` of a given token the caller must be a registered [flowLimiter](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/utils/RolesConstants.sol#L13). + +For more information on `flowLimit`, see [Flow Limit in Interchain Token Service +](/dev/send-tokens/interchain-tokens/flow-limit/). diff --git a/src/content/docs/dev/send-tokens/introduction.mdx b/src/content/docs/dev/send-tokens/introduction.mdx new file mode 100644 index 000000000..ab2356aa3 --- /dev/null +++ b/src/content/docs/dev/send-tokens/introduction.mdx @@ -0,0 +1,10 @@ +# Overview +Axelar offers cross-chain ERC20 token transfer in two main forms. Gateway tokens and Interchain Token Service based tokens. For general users looking to integrate their own tokens it is recommmended to use ITS. For Dapps looking to make use of more widely recognized assets such as `axlUSDC` or `axlETH`, Gateway tokens serve as a simple solution. + +## Gateway Tokens +Gateway tokens are a collection of well known ERC20 tokens that have been wrapped by the Interop Labs team to provide easy cross-chain liquidity between blockchains. The full list of available Gateway tokens can be found [here](/resources/contract-addresses/mainnet/#assets). +More on how to use/send Gateway tokens can be found [here](/dev/general-message-passing/gmp-tokens-with-messages/) + +## Interchain Token Service Tokens (ITS) +Axelar also offers the ability to make use of ITS. This is a permisionless service where any user (both technical and non technical!) can integrate existing tokens to provide cross-chain functionality for those tokens. Users can also create fresh new ERC20s with cross-chain functionality out of the box. +More details on ITS can be found [here](/dev/send-tokens/interchain-tokens/intro/) diff --git a/src/content/docs/dev/send-tokens/roadmap.mdx b/src/content/docs/dev/send-tokens/roadmap.mdx new file mode 100644 index 000000000..5fb08b767 --- /dev/null +++ b/src/content/docs/dev/send-tokens/roadmap.mdx @@ -0,0 +1,25 @@ +# Interchain Token Service Roadmap + +## Background + +The [Interchain Token Service (ITS)](/dev/send-tokens/introduction) was released to make custom ERC-20 token transfers easier across different blockchains. Unlike bridged tokens, Interchain Tokens are sent between chains via [General Message Passing (GMP)](/dev/general-message-passing/overview) rather than minted on the Axelar chain itself. + +The [`InterchainTokenService`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/InterchainTokenService.sol) contract deploys a [`TokenManager`](https://github.com/axelarnetwork/interchain-token-service/blob/main/contracts/token-manager/TokenManager.sol) to handle multichain token operations such as minting, burning, and locking for every chain that a token is registered to. Tokens are tracked through a unique `interchainTokenId` that persists across these chains. + +### Types of Interchain Tokens + +There are three types of Interchain Token integrations: + +- [Standardized Interchain Tokens](/dev/send-tokens/glossary#standardized-token) — ERC-20 tokens that are deployed through the Interchain Token Service from a contract that implements the `IInterchainToken` and `IStandardizedToken` interfaces. They have the same address on all chains, with native bridging and no lock/unlock functionality. +- [Canonical Interchain Tokens](/dev/send-tokens/glossary#canonical-interchain-token) — Tokens originally deployed on one chain that now have interchain capabilities through ITS. ITS wraps the token on the original chain to give it these capabilities, then duplicates the wrapped original on all other chains. +- [Custom tokens](/dev/send-tokens/glossary#custom-token) — Interchain Tokens that are designed to serve specific use cases within the blockchain ecosystem. They are deployed with custom functionality along with the required minting and burning `TokenManager` functions. + +## The future of ITS + +### Migration to governance + +The `InterchainTokenService` contract will soon be managed through [EVM contract governance](/learn/evm-governance). + +### ITS Hub + +The new [Interchain Amplifier](/dev/amplifier/introduction) provide a major overhaul opportunity for the Interchain Token Service. Interop Labs is developing a new **ITS Hub** that will serve as the homebase for the Interchain Token Service on the Axelar blockchain. All token transfers between ITS-enabled chains will be routed through this hub. The ITS hub extends ITS capabilities such as tracking balances and flow limits to all chains integrating with the Interchain Amplifier, including ones not built with smart contracts. diff --git a/src/content/docs/dev/send-tokens/stellar/deploy-new-token.mdx b/src/content/docs/dev/send-tokens/stellar/deploy-new-token.mdx new file mode 100644 index 000000000..7341746bf --- /dev/null +++ b/src/content/docs/dev/send-tokens/stellar/deploy-new-token.mdx @@ -0,0 +1,666 @@ +import { Callout } from "../../../../../components/callout"; + +# Deploy and Transfer a New Token from Stellar to EVM + +This guide demonstrates, step by step, how to use Axelar's Interchain Token Service (ITS) to create and transfer tokens between Stellar and other blockchains. + +By the end, you will be able to: + +1. Deploy a new token on Stellar using Axelar ITS. +1. Deploy that token representation on an EVM chain (Avalanche Fuji testnet). +1. Transfer tokens seamlessly between Stellar and the EVM chain. + +## Prerequisites + +Before starting, make sure you have the following ready: + +- [Rust](https://www.rust-lang.org/tools/install) with wasm32 target. +- [Stellar CLI](https://github.com/stellar/stellar-cli). +- A Stellar testnet account with funds. +- A browser wallet like [MetaMask](https://metamask.io/) configured to connect to the Avalanche Fuji testnet, or a similar wallet like [Rabby](https://rabby.io/) +- Some Avalanche Fuji testnet AVAX (from the [Avalanche faucet](https://faucet.avax.network/)). + +## Part 1: Understanding the Interchain Token Service + +The [Interchain Token Service (ITS)](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-interchain-token-service) is a protocol that allows tokens to move freely between different blockchains. It provides functionality to: + +1. Create tokens that exist on multiple blockchains simultaneously. +2. Connect existing tokens on one blockchain to other blockchains. +3. Transfer tokens securely between blockchains. + +Unlike the single message-passing pattern of GMP, the ITS involves several components: + +- [**Interchain Token Service**](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-interchain-token-service): The main contract that coordinates token operations. +- [**Token Manager**](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-token-manager): Handles token operations (minting, burning, locking) on a specific chain. +- [**Interchain Token**](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-interchain-token): The actual token contract that implements the Stellar token interface. +- [**Gateway**](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-axelar-gateway): Routes messages between blockchains. +- [**Gas Service**](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-axelar-gas-service): Handles payments for cross-chain execution. + + + A token created through ITS will have the same token ID across all blockchains + + +## Part 2: Set up your Stellar ITS project + +Let's build a Stellar smart contract project that integrates with ITS to create and transfer new tokens. + +### Step 1. Initialize a new project + +Start by creating a new Stellar contract project and the directory: + +```bash +stellar contract init axelar-its-app +cd axelar-its-app +``` + +This command scaffolds a basic Stellar contract project for you. + +> Tip: We'll simplify the default structure as we progress, focusing on the files needed for the ITS integration. + +### Step 2: Simplify your project structure + +To keep things neat, remove unnecessary folders and consolidate your source files. + +Move the `src` folder to the root of your project directory if it isn't there already +Delete any example or template contract folders, such as `contracts/hello-world` + +After cleanup, your folder should look like this: + +```bash +axelar-its-app +├── src +│ ├── lib.rs +├── .gitignore +├── Cargo.toml +├── README.md +``` + +### Step 3. Configure your dependencies in Cargo.toml + +Open `Cargo.toml` in your project root and update it to include dependencies needed for Axelar ITS and Stellar development. + +Here's a sample you can copy: + +```toml +[package] +name = "axelar-its-app" +version = "0.0.0" +edition = "2021" +publish = false + +[lib] +crate-type = ["cdylib"] +doctest = false + +[dependencies] +soroban-sdk = "22.0.0" +soroban-token-sdk = "22.0.0" +stellar-axelar-gateway = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", branch = "main", features = ["library"] } +stellar-axelar-gas-service = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", branch = "main", features = ["library"] } +stellar-interchain-token-service = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", branch = "main", features = ["library"] } +stellar-interchain-token = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", branch = "main", features = ["library"] } +stellar-token-manager = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", branch = "main", features = ["library"] } +stellar-axelar-std = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", branch = "main" } + +[dev-dependencies] +soroban-sdk = { version = "22.0.0", features = ["testutils"] } + +[profile.release] +opt-level = "z" +overflow-checks = true +debug = 0 +strip = "symbols" +debug-assertions = false +panic = "abort" +codegen-units = 1 +lto = true + +[profile.release-with-logs] +inherits = "release" +debug-assertions = true +``` + +This configuration pulls in Axelar's Stellar libraries from GitHub and sets up your Rust build profiles for optimal WASM compilation. + +## Part 3: Implementing the Interchain Token Service (ITS) + +Now that the project structure and dependencies are ready, it's time to implement the contract. This contract will interact with the Interchain Token Service (ITS) to create new tokens and enable cross-chain transfers. + +We'll build this step by step by creating the core source files inside the `src` folder. + +### Step 1: Define the contract entry point (`lib.rs`) + +The `lib.rs` file is your contract's main entry point. Here, you declare the modules your contract uses. + +Update `src/lib.rs` with: + +```rust +#![no_std] + +pub mod contract; +pub mod error; +mod storage_types; +``` + +- `contract` will contain the main contract implementation +- `error` defines error types your contract can return +- `storage_types` holds data structures used for contract storage + +### Step 2: Define contract errors (`error.rs`) + +A clear list of error codes helps you handle edge cases and report issues properly. + +Create `src/error.rs` with the following content: + +```rust +use stellar_axelar_std::{contracterror, soroban_sdk}; + +#[contracterror] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +#[repr(u32)] +pub enum ContractError { + TrustedChainAlreadySet = 1, + TrustedChainNotSet = 2, + InvalidMessageType = 3, + UntrustedChain = 4, + InvalidAmount = 5, + InvalidDestinationAddress = 6, + NotHubChain = 7, + NotHubAddress = 8, + InvalidTokenId = 9, + TokenAlreadyRegistered = 10, + FlowLimitExceeded = 11, + InvalidDestinationChain = 12, + InvalidData = 13, + InvalidTokenName = 14, + InvalidTokenSymbol = 15, + InvalidTokenDecimals = 16, + InvalidInitialSupply = 17, + InvalidTokenConfig = 18, +} +``` + +Each error has a unique numeric code and a named variant. This helps both you and users understand why a transaction might fail. + +### Step 3: Define storage keys (`storage_types.rs`) + +The contract needs to store some key data onchain. Let's define storage keys in `src/storage_types.rs`: + +```rust +use soroban_sdk::{contracttype, String}; + +#[contracttype] +#[derive(Clone, Debug)] +pub enum DataKey { + InterchainTokenService, + TokenId, + Salt, + TrustedChain(String), +} +``` + +This storage structure includes: + +- `InterchainTokenService`: Stores the address of the deployed ITS contract. +- `TokenId`: Stores the ID of the token we deploy. +- `Salt`: Stores the salt used for token deployment (needed for remote deployment). +- `TrustedChain`: Tracks which chains we've marked as trusted. + +### Step 4: Implement the contract logic (`contract.rs`) + +#### 1. Setup and Initialization + +First, let's create the `contract.rs` file inside the `src` folder with a basic setup and initialization functions: + +```rust +use soroban_sdk::{contract, contractimpl, Address, Bytes, BytesN, Env, String}; +use soroban_token_sdk::metadata::TokenMetadata; +use stellar_axelar_std::types::Token; +use stellar_interchain_token_service::InterchainTokenServiceClient; + +use crate::storage_types::DataKey; + +#[contract] +pub struct ItsApp; + +#[contractimpl] +impl ItsApp { + /// Initialize the contract with the ITS service address + pub fn initialize(env: &Env, its_address: Address) { + env.storage() + .instance() + .set(&DataKey::InterchainTokenService, &its_address); + } + + /// Get the ITS client + fn its_client(env: &Env) -> InterchainTokenServiceClient { + let its_address = env + .storage() + .instance() + .get(&DataKey::InterchainTokenService) + .unwrap(); + InterchainTokenServiceClient::new(env, &its_address) + } + + /// Check if a chain is trusted + pub fn is_trusted_chain(env: &Env, chain: String) -> bool { + let its = Self::its_client(env); + its.is_trusted_chain(&chain) + } +} +``` + +These functions: + +- `initialize`: Sets up the contract with the address of the ITS service +- `its_client`: Creates an instance of the InterchainTokenServiceClient +- `is_trusted_chain`: Checks if a chain is trusted by the ITS + +#### 2. Token Creation Functions + +Next, let's add functions to deploy a new token and retrieve token information: + +```rust + //... + + /// Deploy a new interchain token on Stellar + pub fn deploy_token( + env: &Env, + caller: Address, + salt: BytesN<32>, + name: String, + symbol: String, + decimals: u32, + initial_supply: i128, + ) -> BytesN<32> { + caller.require_auth(); + + let its = Self::its_client(env); + + // Create token metadata + let token_metadata = TokenMetadata { + name, + symbol, + decimal: decimals, + }; + + // Deploy the token - direct call + let token_id = its.deploy_interchain_token( + &caller, + &salt, + &token_metadata, + &initial_supply, + &None, // No additional minter + ); + + // Store the token ID and salt for reference + env.storage().instance().set(&DataKey::TokenId, &token_id); + env.storage().instance().set(&DataKey::Salt, &salt); + + token_id + } + + /// Get the currently stored token ID + pub fn get_token_id(env: &Env) -> BytesN<32> { + env.storage().instance().get(&DataKey::TokenId).unwrap() + } +``` + +The `deploy_token` function: + +- Authenticates the caller to ensure they have permission +- Creates token metadata with the provided name, symbol, and decimals +- Deploys a new interchain token with the specified initial supply +- Stores both the generated `token_id` and salt for future operations +- Returns the `token_id` for reference + +The getter function allows us to retrieve the stored token information: + +- `get_token_id`: Returns the ITS `token_id` + +#### 3. Implement the Cross-Chain Functions + +Finally, let's add functions for cross-chain token deployment and transfers: + +```rust + //... + + /// Deploy the token to another blockchain + pub fn deploy_remote_token( + env: &Env, + caller: Address, + destination_chain: String, + gas_token_address: Address, + gas_amount: i128, + ) -> BytesN<32> { + caller.require_auth(); + + let its = Self::its_client(env); + + // Get stored salt + let salt = env.storage().instance().get(&DataKey::Salt).unwrap_or_else(|| { + BytesN::from_array(env, &[0; 32]) + }); + + // Prepare gas token + let gas_token = Some(Token { + address: gas_token_address, + amount: gas_amount, + }); + + // Deploy to remote chain - direct call + let token_id = its.deploy_remote_interchain_token( + &caller, + &salt, + &destination_chain, + &gas_token, + ); + + token_id + } + + /// Transfer interchain tokens to another blockchain + pub fn transfer_tokens( + env: &Env, + caller: Address, + token_id: BytesN<32>, + destination_chain: String, + destination_address: Bytes, + amount: i128, + gas_token_address: Address, + gas_amount: i128, + ) { + caller.require_auth(); + + let its = Self::its_client(env); + + // Basic validation + if amount <= 0 { + panic!("Invalid amount"); + } + + if destination_address.len() == 0 { + panic!("Invalid destination address"); + } + + // Prepare gas token + let gas_token = Some(Token { + address: gas_token_address, + amount: gas_amount, + }); + + // Send the tokens cross-chain - direct call + its.interchain_transfer( + &caller, + &token_id, + &destination_chain, + &destination_address, + &amount, + &None, // No additional data + &gas_token, + ); + } +``` + +The `deploy_remote_token` function: + +- Deploys the token to another blockchain using the stored salt +- Configures gas payment for cross-chain operations +- Returns the `token_id`, which remains consistent across chains + +The `transfer_tokens` function: + +- Validates the transfer amount and destination address +- Initiates the cross-chain transfer with appropriate gas payment + +With these functions implemented, our contract provides a complete interface for creating new tokens and enabling cross-chain transfers. + +## Part 4: Build and Deploy the Contract + +Once your contract code is complete, follow these steps to compile and deploy it on the Stellar testnet. + +### Step 1: Build your contract + +```bash +stellar contract build +``` + +You should see output confirming the build succeeded and showing the location of the `.wasm` file: + +``` +ℹ️ CARGO_BUILD_RUSTFLAGS=--remap-path-prefix=/path/to/registry/src= cargo rustc --manifest-path=Cargo.toml --crate-type=cdylib --target=wasm32-unknown-unknown --release + Compiling axelar-its-app v0.0.0 (/path/to/axelar-its-example) + Finished `release` profile [optimized] target(s) in 1.04s +ℹ️ Build Summary: + Wasm File: target/wasm32-unknown-unknown/release/axelar_its_app.wasm + Wasm Hash: 6ec10215f2b47323e143289842bdf274b00929b5632f60e56ef39fd2caa066eb + Exported Functions: 8 found + ••• +✅ Build Complete +``` + +### Step 2. Optimize the WASM file: + +```bash +stellar contract optimize --wasm target/wasm32-unknown-unknown/release/axelar_its_app.wasm +``` + +This creates an optimized `.wasm` file you will deploy. + +### Step 3. Deploy the contract to the Stellar testnet: + +```bash +stellar contract deploy \ + --wasm target/wasm32-unknown-unknown/release/axelar_its_app.optimized.wasm \ + --source YOUR_ACCOUNT_NAME \ + --network testnet +``` + +When the deployment succeeds, you'll receive the address of your new contract. Save this address for future interactions. + +You should see something similar to what is shown below on your terminal. + +``` +ℹ️ Simulating install transaction… +ℹ️ Signing transaction: ee3941979c516e4953b65d14704d1c9b9ec0c1646be5295f877f0ea6ae042504 +🌎 Submitting install transaction… +ℹ️ Using wasm hash 8a09dd41239d938d23546dfd56e935d3e19f0784bd96757990858a78453e913e +ℹ️ Simulating deploy transaction… +ℹ️ Transaction hash is c98523481cfecfdb96ae19d19cdb766b18394b711b614ef79a2e924cc15a8461 +🔗 https://stellar.expert/explorer/testnet/tx/c98523481cfecfdb96ae19d19cdb766b18394b711b614ef79a2e924cc15a8461 +ℹ️ Signing transaction: c98523481cfecfdb96ae19d19cdb766b18394b711b614ef79a2e924cc15a8461 +🌎 Submitting deploy transaction… +🔗 https://stellar.expert/explorer/testnet/contract/CCQBX3AFKB2A43RA6GVY53MFBGK3KSXROUAXZSRV3CG63FXFG7QXNKLT +✅ Deployed! +CCQBX3AFKB2A43RA6GVY53MFBGK3KSXROUAXZSRV3CG63FXFG7QXNKLT +``` + +## Part 5: Interacting with your contract on the Stellar testnet + +Now that our contract is deployed, let's interact with it to create and transfer tokens across the cross-chain. + +Now that your contract is deployed on the Stellar testnet, you'll use the Stellar CLI to: + +- Initialize your contract by connecting it to the Axelar Interchain Token Service (ITS) +- Create a new token on Stellar using the ITS +- Deploy your new token on the Avalanche Fuji testnet +- Transfer tokens from Stellar to Avalanche Fuji + +### Step 1: Initialize your contract with the ITS address + +Before creating tokens or transferring, your contract must know where the ITS service lives on Stellar. +Run this command, replacing `YOUR_CONTRACT_ADDRESS` and `YOUR_ACCOUNT_NAME` accordingly: + +```bash +stellar contract invoke \ + --network testnet \ + --id YOUR_CONTRACT_ADDRESS \ + --source-account YOUR_ACCOUNT_NAME \ + -- \ + initialize \ + --its_address CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK +``` + +> Note: `CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK` is the address of the Axelar Interchain Token Service contract on the Stellar testnet. You should confirm this address from the official Axelar documentation for testnet [here](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/axelar-chains-config/info/testnet.json). + +You should see something like: + +``` +ℹ️ Signing transaction: f90f7d67180f00e77b0de0b96b6cc801a68093c41ed6544cc82d327b2c1c4837 +``` + +### Step 2: Check if Avalanche is a trusted chain + +It's a good practice to verify that ITS trusts the destination chain (Avalanche) before sending tokens. + +A trusted chain is one that the ITS recognizes and allows transfers to and from. To check if Avalanche is trusted, you can use the `is_trusted_chain` function in your contract. +Replace `YOUR_CONTRACT_ADDRESS` and `YOUR_ACCOUNT_NAME` with your contract address and Stellar account name. + +Run the command below: + +```bash +stellar contract invoke \ + --network testnet \ + --id YOUR_CONTRACT_ADDRESS \ + --source-account YOUR_ACCOUNT_NAME \ + -- \ + is_trusted_chain \ + --chain '"Avalanche"' +``` + +> Note: The quotes around the chain name are required due to how the Stellar CLI handles string parameters. + +You will get this: + +``` +ℹ️ Simulation identified as read-only. Send by rerunning with `--send=yes`. +true +``` + +If it returns false, the chain is not yet trusted, and transfers to it won't work until it's added. + +### Step 3: Deploy a new Interchain Token on Stellar + +Create your own token that can exist across multiple blockchains: + +```bash +stellar contract invoke \ + --network testnet \ + --id YOUR_CONTRACT_ADDRESS \ + --source-account YOUR_ACCOUNT_NAME \ + -- \ + deploy_token \ + --caller YOUR_ACCOUNT_NAME \ + --salt 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef \ + --name '"Axelar Test Token"' \ + --symbol '"ATT"' \ + --decimals 7 \ + --initial_supply 1000000000 +``` + +> Make sure to replace the salt with a proper 32-byte hexadecimal string. For convenience, you can use the example value shown above. After executing this command, you should receive a `token_id`. The contract will also internally store both the `token_id` and the salt for future operations. + +You will see something like this: + +``` +ℹ️ Signing transaction: d6a4cb711a78b681324b9ef8d0ad57ab99bb465261d294daee7f5fbbae242a47 +📅 CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK - Event: [{"symbol":"interchain_token_deployed"},{"bytes":"76e302e75743a189b908c691e481cbc86f7635ae7d56667ebaf44555d8803e0b"},{"address":"CCNZ2XJUC3IHIJIB77NOWKHEHQHNYCNQHMZLNLQSAH5YQS7VWVBYBCKX"},{"string":"Axelar Test Token"},{"string":"ATT"},{"u32":7},"void"] = {"vec":[]} +📅 CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK - Event: [{"symbol":"token_manager_deployed"},{"bytes":"76e302e75743a189b908c691e481cbc86f7635ae7d56667ebaf44555d8803e0b"},{"address":"CCNZ2XJUC3IHIJIB77NOWKHEHQHNYCNQHMZLNLQSAH5YQS7VWVBYBCKX"},{"address":"CAFKSZAAUJ6KVPC43ZOKXSYSEE6FMTLIPWUUZDHBYFZPVRR6THVOBDBG"},{"u32":0}] = {"vec":[]} +📅 CCNZ2XJUC3IHIJIB77NOWKHEHQHNYCNQHMZLNLQSAH5YQS7VWVBYBCKX - Event: [{"symbol":"minter_added"},{"address":"CAFKSZAAUJ6KVPC43ZOKXSYSEE6FMTLIPWUUZDHBYFZPVRR6THVOBDBG"}] = {"vec":[]} +📅 CCNZ2XJUC3IHIJIB77NOWKHEHQHNYCNQHMZLNLQSAH5YQS7VWVBYBCKX - Event: [{"symbol":"mint"},{"address":"CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK"},{"address":"GAGZ5NZJMXKCORPFQMXYZJZTYDSZ5OPTYEPD2HSVNWU3MCV5JIL6IQDP"}] = {"i128":{"hi":0,"lo":1000000000}} +"76e302e75743a189b908c691e481cbc86f7635ae7d56667ebaf44555d8803e0b" +``` + +This deployment returns your token ID, which is `76e302e75743a189b908c691e481cbc86f7635ae7d56667ebaf44555d8803e0b` in this example. Save it somewhere, as you will need it to do interchain token transfers. + +### Step 4: Deploy your token to the Avalanche Fuji testnet + +With your token created, deploy its representation on the Avalanche Fuji testnet. +Run the command below, replacing values as needed: + +```bash +stellar contract invoke \ + --network testnet \ + --id YOUR_CONTRACT_ADDRESS \ + --source-account YOUR_ACCOUNT_NAME \ + -- \ + deploy_remote_token \ + --caller YOUR_ACCOUNT_NAME \ + --destination_chain '"Avalanche"' \ + --gas_token_address CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC \ + --gas_amount 10000000 +``` + +> Notes: +> +> - `CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC` is the address of the native XLM token on Stellar testnet. +> - The gas amount is 10 XLM (10,000,000,000 stroops). +> - We don't need to specify the token_id as our contract stores this from the token deployment. + +You should see: + +``` +ℹ️ Signing transaction: 41a6d7c068fb82c777008f8da95c1d285d3b99ca07594b7e2c71eb4ed569018f +📅 CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK - Event: [{"symbol":"token_deployment_started"},{"bytes":"76e302e75743a189b908c691e481cbc86f7635ae7d56667ebaf44555d8803e0b"},{"address":"CCNZ2XJUC3IHIJIB77NOWKHEHQHNYCNQHMZLNLQSAH5YQS7VWVBYBCKX"},{"string":"Avalanche"},{"string":"Axelar Test Token"},{"string":"ATT"},{"u32":7},"void"] = {"vec":[]} +📅 CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC - Event: [{"symbol":"transfer"},{"address":"GAGZ5NZJMXKCORPFQMXYZJZTYDSZ5OPTYEPD2HSVNWU3MCV5JIL6IQDP"},{"address":"CAZUKAFB5XHZKFZR7B5HIKB6BBMYSZIV3V2VWFTQWKYEMONWK2ZLTZCT"},{"string":"native"}] = {"i128":{"hi":0,"lo":10000000000}} +📅 CAZUKAFB5XHZKFZR7B5HIKB6BBMYSZIV3V2VWFTQWKYEMONWK2ZLTZCT - Event: [{"symbol":"gas_paid"},{"address":"CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK"},{"string":"axelar"},{"string":"axelar1aqcj54lzz0rk22gvqgcn8fr5tx4rzwdv5wv5j9dmnacgefvd7wzsy2j2mr"},{"bytes":"acd9ec020c801c7d6e5e9c15a5fa5b7e7944a0d5cdb027e2bdf4e70892d7ab54"},{"address":"GAGZ5NZJMXKCORPFQMXYZJZTYDSZ5OPTYEPD2HSVNWU3MCV5JIL6IQDP"},{"map":[{"key":{"symbol":"address"},"val":{"address":"CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC"}},{"key":{"symbol":"amount"},"val":{"i128":{"hi":0,"lo":10000000000}}}]}] = {...} +"76e302e75743a189b908c691e481cbc86f7635ae7d56667ebaf44555d8803e0b" +``` + +This is a cross-chain transaction. You can check its status on Axelarscan testnet explorer by pasting this transaction hash: `41a6d7c068fb82c777008f8da95c1d285d3b99ca07594b7e2c71eb4ed569018f`. You can check [here](https://testnet.axelarscan.io/gmp/41a6d7c068fb82c777008f8da95c1d285d3b99ca07594b7e2c71eb4ed569018f). + +### Step 5: Transfer tokens cross-chain from Stellar to Avalanche + +Finally, send some tokens to your Avalanche wallet. + +Prepare your Avalanche address (without the `0x` prefix), and run: + +```bash +stellar contract invoke \ + --network testnet \ + --id YOUR_CONTRACT_ADDRESS \ + --source-account YOUR_ACCOUNT_NAME \ + -- \ + transfer_tokens \ + --caller YOUR_ACCOUNT_NAME \ + --token_id YOUR_TOKEN_ID \ + --destination_chain '"Avalanche"' \ + --destination_address '"YOUR_AVALANCHE_ADDRESS"' \ + --amount 100000000 \ + --gas_token_address CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC \ + --gas_amount 10000000 +``` + +> Notes: +> +> - Replace `YOUR_TOKEN_ID` with the token ID you received from the deployment (e.g., 76e302e75743a189b908c691e481cbc86f7635ae7d56667ebaf44555d8803e0b). +> - Replace `YOUR_AVALANCHE_ADDRESS` with the InterchainToken Service on Avalanche Fuji tesnet (e.g., B5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C - without 0x prefix). The address is the same for all EVM chains. +> - The amount is 10 tokens with seven decimal places (100,000,000 base units). + +You will get something like this: + +``` +ℹ️ Signing transaction: 6b8cf06327115b803aa465ebc9a12b9682753d89c391cca396bf767c31642fb2 +📅 CCNZ2XJUC3IHIJIB77NOWKHEHQHNYCNQHMZLNLQSAH5YQS7VWVBYBCKX - Event: [{"symbol":"burn"},{"address":"GAGZ5NZJMXKCORPFQMXYZJZTYDSZ5OPTYEPD2HSVNWU3MCV5JIL6IQDP"}] = {"i128":{"hi":0,"lo":100000000}} +📅 CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK - Event: [{"symbol":"interchain_transfer_sent"},{"bytes":"76e302e75743a189b908c691e481cbc86f7635ae7d56667ebaf44555d8803e0b"},{"address":"GAGZ5NZJMXKCORPFQMXYZJZTYDSZ5OPTYEPD2HSVNWU3MCV5JIL6IQDP"},{"string":"Avalanche"},{"bytes":"b5fb4be02232b1bba4dc8f81dc24c26980de9e3c"},{"i128":{"hi":0,"lo":100000000}}] = {"vec":["void"]} +📅 CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC - Event: [{"symbol":"transfer"},{"address":"GAGZ5NZJMXKCORPFQMXYZJZTYDSZ5OPTYEPD2HSVNWU3MCV5JIL6IQDP"},{"address":"CAZUKAFB5XHZKFZR7B5HIKB6BBMYSZIV3V2VWFTQWKYEMONWK2ZLTZCT"},{"string":"native"}] = {"i128":{"hi":0,"lo":10000000000}} +📅 CAZUKAFB5XHZKFZR7B5HIKB6BBMYSZIV3V2VWFTQWKYEMONWK2ZLTZCT - Event: [{"symbol":"gas_paid"},{"address":"CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK"},{"string":"axelar"},{"string":"axelar1aqcj54lzz0rk22gvqgcn8fr5tx4rzwdv5wv5j9dmnacgefvd7wzsy2j2mr"},{"bytes":"4924e9eeae33b5800cb9418f98a473d14899b034034a9462cd72524697814b69"},{"address":"GAGZ5NZJMXKCORPFQMXYZJZTYDSZ5OPTYEPD2HSVNWU3MCV5JIL6IQDP"},{"map":[{"key":{"symbol":"address"},"val":{"address":"CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC"}},{"key":{"symbol":"amount"},"val":{"i128":{"hi":0,"lo":10000000000}}}]}] = {...} +``` + +Looking at axelarsscan with the hash: `6b8cf06327115b803aa465ebc9a12b9682753d89c391cca396bf767c31642fb2`, you will have https://testnet.axelarscan.io/gmp/6b8cf06327115b803aa465ebc9a12b9682753d89c391cca396bf767c31642fb2. + +You can register an existing token to make it an interchain token; however, we will cover that in a different guide. + +## Part 6: Receiving Tokens on Avalanche Fuji Testnet + +After the cross-chain transfer is completed, you can find the address of your token on Avalanche by checking the Axelarscan explorer for your cross-chain transaction or your address on Avalanche Fuji testnet. Now you should be able to see your token balance in your wallet. + +You can find the complete code example [here](https://github.com/axelarnetwork/stellar-its-example). + +## Conclusion + +You've now learned how to: + +1. Deploy a new token on Stellar. +2. Make it available on an EVM chain. +3. Transfer tokens between blockchains. diff --git a/src/content/docs/dev/send-tokens/stellar/intro.mdx b/src/content/docs/dev/send-tokens/stellar/intro.mdx new file mode 100644 index 000000000..8d12d0385 --- /dev/null +++ b/src/content/docs/dev/send-tokens/stellar/intro.mdx @@ -0,0 +1,223 @@ +# Stellar Interchain Token Service (ITS) + +## What is the Interchain Token Service? + +The [Interchain Token Service (ITS)](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-interchain-token-service) is a protocol that allows tokens to move freely between different blockchains. Think of it as a universal bridge for tokens - it provides a standardized way to: + +1. Deploy a token onto multiple blockchains that are interlinked. +1. Connect existing tokens from one blockchain to other blockchains. +1. Transfer tokens securely between blockchains. + +For [Stellar developers](https://developers.stellar.org/), ITS opens up new possibilities to interact with tokens from Ethereum, Polygon, Avalanche, and many other blockchains without understanding the intricacies of each chain's token standards. + +## How ITS Works on Stellar + +Unlike on EVM chains (like Ethereum), where tokens follow the [ERC-20 standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/), Stellar [assets](https://developers.stellar.org/docs/learn/fundamentals/stellar-data-structures/assets) work a bit differently. + +Stellar has its classic assets (issued with `G...` address) as well as [contract tokens](https://developers.stellar.org/docs/tokens/token-interface). The classic assets are native assets that have been part of the Stellar network since its inception, including tokens like XLM, USDC, and EURC, they are issued by Stellar Account and have a built-in [asset contract](https://developers.stellar.org/docs/tokens/stellar-asset-contract). Contract tokens were Introduced with Soroban, CAP-41, they allow for custom logic in token implementation through smart contracts. These are similar to ERC-20 tokens on other chains. + ITS integration adapts to Stellar's unique characteristics: + +1. **Hub Mode Operation**: Stellar ITS works exclusively in "Hub mode" - all cross-chain messages go through the [ITS Hub](/dev/amplifier/its-hub/introduction/) on the Axelar network rather than directly between chains. + +1. **Token Representation**: When an external token (like an Ethereum ERC-20) comes to Stellar, it's represented by a Stellar token that's controlled by a special contract called the [TokenManager](https://github.com/axelarnetwork/axelar-amplifier-stellar/blob/main/contracts/stellar-interchain-token-service/src/token_manager.rs). + +1. **Trust System**: Instead of trusting specific addresses (as in EVM implementations), Stellar ITS uses a system of trusted chains. + +With the integration of Stellar into Axelar, Stellar smart contracts can now leverage ITS to interact with tokens from other [blockchains](https://axelarscan.io/resources/chains) connected to Axelar. + +## Key Components of ITS + +Before diving into implementation, let's understand the key components: + +1. **`InterchainTokenService`**: The main [contract](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-interchain-token-service) that coordinates token-related operations. It's the primary interface for cross-chain token functionality. + +1. **`TokenManager`**: A [contract](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-token-manager) that handles tokens' minting, burning, and locking on a specific blockchain. Each token has its own `TokenManager`. + +1. **`InterchainToken`**: The token [contract](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-interchain-token) implementing Stellar's token interface. + +1. **`Gateway`**: A [contract](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-axelar-gateway) that facilitates the cross-chain message passing between Stellar and other blockchains. + +1. **`GasService`**: A [contract](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-axelar-gas-service) that handles payments for cross-chain transactions. Without this, messages couldn't be relayed between chains. + +## What You Can Do With ITS + +ITS enables several robust use cases on Stellar: + +### Deploy a new Interchain Token on Stellar: + +```rust +fn deploy_interchain_token( + env: &Env, + caller: Address, + salt: BytesN<32>, + token_metadata: TokenMetadata, + initial_supply: i128, + minter: Option
    , +) -> Result, ContractError> { + // Returns a token_id that uniquely identifies your token across all chains +} +``` + +### Deploy an Interchain Token Remotely to Other Chains: + +```rust +fn deploy_remote_token( + env: &Env, + caller: Address, + salt: BytesN<32>, + destination_chain: String, + gas_token: Option, +) -> Result, ContractError> { + // Deploys your token to another blockchain like Ethereum, Avalanche, etc. +} +``` + +### Register an Existing Stellar As an Interchain Token to Make It Available on Other Chains + +These functions let you link existing tokens to the ITS network, making them available across chains. + +```rust +// Register an existing Stellar token +fn register_canonical_token( + env: &Env, + token_address: Address, +) -> Result, ContractError> { + // Registers an existing token with the ITS +} + +// Deploy that token to other chains (Ethereum, Avalanche, etc.) +fn deploy_remote_canonical_token( + env: &Env, + token_address: Address, + destination_chain: String, + spender: Address, + gas_token: Option, +) -> Result, ContractError> { + // Makes your existing token available on other blockchains +} +``` + +### Transfer Tokens Cross-Chain + +Send tokens between Stellar and any supported blockchain: + +```rust +fn interchain_transfer( + env: &Env, + caller: Address, + token_id: BytesN<32>, + destination_chain: String, + destination_address: Bytes, + amount: i128, + data: Option, + gas_token: Option, +) -> Result<(), ContractError> { + // Transfers tokens from Stellar to another blockchain +} +``` + +### Trusted Chain Management + +Before sending tokens cross-chain, you can check if the destination chain is valid or trusted: + +```rust +fn is_trusted_chain(env: &Env, chain: String) -> bool { + storage::is_trusted_chain(env, chain) +} +``` + +### Receive Tokens from Other Chains + +To receive tokens from other blockchains, the contract must implement message handling: + +```rust +fn execute( + env: &Env, + source_chain: String, + message_id: String, + source_address: String, + payload: Bytes, +) -> Result<(), ContractError> { + // This function: + // 1. Validates that the message is coming from the ITS Hub + // 2. Decodes the message to determine its type + // 3. Processes it appropriately - either as a token transfer or a token deployment +} +``` + +### Flow Limits + +The ITS implementation includes a [flow-limiting system](/dev/send-tokens/interchain-tokens/flow-limit/) to control how many tokens can move in a given period: + +```rust +#[only_operator] +fn set_flow_limit( + env: &Env, + token_id: BytesN<32>, + flow_limit: Option, +) -> Result<(), ContractError> {} +``` + +This function allows the [operator](/dev/send-tokens/interchain-tokens/minter-operator-roles/#operator-role) to limit how many tokens can flow in or out over time. + +#### Setting Flow Limits + +Flow limits are configured per token and can only be set by authorized operators: + +```rust +// Set a flow limit for a token +client.set_flow_limit(&token_id, &Some(1000_000)); + +// Remove flow limit (disable flow limiting) +client.set_flow_limit(&token_id, &None); + +// Freeze token transfers (set limit to 0) +client.set_flow_limit(&token_id, &Some(0)); +``` + +#### Authorization + +- **Only Operators**: Flow limits can only be set by addresses with operator privileges +- **Per-Token Configuration**: Each token can have its own independent flow limit +- **Optional Feature**: Tokens without configured flow limits have no transfer restrictions + + + +#### Query Functions + +The ITS contract provides several functions to query flow limit status: + +```rust +// Get the configured flow limit for a token +fn flow_limit(token_id: BytesN<32>) -> Option + +// Get current epoch's outflow amount +fn flow_out_amount(token_id: BytesN<32>) -> i128 + +// Get current epoch's inflow amount +fn flow_in_amount(token_id: BytesN<32>) -> i128 +``` + +#### Error Handling + +The system returns specific errors for different flow limit violations: + +- **`InvalidFlowLimit`**: Attempted to set a negative flow limit +- **`FlowAmountExceededLimit`**: Single transfer exceeds the flow limit +- **`FlowAmountOverflow`**: Cumulative flow would cause integer overflow +- **`FlowLimitExceeded`**: Net flow would exceed the configured limit + +#### Events + +Flow limit changes emit events for monitoring and auditing: + +```rust +FlowLimitSetEvent { + token_id: BytesN<32>, + flow_limit: Option, +} +``` + +## Next Steps + +Learn More: Explore our tutorial on [building a rust project from scratch with interchain token service implementation to deploy and transfer tokens from Steller to EVM](). This tutorial will guide you through distributing tokens across multiple chains. diff --git a/src/content/docs/dev/send-tokens/stellar/link-custom-token.mdx b/src/content/docs/dev/send-tokens/stellar/link-custom-token.mdx new file mode 100644 index 000000000..e69de29bb diff --git a/src/content/docs/dev/send-tokens/stellar/register-existing-stellar-token.mdx b/src/content/docs/dev/send-tokens/stellar/register-existing-stellar-token.mdx new file mode 100644 index 000000000..e52ab823f --- /dev/null +++ b/src/content/docs/dev/send-tokens/stellar/register-existing-stellar-token.mdx @@ -0,0 +1,653 @@ +import { Callout } from "../../../../../components/callout"; + +# Register and transfer existing tokens from Stellar to EVM chains using ITS + +This guide demonstrates, step-by-step, how to use [Axelar's Interchain Token Service (ITS)](/dev/send-tokens/interchain-tokens/intro/#interchain-token-service) to register an existing token on Stellar and make it available for cross-chain transfers to EVM chains. + +By the end, you will be able to: + +1. Register an existing token on Stellar with Axelar ITS. +1. Deploy that token representation on an EVM chain (Avalanche Fuji testnet). +1. Transfer tokens seamlessly between Stellar and the EVM chain. + +## Prerequisites + +Before starting, make sure you have the following ready: + +- Rust installed with the wasm32 target enabled ([installation instructions](https://www.rust-lang.org/tools/install)) +- Stellar CLI installed ([stellar-cli repo](https://github.com/stellar/stellar-cli)) +- A Stellar testnet account funded with test XLM +- A browser wallet like MetaMask configured to connect to the Avalanche Fuji testnet, or a similar wallet like Rabby +- An existing token on Stellar that you control or have permission to register + +If you don’t yet have a Stellar token, you can create one using tools like [Token Tool](https://tokentool.bitbond.com/) or programmatically. This guide assumes you already have the token address ready. + +## Part 1: Understanding the Interchain Token Service + +The [Interchain Token Service (ITS)](https://github.com/axelarnetwork/axelar-amplifier-stellar/tree/main/contracts/stellar-interchain-token-service) is a protocol that allows tokens to move freely between different blockchains. + +Instead of deploying a brand-new token, ITS let's you register existing tokens you own on Stellar and seamlessly transfer their value across chains. It achieves this through a canonical token integration, meaning: + +- When you transfer your Stellar token to another chain, the ITS _locks_ the token on Stellar +- It _mints_ a corresponding wrapped token on the destination chain +- When tokens move back to Stellar, the wrapped tokens are _burned_ and the original tokens are _unlocked_ + + + There can only be a single lock/unlock token manager for the token + + +## Part 2: Set up your Stellar ITS project + +Now, let’s build a Stellar smart contract project that integrates with ITS to register and transfer existing tokens. + +### Step 1. Initialize a new project + +Start by creating a new Stellar contract project and the directory: + +```bash +stellar contract init axelar-its-existing-token +cd axelar-its-existing-token +``` + +This command scaffolds a basic Stellar contract project for you. + +> Tip: We'll simplify the default structure as we progress, focusing on the files needed for the ITS integration. + +### Step 2: Simplify your project structure + +To keep things neat, remove unnecessary folders and consolidate your source files. + +- Move the `src` folder to the root of your project directory if it isn’t there already +- Delete any example or template contract folders, such as `contract/hello-world` + +After cleanup later in this section, your folder should look like this: + +```bash +axelar-its-existing-token +├── src +│ ├── lib.rs +├── .gitignore +├── Cargo.toml +├── README.md +``` + +### Step 3. Configure your dependencies in Cargo.toml + +Open `Cargo.toml` in your project root and update it to include dependencies needed for Axelar ITS and Stellar development. + +Here’s a sample you can copy: + +```toml +[package] +name = "axelar-its-existing-token" + +version = "0.0.0" +edition = "2021" +publish = false + +[lib] +crate-type = ["cdylib"] +doctest = false + +[dependencies] +soroban-sdk = "22.0.0" +soroban-token-sdk = "22.0.0" +stellar-axelar-gateway = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", branch = "main", features = ["library"] } +stellar-axelar-gas-service = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", branch = "main", features = ["library"] } +stellar-interchain-token-service = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", branch = "main", features = ["library"] } +stellar-interchain-token = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", branch = "main", features = ["library"] } +stellar-token-manager = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", branch = "main", features = ["library"] } +stellar-axelar-std = { git = "https://github.com/axelarnetwork/axelar-amplifier-stellar", branch = "main" } + +[dev-dependencies] +soroban-sdk = { version = "22.0.0", features = ["testutils"] } + +[profile.release] +opt-level = "z" +overflow-checks = true +debug = 0 +strip = "symbols" +debug-assertions = false +panic = "abort" +codegen-units = 1 +lto = true + +[profile.release-with-logs] +inherits = "release" +debug-assertions = true +``` + +This configuration pulls in Axelar’s Stellar libraries from GitHub and sets up your Rust build profiles for optimal WASM compilation. + +## Part 3: Implement the contract logic + +Now that the project structure and dependencies are ready, it's time to implement the contract. This contract will interact with the Interchain Token Service (ITS) to register your existing Stellar token and enable cross-chain transfers. + +We'll build this step by step by creating the core source files inside the `src` folder. + +### Step 1: Define the contract entry point (`lib.rs`) + +The `lib.rs` file acts as the main entry point for your contract. Here, you declare the modules your contract uses. + +Update `src/lib.rs` with: + +```rust +#![no_std] + +pub mod contract; +pub mod error; +mod storage_types; +``` + +- `contract` will contain the main contract implementation +- `error` defines error types your contract can return +- `storage_types` holds data structures used for contract storage + +### Step 2: Define contract errors (`error.rs`) + +A clear list of error codes helps you handle edge cases and report issues properly. + +Create `src/error.rs` with the following content: + +```rust +use stellar_axelar_std::{contracterror, soroban_sdk}; + +#[contracterror] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +#[repr(u32)] +pub enum ContractError { + TrustedChainAlreadySet = 1, + TrustedChainNotSet = 2, + InvalidMessageType = 3, + UntrustedChain = 4, + InvalidAmount = 5, + InvalidDestinationAddress = 6, + NotHubChain = 7, + NotHubAddress = 8, + InvalidTokenId = 9, + TokenAlreadyRegistered = 10, + FlowLimitExceeded = 11, + InvalidDestinationChain = 12, + InvalidData = 13, + InvalidTokenConfig = 14, +} +``` + +Each error has a unique numeric code and a named variant. This helps both you and users understand why a transaction might fail. + +### Step 3: Define storage keys (storage_types.rs) + +The contract needs to store some key data on-chain. Let's define storage keys in `src/storage_types.rs`: + +```rust +use soroban_sdk::{contracttype, String}; + +#[contracttype] +#[derive(Clone, Debug)] +pub enum DataKey { + InterchainTokenService, + TokenId, + OriginalToken, + TrustedChain(String), +} +``` + +This storage structure includes: + +- `InterchainTokenService`: Stores the address of the deployed ITS contract +- `TokenId`: Stores the ID of the registered token +- `OriginalToken`: Stores the address of the original token we registered +- `TrustedChain`: Tracks which chains we've marked as trusted + +### Step 4: Implement the contract logic (contract.rs) + +#### 1. Setup and Initialization + +First, let's create the `contract.rs` file inside the `src` folder with a basic setup and initialization functions: + +```rust +use soroban_sdk::{contract, contractimpl, Address, Bytes, BytesN, Env, String}; +use stellar_axelar_std::types::Token; +use stellar_interchain_token_service::InterchainTokenServiceClient; + +use crate::storage_types::DataKey; + +#[contract] +pub struct ExistingTokenApp; + +#[contractimpl] +impl ExistingTokenApp { + /// Initialize the contract with the ITS service address + pub fn initialize(env: &Env, its_address: Address) { + env.storage() + .instance() + .set(&DataKey::InterchainTokenService, &its_address); + } + + /// Get the ITS client + fn its_client(env: &Env) -> InterchainTokenServiceClient { + let its_address = env + .storage() + .instance() + .get(&DataKey::InterchainTokenService) + .unwrap(); + InterchainTokenServiceClient::new(env, &its_address) + } + + /// Check if a chain is trusted + pub fn is_trusted_chain(env: &Env, chain: String) -> bool { + let its = Self::its_client(env); + its.is_trusted_chain(&chain) + } +} +``` + +These functions: + +- `initialize`: Sets up the contract with the address of the ITS service. +- `its_client`: Creates an instance of the `InterchainTokenServiceClient`. +- `is_trusted_chain`: Checks if a chain is trusted by the ITS. + +#### 2. Token Registration Functions + +Next, let's add functions to register an existing token and retrieve token information: + +```rust + //... + + /// Register an existing Stellar token for cross-chain use + pub fn register_existing_token( + env: &Env, + caller: Address, + token_address: Address, + ) -> BytesN<32> { + caller.require_auth(); + + let its = Self::its_client(env); + + // Register the token - direct call + let token_id = its.register_canonical_token(&token_address); + + // Store the token ID and original token address for reference + env.storage().instance().set(&DataKey::TokenId, &token_id); + env.storage() + .instance() + .set(&DataKey::OriginalToken, &token_address); + + token_id + } + + /// Get the currently stored token ID + pub fn get_token_id(env: &Env) -> BytesN<32> { + env.storage().instance().get(&DataKey::TokenId).unwrap() + } + + /// Get the original token address + pub fn get_original_token(env: &Env) -> Address { + env.storage() + .instance() + .get(&DataKey::OriginalToken) + .unwrap() + } +``` + +The `register_existing_token` function: + +- Authenticates the caller to ensure they have permission. +- Registers the existing token with the ITS using `register_canonical_token`. +- Stores both the generated `token_id` and the original token address. +- Returns the `token_id` for reference. + +The getter functions allow us to retrieve stored token information: + +- `get_token_id`: Returns the ITS `token_id`. +- `get_original_token`: Returns the address of the original token. + +#### 3. Cross-Chain Functions + +Finally, let's add functions for cross-chain token deployment and transfers: + +```rust + //... + + /// Deploy the existing registered token to another blockchain + pub fn deploy_remote_canonical_token( + env: &Env, + caller: Address, + destination_chain: String, + gas_token_address: Address, + gas_amount: i128, + ) -> BytesN<32> { + caller.require_auth(); + + let its = Self::its_client(env); + + // Get the original token address + let token_address = env + .storage() + .instance() + .get(&DataKey::OriginalToken) + .unwrap(); + + // Prepare gas token + let gas_token = Some(Token { + address: gas_token_address, + amount: gas_amount, + }); + + // Deploy to remote chain - direct call + let token_id = its.deploy_remote_canonical_token( + &token_address, + &destination_chain, + &caller, // spender + &gas_token, + ); + + token_id + } + + /// Transfer interchain tokens to another blockchain + pub fn transfer_tokens( + env: &Env, + caller: Address, + token_id: BytesN<32>, + destination_chain: String, + destination_address: Bytes, + amount: i128, + gas_token_address: Address, + gas_amount: i128, + ) { + caller.require_auth(); + + let its = Self::its_client(env); + + // Basic validation + if amount <= 0 { + panic!("Invalid amount"); + } + + if destination_address.len() == 0 { + panic!("Invalid destination address"); + } + + // Prepare gas token + let gas_token = Some(Token { + address: gas_token_address, + amount: gas_amount, + }); + + // Send the tokens cross-chain - direct call + its.interchain_transfer( + &caller, + &token_id, + &destination_chain, + &destination_address, + &amount, + &None, // No additional data + &gas_token, + ); + } +``` + +The `deploy_remote_canonical_token` function: + +- Deploys the registered token to another blockchain. +- Uses the original token's address (retrieved from storage). +- Configures gas payment for cross-chain operations. +- Returns the `token_id`, which remains consistent across chains. + +The `transfer_tokens` function: + +- Validates the transfer amount and destination address +- Initiates the cross-chain transfer with appropriate gas payment + +With these functions implemented, our contract now provides a complete interface for registering existing tokens and enabling cross-chain transfers. + +## Part 4: Build and Deploy the Contract + +Once your contract code is complete, follow these steps to compile and deploy it on the Stellar testnet. + +### Step 1: Build your contract + +```bash +stellar contract build +``` + +You should see output confirming the build succeeded and showing the location of the `.wasm` file: + +``` +ℹ️ Build Summary: + Wasm File: target/wasm32-unknown-unknown/release/axelar_its_existing_token.wasm + Wasm Hash: ... + Exported Functions: 8 found + ... +✅ Build Complete +``` + +### Step 2: Optimize the WASM file + +```bash +stellar contract optimize --wasm target/wasm32-unknown-unknown/release/axelar_its_existing_token.wasm +``` + +This creates an optimized `.wasm` file you will deploy. + +### Step 3: Deploy the contract to the Stellar testnet + +Use the Stellar CLI to deploy your contract, replacing `YOUR_ACCOUNT_NAME` with your funded Stellar testnet account: + +```bash +stellar contract deploy \ + --wasm target/wasm32-unknown-unknown/release/axelar_its_existing_token.optimized.wasm \ + --source YOUR_ACCOUNT_NAME \ + --network testnet +``` + +On success, you’ll receive a contract address. Save this address, you’ll need it to interact with your contract. + +Example output: + +```bash +✅ Deployed! +CCEJZPYGNDQFFNPZBHD474OJILN32J6PELILJX3ZQ5L4OSXU24LBNXMY +``` + +Your contract address is `CCEJZPYGNDQFFNPZBHD474OJILN32J6PELILJX3ZQ5L4OSXU24LBNXMY`. + +## Part 5: Interacting with your contract on the Stellar testnet + +Now that your contract is deployed on the Stellar testnet, you’ll use the Stellar CLI to: + +- Initialize your contract by connecting it to the Axelar Interchain Token Service (ITS) +- Register your existing Stellar token with the ITS through your contract +- Deploy your registered token representation on the Avalanche Fuji testnet +- Transfer tokens from Stellar to Avalanche Fuji + +### Step 1: Initialize your contract with the ITS address + +Before registering tokens or transferring, your contract needs to know where the ITS service lives on Stellar. + +Run this command, replacing `YOUR_CONTRACT_ADDRESS` and `YOUR_ACCOUNT_NAME` accordingly: + +```bash +stellar contract invoke \ + --network testnet \ + --id YOUR_CONTRACT_ADDRESS \ + --source-account YOUR_ACCOUNT_NAME \ + -- \ + initialize \ + --its_address CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK +``` + +> Note: `CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK` is the address of the Axelar Interchain Token Service contract on the Stellar testnet. You should confirm this address from the [official Axelar documentation for testnet](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/axelar-chains-config/info/testnet.json). You only need to run this once after deployment. + +### Step 2: Check if Avalanche is a trusted chain + +It’s a good practice to verify that ITS trusts the destination chain (Avalanche in this case) before sending tokens. + +A trusted chain is one that the ITS recognizes and allows transfers to and from. To check if Avalanche is trusted, you can use the `is_trusted_chain` function in your contract. +Replace `YOUR_CONTRACT_ADDRESS` and `YOUR_ACCOUNT_NAME` with your contract address and Stellar account name. + +Run the command below: + +```bash +stellar contract invoke \ + --network testnet \ + --id YOUR_CONTRACT_ADDRESS \ + --source-account YOUR_ACCOUNT_NAME \ + -- \ + is_trusted_chain \ + --chain '"Avalanche"' +``` + +> Note: The quotes around the chain name are required due to how the Stellar CLI handles string parameters. You should get a response confirming that Avalanche is trusted: + +``` +ℹ️ Simulation identified as read-only. Send by rerunning with `--send=yes`. +true +``` + +If it returns false, the chain is not yet trusted, and transfers to it won’t work until it’s added. + +### Step 3: Register your existing Stellar token + +Next, register the Stellar token you want to enable for cross-chain transfers. + +Replace `EXISTING_TOKEN_ADDRESS` with your token’s Stellar address and run: + +```bash +stellar contract invoke \ + --network testnet \ + --id YOUR_CONTRACT_ADDRESS \ + --source-account YOUR_ACCOUNT_NAME \ + -- \ + register_existing_token \ + --caller YOUR_ACCOUNT_NAME \ + --token_address EXISTING_TOKEN_ADDRESS +``` + +You should see output similar to: + +``` +ℹ️ Signing transaction: +📅 CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK - Event: [{"symbol":"canonical_token_registered"},{"bytes":""},{"address":""}] = {"vec":[]} +📅 CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK - Event: [{"symbol":"token_manager_deployed"},{"bytes":""},{"address":""},{"address":""},{"u32":1}] = {"vec":[]} +"" +``` + +Example response: + +```bash +ℹ️ Signing transaction: ef633fe0cb694729d0c8edc82ef362245797a86a84121eb75e5fc78d534e0205 +📅 CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK - Event: [{"symbol":"token_manager_deployed"},{"bytes":"29aa926bf713f85c3044d3643abb5f591a3aac4494c18e065d22228ac8dfebe8"},{"address":"CCRMJF6QOPL77F2OTX4EPFZGSADCQL76ESSREBIGSZIX57HKFZAS6B4M"},{"address":"CCZ7G5BIFBBYWSWEUUNFYCLEVZYBDEKPUZKUOJZRI23ZAB3DFYEWC5ED"},{"u32":2}] = {"vec":[]} +"29aa926bf713f85c3044d3643abb5f591a3aac4494c18e065d22228ac8dfebe8" +``` + +The response includes your `token_id` - note it as you'll need it later in this tutorial. + +### Step 4: Deploy your registered token to the Avalanche Fuji testnet + +With your token registered, deploy its representation on the Avalanche Fuji testnet. + +Run the command below, replacing values as needed: + +```bash +stellar contract invoke \ + --network testnet \ + --id YOUR_CONTRACT_ADDRESS \ + --source-account YOUR_ACCOUNT_NAME \ + -- \ + deploy_remote_canonical_token \ + --caller YOUR_ACCOUNT_NAME \ + --destination_chain '"Avalanche"' \ + --gas_token_address CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC \ + --gas_amount 10000000 +``` + +> Notes: +> +> - `CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC` is the address of the native XLM token on Stellar testnet. +> - The gas amount is 1 XLM (100,000,00 stroops). + +You’ll see transaction logs and events confirming the deployment started, and a `token_id` string returned. + +``` +ℹ️ Signing transaction: +📅 CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK - Event: [{"symbol":"token_deployment_started"},{"bytes":""},{"address":""},{"string":"Avalanche"},{"string":""},{"string":""},{"u32":},"void"] = {"vec":[]} +📅 CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC - Event: [{"symbol":"transfer"}, ... ] +... more events ... +"" +``` + +For example: + +````bash +ℹ️ Signing transaction: bbc44b3f76363d295f62800292b38c690735532b469b3018c59bf84860a31ddc +... +{"bytes":"8bb9d9cffca6787421eb6e56752bb87ec0f00900ddd901466475ce4e23a44db2"}] = {...} +"29aa926bf713f85c3044d3643abb5f591a3aac4494c18e065d22228ac8dfebe8" + +This is a cross-chain transaction. You can check its status on Axelarscan testnet explorer by pasting the transaction hash as shown [here](https://testnet.axelarscan.io/gmp/bbc44b3f76363d295f62800292b38c690735532b469b3018c59bf84860a31ddc). + +### Step 5: Transfer tokens cross-chain from Stellar to Avalanche + +Finally, send some tokens to your Avalanche wallet. + +Prepare your Avalanche address (without the `0x` prefix), and run: + +```bash +stellar contract invoke \ + --network testnet \ + --id YOUR_CONTRACT_ADDRESS \ + --source-account YOUR_ACCOUNT_NAME \ + -- \ + transfer_tokens \ + --caller YOUR_ACCOUNT_NAME \ + --destination_chain '"Avalanche"' \ + --destination_address '"YOUR_AVALANCHE_ADDRESS"' \ + --amount 100000000 \ + --token_id TOKEN_ID \ + --gas_token_address CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC \ + --gas_amount 10000000 +```` + +> Notes: +> +> - The amount is 10 tokens with whatever decimal places your token uses (adjust accordingly). +> - The gas is still 1 XLM as in the previous example. + +You should see output similar to: + +``` +ℹ️ Signing transaction: +📅 - Event: [{"symbol":"transfer"}, ... ] = {"i128": ... } +📅 CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK - Event: [{"symbol":"interchain_transfer_sent"},{"bytes":""},{"address":""},{"string":"Avalanche"},{"bytes":""},{"i128":...}] = {"vec":["void"]} +... more events ... +``` + +For example: + +```bash +ℹ️ Signing transaction: 4386580b551692c0b9c1c25c5c7158cbd2270f98fcbfcbdf46f5dd867c5ca645 +{...} +``` + +This is a cross-chain transaction. You can check its status on Axelarscan testnet explorer by pasting the transaction hash as shown [here](https://testnet.axelarscan.io/gmp/4386580b551692c0b9c1c25c5c7158cbd2270f98fcbfcbdf46f5dd867c5ca645). + +## Part 6: Receiving Tokens on Avalanche Fuji Testnet + +After the cross-chain transfer is completed, you can find the address of your token on Avalanche by checking the Axelarscan explorer for your cross-chain transaction or your address on Avalanche Fuji testnet. For example [here](https://testnet.snowtrace.io/address/0x510e5EA32386B7C48C4DEEAC80e86859b5e2416C/tokentxns?tokenaddresses=0xc3Aa19e24aD9dB60A262C753Aaa33F2F9A1b7B16&chainid=43113#erc20) + +Now you should be able to see your token balance in your wallet. + +You can find the full code example [here](https://github.com/axelarnetwork/stellar-its-example). + +## Conclusion + +You've now learned how to: + +1. Register an existing token on Stellar with the Interchain Token Service +2. Make it available on an EVM chain +3. Transfer tokens between blockchains + +This approach allows you to make any existing Stellar token cross-chain compatible, opening up new possibilities for your assets. diff --git a/src/content/docs/dev/send-tokens/sui/intro.mdx b/src/content/docs/dev/send-tokens/sui/intro.mdx new file mode 100644 index 000000000..531e62e81 --- /dev/null +++ b/src/content/docs/dev/send-tokens/sui/intro.mdx @@ -0,0 +1,690 @@ +import { Callout } from "../../../../../components/callout"; + +# Sui Interchain Token Service (ITS) + +Axelar's [Interchain Token Service (ITS)](https://www.axelar.network/its) is live on the Sui blockchain to allow for the integration of coins on Sui to be sent to/from [other ecosystems](https://axelarscan.io/resources/chains) connected to the Axelar Network. ITS allows teams to deploy fresh new fungible [Interchain Tokens](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token/sources/interchain_token.move) as well as integrate custom tokens that want to go cross-chain. ITS is already live on many different EVM and non-evm chains, so that you can send your Sui coins to and from those chains. + +The official Sui integration codebase can be found [here](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/interchain_token_service) + + + The simplest way to use ITS is through Axelar's [ITS + Portal](https://interchain.axelar.dev/), which also supports Sui. The [ITS Testnet + Portal](https://testnet.interchain.axelar.dev/). + + + + +## Register Coin + +To integrate a coin with Sui you must first register the coin with ITS. There are different ways to register the coin, depending on how the coin is being integrated. For canonical integrations where the coin on Sui will be connected to a wrapped interchain token on a remote chain you will register the coin on Sui via either [register_coin_from_info()](#register-coin-from-info) or [register_coin_from_metadata()](#register-coin-from-metadata). If you are connecting your Sui coin to a customized token on a different blockchain you will need to call [register_custom_coin()](#register-custom-coin), followed by [link_coin()](#link-coin). + +### Register Coin From Info + +If you want to register your coin by explicitly passing in its information you will need to register your coin via the `register_coin_from_info()` function. The function returns a new [TokenId](#token-id) and takes five parameters: + +1. `its`: The ITS object that will be updated once the new coin is registered. +1. `name`: The name of the coin being registered. +1. `symbol`: The symbol of the coin being registered. +1. `decimals`: The amount of decimals the coin being registered has. +1. `coin_management`: The type of [management](#coin-management) the coin is registered with. + +The function is defined as follows: + +```rust +public(package) fun register_coin_from_info( + self: &mut InterchainTokenService, + name: std::string::String, + symbol: ascii::String, + decimals: u8, + coin_management: CoinManagement, +): TokenId {} +``` + +This will be a commonly used registration flow as Sui coins often times [freeze](https://docs.sui.io/concepts/object-ownership/immutable#create-immutable-object) its metadata so that no one can alter critical configuration about the coin such as its name, symbol, and decimals. + +### Register Coin from Metadata + +If you do not want to explicitly pass in your coin's info, then you can register the coin via `register_coin_from_metadata()` function. Whereas the previous `register_coin_from_info()` may be simpler to use, this coin registration prevents against human error, for example, a typo in the symbol or name since the coin paramaters are not validated in any way. The function returns a new [TokenId](#token-id) and takes three parameters: + +1. `its`: The ITS object that will be updated once the new coin is registered. +1. `metadata`: A generic reference to the coin's metadata that contains the coins name, symbol, and decimals. +1. `coin_management`: The type of [management](#coin-management) the coin is registered with. + +```rust +public(package) fun register_coin_from_metadata( + self: &mut InterchainTokenService, + metadata: &CoinMetadata, + coin_management: CoinManagement, +): TokenId {} +``` + +The coin management must be constructed beforehand, ITS will not construct this automatically for you. + +### Register Custom Coin +To integrate a coin into ITS, the `register_coin()` function must be called. This function takes in the following parameters: + +1. `its`: The ITS object that will be updated once the new coin is registered +1. `coin_info`: The [coin info](#coin-info) represents the name, symbol and decimals of the coin +1. `coin_management`: The type of [management](#coin-management) the coin is registered with. + +However, before you can register your coin, you must first create a [coin-manager](#coin-management) and a [coin-info](#coin-info) for it. + +```rust +public fun register_coin( + self: &mut ITS, + coin_info: CoinInfo, + coin_management: CoinManagement, +): TokenId { + let value = self.value_mut!(b"register_coin"); + + value.register_coin(coin_info, coin_management) +} +``` + +Once triggered, ITS will generate a unique [token id](#token-id) from the coin's metadata and management details. Then it will [add](https://docs.sui.io/references/framework/sui/bag#sui_bag_add) the tokenId to the `registered_coins` bag. The full implementation of the `register_coin()` function can be found [here](https://github.com/axelarnetwork/axelar-cgp-sui/blob/v1.1.3/move/interchain_token_service/sources/versioned/interchain_token_service_v0.move#L166) + +See [here](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/sui/its-example.js#L195) for an example of registering a new coin. + +## Register Coin Metadata + +The `register_coin_metadata()` function is used to register the [TokenMetadata](https://github.com/axelarnetwork/axelar-amplifier/blob/main/packages/interchain-token-service-std/src/primitives.rs#L82) msg type with [ITS Hub](/dev/amplifier/its-hub/introduction/) in order to register token data in ITS hub. This function is required to be called on each chain where you token is being integrated to ITS on if you are planning on linking a custom token. + +Note: This function is separate from [register_coin_from_metadata](#register-coin-from-metadata), which is used for registering canonical tokens for Sui. + +The `register_coin_metadata()` returns a [MessageTicket](/dev/general-message-passing/sui/gmp-contracts/#message-ticket) and takes the following two parameters: + +1. `its`: The ITS object that will be updated once the token's metadata is registered. +1. `coin_metadata`: The metadata of the coin to be registered. + +It is written as follows: + +```rust +public fun register_coin_metadata(self: &InterchainTokenService, coin_metadata: &CoinMetadata): MessageTicket {} +``` + + + +## Link Coin + +If you are looking to connect your custom coin on Sui to a custom coin on another blockchain, such as Ethereum, you will need to *link* the coin between the two chains. The linking process can only take place after the [register_custom_coin](#register-custom-coin) function has been called. The `link_coin()` function is defined as follows: + +The function takes seven parameters and returns a [MessageTicket](/dev/general-message-passing/sui/gmp-contracts/#message-ticket). + +1. `its`: The ITS object that will be updated once the new token is linked. +1. `deployer` The deployer’s [channel](/dev/general-message-passing/sui/gmp-contracts/#channel) capability. Used to derive the custom [tokenId](#token-id) with the `salt` and `chain_name`, so only that channel’s holder can link that custom token. +1. `destination_chain`: The name of the chain where the token is being linked to. +1. `destination_token_address`: The address of the token the sui coin is being linked to. +1. `token_manager_type`: The [type of manager](#coin-management) to be deployed on the destination chain. +1. `link_params`: An array of bytes representing an address to be used as the operator on the destination chain + +```rust +public fun link_coin( + self: &InterchainTokenService, + deployer: &Channel, + salt: Bytes32, + destination_chain: String, + destination_token_address: vector, + token_manager_type: TokenManagerType, + link_params: vector, +): MessageTicket {} +``` + +The complete linking token flow is as follows: + +1. Deploy your custom token on each chain +1. [Register coin metadata](#register-coin-metadata) +1. [Register custom coin on home chain](#register-custom-coin) +1. [Link coin from home chain](#link-coin) + +## Deploy Remote Interchain Token + +If you are starting from scratch and want to deploy a fresh new token with cross-chain functionality built into it, you can trigger the `deploy_remote_interchain_token()` function. This function will deploy a new _Interchain Token_ on a different blockchain via a cross-chain [GMP call](https://docs.axelar.dev/dev/general-message-passing/overview/#general-message-passing). + +The function takes three parameters: + +1. `its`: The ITS object that will be updated once the new token is registered. +1. `token`: The [token_id](#token-id) representing the token to be deployed on the destination chain. +1. `destination_chain`: The name of the destination chain to deploy the token on. + +```rust +public fun deploy_remote_interchain_token( + self: &InterchainTokenService, + token_id: TokenId, + destination_chain: String, +): MessageTicket { + let value = self.value!(b"deploy_remote_interchain_token"); + + value.deploy_remote_interchain_token(token_id, destination_chain) +} +``` + +Since this function makes a cross-chain call, it will return a [MessageTicket](/dev/general-message-passing/sui/gmp-contracts/#message-ticket) for the cross-chain transaction. The full implementation of the `deploy_remote_interchain_token()` can be found [here](https://github.com/axelarnetwork/axelar-cgp-sui/blob/v1.1.3/move/interchain_token_service/sources/versioned/interchain_token_service_v0.move#L178). + +See here for an [example](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/sui/its-example.js#L107) of how to run a cross-chain deployment for a new coin. + +## Interchain Transfer + +Once your coin has been integrated with ITS, you can use the `send_interchain_transfer()` function to send it cross-chain to another chain where it has been integrated. Sending an interchain transfer is a two-step process. + +The first step is to prepare the [Interchain Transfer Ticket](#interchain-ransfer-ticket) via the [prepare_interchain_transfer](#prepare-interchain-transfer) function. Once the ticket is created, you can trigger the [send_interchain_transfer](#send-interchain-transfer) function. Breaking up the transfer into a two-step process allows the package to be more flexible in the case of an upgrade. + + + + +Other functions that return `MessageTickets` in ITS include: + +- `link_coin()` +- `register_coin_metadata()` +- `deploy_remote_interchain_token()` +- `send_interchain_transfer()` + + + +### Prepare Interchain Transfer + +This will create the `InterchainTransferTicket` to be passed into the `send_interchain_transfer()` + +The function takes six parameters: + +1. `token_id`: The id of the coin being sent. +1. `coin`: The actual [coin](https://docs.sui.io/standards/coin) being sent. +1. `destination_chain`: The name of the chain the coin is being sent to. +1. `destination_address`: The address on the destination chain the coin is being sent to. +1. `metadata`: Executable data being sent along with the coin for a contract on the destination chain to handle. +1. `source_channel`: The [channel](/dev/general-message-passing/sui/gmp-contracts/#channel) where the message is being sent to. This channel will serve as the source address for the transaction on the destination chain. + +```rust +public fun prepare_interchain_transfer( + token_id: TokenId, + coin: Coin, + destination_chain: String, + destination_address: vector, + metadata: vector, + source_channel: &Channel, +): InterchainTransferTicket { + interchain_transfer_ticket::new( + token_id, + coin.into_balance(), + source_channel.to_address(), + destination_chain, + destination_address, + metadata, + VERSION, + ) +} +``` + + +### Why Prepare Interchain Transfer is Necessary? + +In EVM upgradability on the other hand, smart contracts are replaced atomically. This means that when you upgrade a contract, the proxy automatically knows that it should make a `delegatecall` to a new implementation (as the upgrade comes from swapping in a new implementation at the proxy's storage slot, making the old implementation unreachable). This means that when a package is upgraded, the shared objects created by the old package continue to exist and retain their original data structures, even as new package versions are deployed. Unlike EVM where a proxy immediately redirects all calls to the new implementation, Sui objects must explicitly manage which version of the package logic should handle their operations. + +If ITS were to get updated to a new version, the ITS object itself upgrades to the new version, but tickets created before the upgrade still exist with their old version stamps. To ensure backwards compatibility and prevent version mismatches, the `prepare_interchain_transfer()` function creates a `ticket` with a version stamp indicating which version of ITS was active when the ticket was created. When `send_interchain_transfer()` processes the ticket, it can check the version compatibility and either: + +1. Process the ticket with v0-compatible logic if it's an old ticket +1. Process it with v1 logic if it's a new ticket +1. Reject it if the ticket is from a newer version than the current ITS + +### Send Interchain Transfer + +With the ticket now created, you can use it with the `send_interchain_transfer()` function. Once called, `send_interchain_transfer()` will trigger the cross-chain call to send the coin from the source chain to the destination chain. + +The function takes three parameters: + +1. `its`: The ITS object that will be updated once the new coin is registered. +1. `ticket`: The [ticket](#interchain-transfer-ticket) representing the coin transfer. +1. `clock`: A [clock](https://docs.sui.io/references/framework/sui/clock) module that provides the time of the transfer. + +```rust +public fun send_interchain_transfer( + self: &mut InterchainTokenService, + ticket: InterchainTransferTicket, + clock: &Clock, +): MessageTicket { + let value = self.value_mut!(b"send_interchain_transfer"); + + value.send_interchain_transfer( + ticket, + VERSION, + clock, + ) +} +``` + +See here for an [example](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/sui/its-example.js#L65) of how to use the `send_interchain_transfer()` + +The full `send_interchain_transfer()` implementation can be found [here](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/versioned/interchain_token_service_v0.move#L212) + +## Receive Interchain Transfer + +When tokens are sent to Sui, the [Relayer Discovery](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/discovery.move) module triggers the `receive_interchain_transfer()` function on the Sui ITS module. An application must register with the `relayer_discovery` and use a `channel` they control as the destination address to receive tokens with data. + +The function takes four parameters: + +1. `its`: The ITS object that will be updated once the new coin is registered. +1. `approved_message`: The cross-chain [message](/dev/general-message-passing/sui/sui-programs/#approvedmessage) sent with the receiving instructions for the coin. +1. `clock`: A [clock](https://docs.sui.io/references/framework/sui/clock) module that provides the time of the transfer. +1. `ctx`: The [transaction context](https://docs.sui.io/references/framework/sui/tx_context#sui_tx_context_TxContext) provides the necessary runtime environment for creating or modifying objects and state. + +```rust +public fun receive_interchain_transfer( + self: &mut InterchainTokenService, + approved_message: ApprovedMessage, + clock: &Clock, + ctx: &mut TxContext, +) { + let value = self.value_mut!(b"receive_interchain_transfer"); + + value.receive_interchain_transfer(approved_message, clock, ctx); +} +``` + +Once the relayer triggers this function, it, in turn, triggers the [give_coin](#give-coin) function on the Coin Management program. Once `give_coin()` has run, the function will transfer the coin to the destination address. + +The full `receive_interchain_transfer()` can be found [here](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/versioned/interchain_token_service_v0.move#L247) + +### Receive Interchain Transfer With Data + +If the source chain sends executable metadata along with the transaction, the `receive_interchain_transfer_with_data()` function will handle that data. + +It takes the same parameters as the previous `receive_interchain_transfer()` function, except it also includes a `channel` parameter. The channel checks if the payload's destination address matches the channel's address, ensuring that messages with extra data are correctly routed. + +For the channel to be available, the package must be registered with `relayer_discovery` and use a `channel` they control as the destination address. + +The key difference with `receive_interchain_transfer_with_data()` is that the function `asserts` that the `data` being sent is not empty and does not simply transfer the coin to the destination address. This function is designed for transfers that carry extra information and require additional routing and validation steps, while the standard version is for simple transfers that don't include extra data and perform the transfer immediately. It is up to the caller to decide how to transfer the coin once the function returns. + +```rust +public fun receive_interchain_transfer_with_data( + self: &mut InterchainTokenService, + approved_message: ApprovedMessage, + channel: &Channel, + clock: &Clock, + ctx: &mut TxContext, +): (String, vector, vector, Coin) { + let value = self.value_mut!(b"receive_interchain_transfer_with_data"); + + value.receive_interchain_transfer_with_data( + approved_message, + channel, + clock, + ctx, + ) +} +``` + +See here for an [example](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/sui/its-example.js#L124) of how to receive a transfer with data. + +The full `receive_interchain_transfer_with_data()` implementation can be found [here](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/versioned/interchain_token_service_v0.move#L282) + +## Coin Management + +A centerpiece of the ITS design is the [Coin Management](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/types/coin_management.move) module (akin to the [token manager](/dev/send-tokens/interchain-tokens/token-manager/) contract for EVM chains). The `Coin Management` module facilitates integrating the `coin` and `ITS`. It is created before registering a coin. It encapsulates key functionalities such as minting, burning, managing balances, and enforcing [flow limits](#flow-limit) for cross‐chain operations. + +Coin managers can be initialized as either a [capped](#capped-management) manager or [locked](#locked-management). The module stores the following fields: + +1. `treasury_cap`: An optional [capability](https://docs.sui.io/standards/coin#treasury-capability) that, if present, allows minting and burning of coins. +1. `balance`: An optional balance used when managing locked coins (i.e., already in circulation). +1. `distributor`: An optional address authorized for minting and burning operations. +1. `operator`: An optional address authorized to set flow limits for the coin. +1. `flow_limit`: A structure that tracks coins' allowed inflow and outflow to control their movement. +1. `dust`: A field (type u256) tracking leftover coins after transfers. + +```rust +public struct CoinManagement has store { + treasury_cap: Option>, + balance: Option>, + distributor: Option
    , + operator: Option
    , + flow_limit: FlowLimit, + dust: u256, +} +``` + +A coin management object must be created before the coin is registered with ITS. + +### Capped Management + +Capped Management types create a new `CoinManagement` with a [Treasury Cap](https://docs.sui.io/standards/coin#treasury-capability). This type of `CoinManagement` allows the minting and burning of coins, meaning when the coin is sent out of Sui, it is burned, and when it is sent back into Sui, it is minted. This is a valuable manager type if your coin is natively integrated into a number chain. In other words, when there is no canonical implementation of the coin on a single chain on which all other coins depend, Integrating a `capped` manager type involves calling the following factory function. + +```rust +public fun new_with_cap(treasury_cap: TreasuryCap): CoinManagement { + CoinManagement { + treasury_cap: option::some(treasury_cap), + balance: option::none(), + distributor: option::none(), + operator: option::none(), + flow_limit: flow_limit::new(), + dust: 0, + } +} +``` + +See [here](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/sui/its-example.js#L201) for an example of deploying new capped managers. + +### Locked Management + +Locked Management types Create a new `CoinManagement` with a `Balance`. The stored `Balance` can be used to take and put coins. This manager type will lock the sent coin with ITS when the coin is sent out of Sui and unlock the coin when it is sent back into the Sui ecosystem. This type of manager is very useful if Sui is the _home-chain_ for your ITS integration and you use wrapped coins on other chains that derive back to the canonical coin on Sui. Integrating the ` new_locked` manager type involves calling the following factory function. + +```rust +public fun new_locked(): CoinManagement { + CoinManagement { + treasury_cap: option::none(), + balance: option::some(balance::zero()), + distributor: option::none(), + operator: option::none(), + flow_limit: flow_limit::new(), + dust: 0, + } +} +``` + +See [here](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/sui/its-example.js#195) for an example of deploying a new locked manager. + +### Give Coin + +The Management module triggers the `give_coin()` function when the coin is sent into the Sui ecosystem. This function updates the incoming [flow limit](#flow-limit) and then either mints new coins (if the instance has a [treasury capability](https://docs.sui.io/standards/coin#treasury-capability)) or withdraws coins from the internal balance. It returns the coin object that is ready to be transferred. + +```rust +public(module) fun give_coin(self: &mut CoinManagement, amount: u64, clock: &Clock, ctx: &mut TxContext): Coin { + self.flow_limit.add_flow_in(amount, clock); + if (has_capability(self)) { + self.mint(amount, ctx) + } else { + coin::take(self.balance.borrow_mut(), amount, ctx) + } +} +``` + +### Take Balance + +When the coin is out of the Sui ecosystem, the Management module will trigger the `take_balance()` function. This function updates the [flow limit](#flow-limit) for an outgoing transfer and then either burns the coins (if the minting capability is available) or merges the deducted amount into the stored balance. It returns the numeric amount (as a `u64`) taken. + +```rust +public(package) fun take_balance(self: &mut CoinManagement, to_take: Balance, clock: &Clock): u64 { + self.flow_limit.add_flow_out(to_take.value(), clock); + let amount = to_take.value(); + if (has_capability(self)) { + self.burn(to_take); + } else { + self.balance.borrow_mut().join(to_take); + }; + amount +} +``` + +### Set Flow Limit + +To set a specific [flow limit](#flow-limit) amount, trigger the `set_flow_limit_as_token_operator()` function. + +The function takes four parameters: + +1. `self`: The module that will be updated once the `flow_limit` is set. +1. `channel`: A reference to the `Channel` object to derive the caller's address. The address is checked to ensure that only the authorized operator can change the `flow_limit`. +1. `token_id`: The [token id](#token-id) representing the token to be set. +1. `limit`: An optional unsigned 64-bit integer representing the new flow limit. + +```rust +public fun set_flow_limit_as_token_operator( + self: &mut InterchainTokenService, + channel: &Channel, + token_id: TokenId, + limit: Option, +) {} +``` + +Note: A flow limit of `0` corresponds to no flow limit set at all. If you wish to remove your flow limit it should be set to 0. To halt transfers of your coin in/out of Sui you can set the flow limit to a near `0` value, effectively halting cross-chain transfers. + +## Roles + +The Coin Management module has set roles that can handle specific functionality. + +### Distributor + +An address set within the CoinManagement instance that is authorized to perform minting/burning operations. Only CoinManagement instances with a [treasury capability](https://docs.sui.io/standards/coin#treasury-capability) can add a distributor. + +#### Add Distributor + +The `add_distributor()` function in the [Coin Management package](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/types/coin_management.move) takes two parameters: + +1. `self`: The module that will be updated once the `distributor` is set. +1. `distributor`: The address of the `distributor` to be set. The address that is added should be an [address](https://docs.sui.io/references/sui-api/sui-graphql/reference/types/objects/address) type of your Channel. + +```rust +public fun add_distributor(self: &mut CoinManagement, distributor: address) { + assert!(self.has_treasury_cap(), EDistributorNeedsTreasuryCap); + self.distributor.fill(distributor); +} +``` + +The `add_distributor()` function must be called before the coin is [registered](#register-coin). This function can be called by the address that owns a [Coin Management](#coin-management). However, once the coin is registered with ITS this function is no longer callable as ownership of the `Coin Management` object (which in turn owns the `Distributor` object) is passed to ITS itself. If in the future you wish to change the `Distributor` that was set before the coin was registered, you can transfer the `Distributor` with the [transfer distributor](#transfer-distributor) function. + + +#### Transfer Distributor + +After registration, CoinManagement is owned by ITS and `add_distributor()` is no longer callable. To change/remove the distributor, call `transfer_distributorship()`. This succeeds only if `current_distributor_channel.to_address()` matches the stored distributor. + +The function takes four parameters: + +1. `self`: The module that will be updated once the `distributor` is set. +1. `channel`: The channel that is able to update the `distributor`. +1. `token_id`: The id of the coin that will receive the new operator. +1. `new_distributor`: The address of the new `distributor` to be set. + +```rust +public(package) fun transfer_distributorship( + self: &mut InterchainTokenService_v0, + channel: &Channel, + token_id: TokenId, + new_distributor: Option
    , +) {} +``` + + +### Operator + +An address authorized to update [flow limits](#flow-limit) for coin transfers. When setting a new flow limit, the module verifies that the caller's channel address matches the stored operator address to ensure only the operator can make that change. An operator can be registered by triggering the `add_operator()` function. + + +#### Add Operator + +The `add_operator()` function defined in the [Coin Management package](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/types/coin_management.move) takes two parameters: + +1. `self`: The module that will be updated once the `operator` is set. +1. `operator`: The address of the `operator` to be set. The address that is added should be an [address](https://docs.sui.io/references/sui-api/sui-graphql/reference/types/objects/address) type of your Channel. + +It is defined as follows: + +```rust +public fun add_operator(self: &mut CoinManagement, operator: address) { + self.operator.fill(operator); +} +``` + +The `add_operator()` function must be called before the coin is [registered](#register-coin). This function can be called by the address that has created the [Coin Management](#coin-management) object. However, once the coin is registered with ITS this function is no longer callable as ownership of the `Coin Management` object (which in turn owns the `Operator` object) is passed to ITS itself. If in the future you wish to change the `Operator` that was set before the coin was registered, you can transfer the `Operator` with the [transfer operator](#transfer-operator) function. + +#### Transfer Operator + +The `transfer_operatorship()` function takes four parameters: + +1. `self`: The module that will be updated once the new `operator` is set. +1. `channel`: The channel that is able to update the `operator`. +1. `token_id`: The id of the coin that will receive the new `operator`. +1. `new_operator`: The address of the new `operator` to be set. + + +```rust +public fun transfer_operatorship( + self: &mut InterchainTokenService, + channel: &Channel, + token_id: TokenId, + new_operator: Option
    , +) {} +``` + + +## Flow Limit + +A [Flow Limit](/dev/send-tokens/interchain-tokens/flow-limit/) represents the volume of a coin that can be transferred in/out of Sui via ITS. This limit plays a critical role in maintaining network integrity and security. When coins are sent out of Sui. The flow limit logic can be found in its own [Flow Limit Module](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/types/flow_limit.move). The duration of a `flow_limit` is set to an `epoch`. An `epoch` lasts for six hours. It is calculated as follows: + +```rust +const EPOCH_TIME: u64 = 6 * 60 * 60 * 1000; +``` + +The module has several pieces of functionality that are triggered by the [Coin Management](#coin-management) module. + +### Add Flow In + +This is triggered each time the `give_coin()` function is executed. It increments the `flow_in` value to track when the `flow_limit` is reached. + +```rust +public(package) fun add_flow_in(self: &mut FlowLimit, amount: u64, clock: &Clock) { + if (self.flow_limit.is_none()) { + return + }; + let flow_limit = *self.flow_limit.borrow() as u128; + + update_epoch(self, clock); + assert!(self.flow_in + (amount as u128) < flow_limit + self.flow_out, EFlowLimitExceeded); + self.flow_in = self.flow_in + (amount as u128); +} +``` + +### Add Flow Out + +This is triggered each time the `take_balance()` function is executed. It increments the `flow_out` value to track when the `flow_limit` is reached. + +```rust +public(package) fun add_flow_out(self: &mut FlowLimit, amount: u64, clock: &Clock) { + if (self.flow_limit.is_none()) { + return + }; + let flow_limit = *self.flow_limit.borrow() as u128; + + update_epoch(self, clock); + assert!(self.flow_out + (amount as u128) < flow_limit + self.flow_in, EFlowLimitExceeded); + self.flow_out = self.flow_out + (amount as u128); +} +``` + +## Token Id + +A `tokenId` is a unique identifier for an ITS integration. Since ITS is a permissionless service, anyone can, in theory, integrate a deployed coin. The `tokenId` differentiates between the potentially many different integrations of a coin with ITS. + +The module for the Sui coin id can be found [here](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/types/token_id.move). + +A `TokenId` is a wrapper of a coin's address. + +```rust +public struct TokenId has a copy, drop, store { +id: address, +} + +``` + +## Coin Info + +The coin info defines the `CoinInfo` type, which stores information about a coin: + +The following fields are available for CoinInfo + +1. `name`: The name of the coin. +1. `symbol`: The symbol of the coin. +1. `decimals`: The amount of decimals the coin can hold. +1. `metadata`: The [metadata](https://docs.sui.io/references/sui-api/sui-graphql/reference/types/objects/coin-metadata) for the coin. + + + Since coins are `u64,` some conversion might need to happen when receiving + coins, as decimals of 18 are too large for Sui to handle. + + +```rust +public struct CoinInfo has store { + name: String, + symbol: ascii::String, + decimals: u8, + metadata: Option>, +} +``` + +You can run one of two factory functionalities to create a new Coin Info module for your coin. + +### From Info + +This will create new Coin Info based on the given name, symbol, and decimals. The selection alongside the coin type will result in a unique `TokenId`. + +```rust +public fun from_info(name: String, symbol: ascii::String, decimals: u8): CoinInfo { + CoinInfo { + name, + symbol, + decimals, + metadata: option::none(), + } +} + +``` + +An example of how to register a new Coin Info with `from_info()` can be found [here](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/example/sources/its/its.move#L141) + +### From Metadata + +This will create a new coin info from the given `CoinMetadata` object. This can only be done once per coin since there is only one CoinMetadata per Coin. + +```rust +public fun from_metadata(metadata: CoinMetadata): CoinInfo { + CoinInfo { + name: metadata.get_name(), + symbol: metadata.get_symbol(), + decimals: metadata.get_decimals(), + metadata: option::some(metadata), + } +} +``` + +## Interchain Transfer Ticket + +The Interchain Transfer Ticket contains a unique type to be sent for each transfer, holding all the info required for an interchain transfer. It includes the following fields: + +1. `token_id`: The id of the coin being sent cross-chain. +1. `balance`: A wrapped [balance](https://docs.sui.io/references/sui-api/sui-graphql/reference/types/objects/balance) object representing the coin amount to be transferred, which is later converted to a numeric amount. +1. `source_address`: The address initiating the transfer. +1. `destination_chain`: The name of the blockchain where the coin is being sent to. +1. `destination_address`: The receive address on the destination chain. +1. `metadata`: Additional executable data to be sent with the coin. +1. `version`: The version of ITS that is being used for this transfer. + +```rust +public struct InterchainTransferTicket { + token_id: TokenId, + balance: Balance, + source_address: address, + destination_chain: String, + destination_address: vector, + metadata: vector, + version: u64, +} + +``` + +To create an `InterchainTransferTicket,` you can trigger the `prepare_interchain_transfer_ticket()` on ITS. + +```rust +public fun prepare_interchain_transfer( + token_id: TokenId, + coin: Coin, + destination_chain: String, + destination_address: vector, + metadata: vector, + source_channel: &Channel, +): InterchainTransferTicket { + interchain_transfer_ticket::new( + token_id, + coin.into_balance(), + source_channel.to_address(), + destination_chain, + destination_address, + metadata, + VERSION, + ) +} +``` \ No newline at end of file diff --git a/src/content/docs/dev/send-tokens/sui/register-existing-sui-token.mdx b/src/content/docs/dev/send-tokens/sui/register-existing-sui-token.mdx new file mode 100644 index 000000000..2f1a92c0c --- /dev/null +++ b/src/content/docs/dev/send-tokens/sui/register-existing-sui-token.mdx @@ -0,0 +1,1008 @@ +import { Callout } from "../../../../../components/callout"; + + +# Register Existing Sui Token With Interchain Token Service + + +This guide demonstrates, step-by-step, how to use [Axelar's Interchain Token Service (ITS)](/dev/send-tokens/interchain-tokens/intro/#interchain-token-service) to register an existing token on Sui and make it available for cross-chain transfers. + +By the end, you will be able to: + +1. Register an existing token on Sui with Axelar ITS. +1. Deploy that token representation on an EVM chain (Ethereum Sepolia testnet). +1. Transfer tokens seamlessly between Sui and the EVM chain. + +## Prerequisites + +Before starting, make sure you have the following ready: + +- Rust installed with the wasm32 target enabled ([installation instructions](https://www.rust-lang.org/tools/install)) +- A Sui testnet account funded with testnet tokens +- The [Sui CLI](https://docs.sui.io/references/cli/client) installed and configured +- A browser wallet like [Slush Wallet](https://chromewebstore.google.com/detail/slush-%E2%80%94-a-sui-wallet/opcgpfmipidbgpenhmajoajpbobppdil) to connect to Sui testnet. + + + + +## Part 1: Understanding the Interchain Token Service + +The [Interchain Token Service (ITS)](https://github.com/axelarnetwork/axelar-cgp-sui/tree/main/move/interchain_token_service) is a protocol that allows tokens to move freely between different blockchains. + +ITS allows you to register existing tokens you own on Sui and seamlessly transfer their value across chains. This example will achieve this through a canonical token integration, meaning: + +- When you transfer your Sui token to another chain, ITS _locks_ the token on Sui +- It _mints_ a corresponding wrapped token on the destination chain +- When tokens move back to Sui, the wrapped tokens are _burned_ and the original tokens are _unlocked_ + + + There can only be a single lock/unlock token manager for the token for a given integration. If the lock/unlock manager for this coin's integration is on Sui, then the coin managers for the other tokens integrated on other chains must be mint/burn. + + +## Part 2: Set up your Sui ITS project + +To setup a new Sui project run the command: +```bash +sui move new its_demo +``` + +Among other items, this will create a `sources` folder and `move.toml` file. The `sources` folder will contain the Sui Move code for your ITS project, and the `move.toml` file will contain the configuration for your project. + +The three key configurations for your `move.toml` file are + +1. The package - The name of your package being deployed. +1. The dependencies - The dependencies your package will need. +1. The addresses - The address is a spot for a human readable address of the where the package is deployed. + +The completed `move.toml` file should look like this: + +```toml +[package] +name = "my_coin" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move + +[dependencies] +Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/testnet" } + +[addresses] +my_coin = "0x0" #0x0 is a placeholder for a package not yet deployed. +``` + +## Part 3: Deploy Sui Coin + +This part can be skipped if you already have a Sui coin deployed. For the sake of this demo we will use a very straightforward coin implementation on the Sui testnet. Worth noting that although this coin is simple, ITS is able to handle much more robust custom coin implementations as well. + +We will use the coin example straight from the official [Sui documentation](https://docs.sui.io/guides/developer/coins). + +The coin has the ability to `drop` (burn) and `mint` coins. In it's `init` function, it creates a treasury cap and metadata for the coin, and transfers the initial supply to the sender. When dealing with Sui coins, a [treasury cap](https://docs.sui.io/standards/coin#treasury-capability) is used to grant permission to mint additional coins. A coin's [metadata](https://docs.sui.io/references/sui-api/sui-graphql/reference/types/objects/coin-metadata) corresponds to an object that contains information about the coin, such as its `name`, `symbol`, and `decimals`. + +Once the coin is created the rest of the `init` function will freeze the metadata so that anyone can alter this vital information about the coin once it's deployed. Finally, the `treasury cap` object is transferred to the deployer, giving them sole ability to mint new coins. + +The `mint()` function allows the owner of the treasury cap to mint new coins and transfer them to a specified recipient. + +```rust +// Declare module +module my_coin::my_custom_coin; + +// Import necessary modules +use sui::coin::{Self, TreasuryCap}; + +//move resource type +public struct MY_CUSTOM_COIN has drop {} + +fun init(witness: MY_CUSTOM_COIN, ctx: &mut TxContext) { + let (treasury, metadata) = coin::create_currency( + witness, + 6, + b"MCC", + b"My Custom Token", + b"", + option::none(), + ctx, + ); + //make metadata immutable + transfer::public_freeze_object(metadata); + //transfer initial supply to sender + transfer::public_transfer(treasury, ctx.sender()) +} + + +public fun mint( + treasury_cap: &mut TreasuryCap, + amount: u64, + recipient: address, + ctx: &mut TxContext, +) { + let coin = coin::mint(treasury_cap, amount, ctx); + transfer::public_transfer(coin, recipient) +} +``` + + +At this point you should be able to compile your token. This can be done by running: + +```bash +sui move build +``` + +Great! At this point you now have a compiled Sui coin. Before being able to integrate it to ITS you will need to deploy the coin to the Sui testnet. + +If you are unable to compile your coin, you can compare your code with the [first checkpoint](https://github.com/benjamin852/sui-its-example/tree/checkpoint1). + + +## Part 4: Deploy Sui Token + +Sui allows you to deploy Move packages via the [Sui CLI](https://intro.sui-book.com/unit-one/lessons/5_contract_deployment.html#deploying-the-contract). Although this would work, this document will use Mysten's [JavaScript SDK](https://intro.sui-book.com/unit-one/lessons/5_contract_deployment.html#deploying-the-contract) to deploy the token and interact with deployed packages. + +Before building out the deployment script you will need to install the following packages. + +```bash +npm i commander dotenv @mysten/sui @axelar-network/axelar-cgp-sui +``` + +You can create a new file to run the script by running the following command: + +```bash +mkdir scripts +touch scripts/deploy.js +``` + +With your packages now installed you can import the necessary modules into your `deploy.js` file. + + +```javascript +import { execSync } from 'child_process' +import { Command } from 'commander' +import { Transaction } from '@mysten/sui/transactions' +``` + +You can setup your execution environment for your script as follows + +```javascript +async function run() {} + +const program = new Command() +program.description('Deploy Sui Coin').action(async () => { + try { + await run() + } catch (err) { + console.error('❌ Error:', err.message || err) + process.exit(1) + } +}) + +program.parse(process.argv) +``` + +#### Get Wallet Helper + +To interact with the Sui testnet you will need to connect to a wallet. The following function will help you connect to your wallet and return the connected wallet address. You can do this in a separate `utils` file + +```bash +mkdir utils +touch utils/index.js +``` + +Then in your utils you can write the functionality to connect to your wallet. + +```javascript +import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'; +import { SuiClient } from '@mysten/sui/client'; +import 'dotenv/config'; + +async function getWallet() { + const client = new SuiClient({ url: 'https://fullnode.testnet.sui.io/' }); + + const rawKey = process.env.PRIVATE_KEY; + + if (!rawKey) { + console.error('PRIVATE_KEY not set in your .env'); + process.exit(1); + } + + const keypair = Ed25519Keypair.fromSecretKey(rawKey); + return [keypair, client]; +} +``` + +For this function to work, you must add your private key to a `.env` file in the root of your project. + +The `getWallet()` function will return a key-pair and a client that you can use to interact with the Sui testnet. + +With the `getWallet()` function now built out, you can return back the deployment script. + +In your `run()` function, you can trigger the `getWallet()` function: + +```javascript +async function run() { + const [keypair, client] = await getWallet(); + const address = keypair.getPublicKey().toSuiAddress(); +} +``` + +Next, you can run the `sui move build` command we ran previously. Rather than running it directly in the `cli` this time, you can run it in the script so you do not need to re-build each time in the cli. This can be done as follows + +```javascript +const buildOutput = execSync(`sui move build --dump-bytecode-as-base64`, { +encoding: 'utf-8', +}) +``` + +The `--dump-bytecode-as-base64` flag tells sui move build to emit a JSON blob on stdout. + +With the package now built, you can move on to [publishing](https://docs.sui.io/guides/developer/first-app/publish) it on chain. + +To do this you need to create a new [Transaction](https://sdk.mystenlabs.com/typescript/transaction-building/basics) object. You can then run the `publish` function to get the instructions to publish the package on chain. This can be done as follows + +```javascript + const tx = new Transaction() + const [upgradeCap] = tx.publish({ modules, dependencies }) + + tx.transferObjects([upgradeCap], myAddress) + + console.log('🚀 Sending publish transaction…') +``` + +The `transferObject()` function transfers the [upgrade capability](https://docs.sui.io/concepts/sui-move-concepts/packages/upgrade) to the deployer address. To execute on chain you can run the `signAndExecuteTransaction()` function as follows from the Sui Client. This function will be signed by the key-pair that you previously generated and passed in the `tx` object. It can be written as follows: + +```javascript + const response = await client.signAndExecuteTransaction({ + signer: keypair, + transaction: tx, + options: { showObjectChanges: true }, + }) + console.log('✅ Publish succeeded!') +``` + +The `showObjectChanges` flag will add extra logs to capture all the objects that were updated/created/destroyed throughout the transaction. You will need this flag to be set to `true` to be able to track the relevant `treasury` and new `packageId` of the coin you just deployed. This can be done as follows: + +```javascript + // Extract published package ID + const publishedChange = response.objectChanges.find( + (c) => c.type === 'published' + ) + + const treasuryChange = response.objectChanges.find( + (c) => + c.type === 'created' && c.objectType.startsWith('0x2::coin::TreasuryCap') + ) + + const packageId = publishedChange?.packageId + console.log('📦 Published package ID:', packageId) + + const treasuryCapId = treasuryChange.objectId + console.log('💰 Treasury cap:', treasuryCapId) +``` + +To run the deployment you can run: + +```bash +node scripts/deploy.js +``` + +The output should be similar to the following: + +```bash +node scripts/deploy.js +📦 Building Move package +INCLUDING DEPENDENCY Sui +INCLUDING DEPENDENCY MoveStdlib +BUILDING my_coin +🚀 Sending publish transaction… +✅ Publish succeeded! +📦 Published package ID: 0x129245163917fd5ec0a90ad83216ca1380ddb37ccbd2be246f62e905f78c88a7 +💰 Treasury cap: 0xde83787facc01740a8c0d670ada99364395d4d9a127a723f62316238da2db671 +``` + +Great, at this point you should now have a completed the deployment of your token. You can compare that your repo matches with [Checkpoint 2](https://github.com/benjamin852/sui-its-example/tree/checkpoint2). + +## Part 5: Mint Coin + +With the token now deployed you will need to `mint` some coins before being able to actually send a cross-chain transfer. If you are familiar with minting Sui coins feel free to skip this section. + +To create a new script to mint tokens you can run the following command: + +```bash +touch scripts/mint.js +``` + +You can create the starter code for the mint script similar to the deployments script. This time however the script will require a few arguments to be passed in. + +The required arguments for the script are + +1. `coinPackageId` - The package ID of the coin you deployed. +1. `treasury` - The treasury cap ID of the coin you deployed. + +You should have both of these values in the logs after running the previous script. + +```javascript +import { Command } from 'commander' +import { Transaction } from '@mysten/sui/transactions' +import { getWallet } from '../utils/index.js' + +async function run(args) {} + + +const program = new Command() +program + .description('Mint Sui Coin') + .requiredOption('--coinPackageId ', 'Coin Package Id') + .requiredOption('--treasury ', 'Treasury') + .action(async (opts) => { + try { + await run(opts) + } catch (err) { + console.error('❌ Error:', err.message || err) + process.exit(1) + } + }) + +program.parse(process.argv) +``` + +You can then begin to writeup the logic in the `run()` function, similarly to how you did in the previous script, starting off with the `getWallet()` function and creating a new `Transaction` object. + +```javascript + // In the run() function + const [keypair, client] = getWallet() + const myAddress = keypair.getPublicKey().toSuiAddress() + const mintTx = new Transaction() +``` + +Next, you will need to call the coin's `mint()` function. As a reminder, the `mint()` function on the Sui token takes in the following parameters: + +1. `treasury_cap` - The treasury cap object that allows minting. +1. `amount` - The amount of coins to mint. +1. `recipient` - The address to send the minted tokens to. +1. `ctx` - The transaction context. + +```rust +public fun mint( + treasury_cap: &mut TreasuryCap, + amount: u64, + recipient: address, + ctx: &mut TxContext, +) {} +``` + +To call the `mint()` function you will need to use the [moveCall](https://sdk.mystenlabs.com/typedoc/classes/_mysten_sui.transactions.Transaction.html#movecall) function on the `Transaction` object from Sui's SDK. The `moveCall` executes a Move call and returns whatever the Sui Move call returns. + +Back in the `mint` script, in your `run()` function, you can create a `move call` as follows: + +It requires the first three params from the token's package to be passed in (the context will be injected by the Move VM). + +```javascript + // In the run() function + mintTx.moveCall({ + target: `${coinPackageId}::my_custom_coin::mint`, + arguments: [ + mintTx.object(treasury), // the cap you extracted + mintTx.pure.u64(1), // BigInt for u64 + mintTx.pure.address(myAddress), // Sui address of the recipient + ], + }) +``` + +With the `moveCall` added in, you need to now broadcast the transaction to Sui by running the `signAndExecuteTransaction` as you did before in the deployment script. + +```javascript + // In the run() function + await client.signAndExecuteTransaction({ + signer: keypair, + transaction: mintTx, + }) +``` + +Lastly, you can query the balance of your coin to ensure that the mint was successful. This can be done by running the `getBalance()` function from the Sui SDK. + +Unlike with the `mint()` you do not need to make a `moveCall` to query the balance, as no state change is being made to Sui. Instead, you can directly call the `getBalance` function on the client object. This will hits the node’s `JSON-RPC` endpoint (the [sui_getBalance()](https://www.quicknode.com/docs/sui/suix_getBalance) RPC method), which will return whatever the node has indexed for your address and coin type. + + +```javascript + // In the run() function + const balance = await client.getBalance({ + owner: myAddress, + coinType: `${coinPackageId}::my_custom_coin::MY_CUSTOM_COIN`, + }) + + console.log('💰 Minted successfully! New balance:', balance) +``` + +You can execute the `mint.js` script by running the following command: + +```bash +node scripts/mint.js --coinPackageId 0x129245163917fd5ec0a90ad83216ca1380ddb37ccbd2be246f62e905f78c88a7 --treasury 0xde83787facc01740a8c0d670ada99364395d4d9a127a723f62316238da2db671 +``` + +If successful, you should see an output similar to the following: + +```bash +🚀 Sending mint transaction… +💰 my token balance 1 +``` + +Great! At this point you should be able to deploy a new coin, mint and confirm the balance has increased. You can compare that your repo matches with [Checkpoint 3](https://github.com/benjamin852/sui-its-example/tree/checkpoint3). + +## Part 6: Register Coin with ITS + +With your coin now deployed and mintable, you can begin the process of registering it with ITS. This will allow you to transfer the token across chains using Axelar's Interchain Token Service. + +This will also be done via an script, you can create the script as follows: + +```bash +touch scripts/integrateAxelar.js +``` + +Then create the standard script boilerplate as you did in the previous scripts. + +```javascript +import { Command } from 'commander' +import { Transaction } from '@mysten/sui/transactions' +import { getWallet } from '../utils/index.js' +import { suiItsPackageId, suiItsObjectId } from '../utils/constants.js' + +async function run(args) {} + +const registerCoinCommand = new Command() +registerCoinCommand + .description('Register Sui coin with ITS') + .requiredOption('--coinPackageId ', 'Coin Package Id') + .action(async (opts) => { + try { + await run(opts) + } catch (err) { + console.error('❌ Error:', err.message || err) + process.exit(1) + } + }) + +registerCoinCommand.parse(process.argv) +``` + +This script will only require the `coinPackageId` as an argument, as the treasury cap is not required to register the token with ITS. + +In your `run()` function you can then destructure the passed in argument, get your keypair, and create a new `Transaction` object as you did in the previous script. + +```javascript +// In the run() function +const { coinPackageId } = args +const [keypair, client] = await getWallet() + +const registerCoinTx = new Transaction() +``` + +Next you will need to create the correct `typeArgument` that you will need to pass to ITS when interacting with its functionality. This is needed to interact with the [generic](https://move-language.github.io/move/generics.html) `Move` functions in ITS. Generics in Sui (any function using `` need to have an explicitly specified object type when they're called). In our case, the `type` needing to be passed in when interacting with ITS generics will be the type of your Coin that you created in the coin package. This type can be defined as follows: + +```javascript +// In the run() function +const coinType = `${coinPackageId}::my_custom_coin::MY_CUSTOM_COIN` +``` + +With your `coinType` argument now available you can move on to registering the token with ITS. + +To register your coin with ITS you will need to trigger the `register_coin()` function on ITS. It is written as follows: + +```rust +public fun register_coin( + self: &mut InterchainTokenService, + coin_info: CoinInfo, + coin_management: CoinManagement +): TokenId {} +``` + +This function will register an existing deployed coin on Sui as the canonical token in relation to other interchain tokens deployed across other blockchains. + +In order to trigger this function from your script you must create the necessary `coin_info` and `coin_management` objects that the function expects. + +You can create the `coin_info` param in your script as follows: + +```javascript +// In the run() function +const coinInfo = registerCoinTx.moveCall({ + target: `${suiItsPackageId}::coin_info::from_info`, + typeArguments: [coinType], + arguments: [ + registerCoinTx.object('My Custom Token'), + registerCoinTx.object('MCC'), + registerCoinTx.object('6'), + ], +}) +``` + +This will trigger a `MoveCall` on ITS's [Coin Info](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/types/coin_info.move) module, returning an object with the certain fields pertaining to the coins metadata. + +Next, you can make another `MoveCall` to get the `Coin Management` object. + +```javascript +// In the run() function +const coinManagement = registerCoinTx.moveCall({ + target: `${suiItsPackageId}::coin_management::new_locked`, + typeArguments: [coinType], + arguments: [], +}) +``` + +The call to ITS's [Coin Management](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/types/coin_management.move) will allow you to specify the type of [manager](/dev/send-tokens/interchain-tokens/token-manager/) you want for your coin. For this canonical integration, the `lock/unlock` manager type will suffice. This will lock your coins when you make a cross-chain call for your coin from Sui and unlock your coins when they're moved back into Sui. + +When passing in arguments into a Sui function if the argument is a Sui object you need to first make a query to a `Move` package to be able to pass that queried value in as an appropriate `Move` Object. + +With your two objects now available, you can make the `MoveCall` to the `register_coin()` function. This can be done as follows: + +```javascript +// In the run() function +registerCoinTx.moveCall({ + target: `${suiItsPackageId}::interchain_token_service::register_coin`, + typeArguments: [coinType], + arguments: [ + registerCoinTx.object(suiItsObjectId), + registerCoinTx.object(coinInfo), + registerCoinTx.object(coinManagement), + ], +}) +``` + +With the `MoveCall` now made, you can move on to broadcasting the transaction. For the `options`, you can include the `showEvents` param to provide the logs that you will need to get the `tokenId` from the integrated Sui Coin. + +```javascript +// In the run() function +const deployReceipt = await client.signAndExecuteTransaction({ + signer: keypair, + transaction: registerCoinTx, + options: { showObjectChanges: true, showEvents: true }, +}) +``` + +Great! With the call now made you can log the `tokenId` as follows + + +```javascript +// In the run() function +const coinRegisteredEvent = deployReceipt.events.find((event) => + event.type.includes('CoinRegistered') +) + +const tokenId = coinRegisteredEvent.parsedJson.token_id.id +console.log('🎯 Token ID:', tokenId) +``` + +You can now run the script as follows + +```bash + node scripts/integrateAxelar.js --coinPackageId 0x129245163917fd5ec0a90ad83216ca1380ddb37ccbd2be246f62e905f78c88a7 +✅ Coin registration completed + +🎯 Token ID: 0x291e9b4f659caeecf96e66c008b794dcce55f1b93bfc4f9ca49af54096316ebd +``` + +You can view your transaction [live on the Sui blockchain](https://suiscan.xyz/testnet/tx/JDrH1enDpWzcfvMso5RkdNFPVnGrSDELqderaFAeTcDB). Though this page could be overwhelming at first, the critical piece to note is the first `ObjectId` in the `Object Change` heading. For this token integration the [0x1eebd0cc85790956efbe96763ae1d19a5e548015c7735c1b7929fdc1f26942ef](https://suiscan.xyz/testnet/object/0x1eebd0cc85790956efbe96763ae1d19a5e548015c7735c1b7929fdc1f26942ef/tx-blocks) object corresponds to the [Coin Data](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/types/coin_data.move) module. In the `Coin Data` module you can see the relevant info for your [Coin Info](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/types/coin_info.move), which confirms your coin's name, symbol, and decimals. The [Coin Management](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/interchain_token_service/sources/types/coin_management.move) field contains the relevant configuration for your coin's integration to ITS. This includes the [flow limit](/dev/send-tokens/interchain-tokens/flow-limit/) value, the [operator's](/dev/send-tokens/interchain-tokens/minter-operator-roles/#operator-role) address, as well as the current balance corresponding to any assets locked that are currently bridged out of Sui. Recall, the `lockUnlock` manager type we integrated with is where those assets are be held. + +At this point your code should be functioning as the code in [checkpoint 4](https://github.com/benjamin852/sui-its-example/tree/checkpoint4) does. + +## Part 7: Deploy Interchain Token on Ethereum from Sui + +With your custom coin, now deployed and registered with ITS on Sui, you now need to deploy a token onto another blockchain that you will eventually bridge to/from your Sui ITS integration. ITS has built-in functionality to be able to deploy tokens on a remote chain by making a cross-chain call. This can be done by triggering the `deploy_remote_interchain_token()` function on ITS. + +To do this you can create a new script as follows: + +```bash +touch scripts/deployRemoteToken.js +``` + +Then you can create the standard script boilerplate as you did in the previous scripts. + +```javascript +import { Command } from 'commander' +import { Transaction } from '@mysten/sui/transactions' +import { getWallet } from '../utils/index.js' +import { ethers } from 'ethers' +import { SUI_TYPE_ARG } from '@mysten/sui/utils' + +async function run(args) {} + +const registerCoinCommand = new Command() +registerCoinCommand + .description('Register Sui coin with ITS') + .requiredOption('--coinPackageId ', 'Coin Package Id') + .requiredOption('--tokenId ', 'Token Id') + .action(async (opts) => { + try { + await run(opts) + } catch (err) { + console.error('❌ Error:', err.message || err) + process.exit(1) + } + }) + +registerCoinCommand.parse(process.argv) +``` + +For this script, the arguments required are the `coinPackageId` as well as a the `tokenId`, which you should have received when you successfully ran the [Integrate Axelar](/dev/send-tokens/sui/register-existing-sui-token/#part-6-register-coin-with-its) script. In the start of your `run()` function you can go through the standard steps of: + +1. Destructuring arguments. +1. Obtaining your keypair and client. +1. Creating a new `Transaction` object. +1. Creating your `typeArgument`. + +```javascript +// In the run() function +const { coinPackageId, tokenId } = args +const [keypair, client] = await getWallet() + +const deployRemoteTokenTx = new Transaction() +const coinType = `${coinPackageId}::my_custom_coin::MY_CUSTOM_COIN` +``` + +Before calling the `deploy_remote_interchain_token()` function, you will need to query your coin's `tokenId` from ITS so you can pass in the `tokenId` as an appropriate `Move` object. This can be done as follows: + +```javascript +// In the run() function +const tokenIdObj = deployRemoteToken.moveCall({ + target: `${suiItsPackageId}::token_id::from_u256`, + arguments: [deployRemoteToken.pure.u256(tokenId)], +}) +``` + +With the `tokenId` now fetched in the appropriate format, you can writeup your `MoveCall` to the `deploy_remote_interchain_token()`. + + +The `deploy_remote_interchain_token()` function is written on the ITS package follows: + +```rust +// In ITS Move Package +public fun deploy_remote_interchain_token( + self: &InterchainTokenService, + token_id: TokenId, + destination_chain: String, +): MessageTicket {} +``` + +Once executed, it make a cross-chain call to deploy a fresh [Interchain Token](/dev/send-tokens/glossary/#interchain-token) on a remote blockchain. + +You can call the `deploy_remote_interchain_token()` function by passing in the the + +1. ITS object id as a type `object` +1. The `tokenId` from the previous step. Note: The `tokenId` will need to be passed in as the queried `MoveCall` rather than the raw `tokenId` you pass in when calling the script. +1. Destination chain serialized as a [BCS](https://sdk.mystenlabs.com/bcs) string. + +You must also pass in the `coinType` as the `typeArgument` to satisfy the generic type requirement that ITS has for the `deploy_remote_interchain_token()` function. + +```javascript +// In the run() function +const deployRemoteTokenTicket = deployRemoteToken.moveCall({ + target: `${suiItsPackageId}::interchain_token_service::deploy_remote_interchain_token`, + arguments: [ + deployRemoteToken.object(suiItsObjectId), + tokenIdObj, + deployRemoteToken.pure.string('ethereum-sepolia'), + ], + typeArguments: [coinType], +}) +``` + +With the `deploy_remote_interchain_token()` function called, you must now call the standard [General Message Passing (GMP)](https://docs.axelar.dev/dev/general-message-passing/sui/gmp-contracts/#general-message-passing-gmp-sui-contracts) functions in order to send the cross-chain transaction. + + +Unlike in EVM chains where you can make a cross-chain call simply by calling `interchainTransfer()`, Sui requires a two step process due to the nature of how upgradable contracts work in Sui. Any function from the Move package that returns a ticket, (such as `deploy_remote_interchain_token()`) must explicitly be broadcasted in a cross-chain call with `pay_gas()` and `send_message()`. More info on why the 2step call is necessary can be found [here](/dev/general-message-passing/sui/gmp-contracts/#send-message). + + + +The first of these functions is the [pay_gas()](/dev/general-message-passing/sui/gmp-contracts/#paygas) function, defined on the [Sui Gas Service](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/gas_service/sources/gas_service.move). It will be used to pay the cost of the cross-chain transaction. Further details on gas payment (including the parameters it expects) can be found in the [Sui GMP](/dev/general-message-passing/sui/gmp-tutorial/#send-message-1) tutorial. The gas payment can be written as follows: + +```javascript +// In the run() function +const unitAmount = ethers.utils.parseUnits('1', 9).toBigInt() + +const [gas] = deployRemoteToken.splitCoins(deployRemoteToken.gas, [ + unitAmount, +]) + +deployRemoteToken.moveCall({ + target: `${gasServicePackageId}::gas_service::pay_gas`, + typeArguments: [SUI_TYPE_ARG], + arguments: [ + deployRemoteToken.object(gasServiceObjectId), + deployRemoteTokenTicket, + gas, + deployRemoteToken.object(keypair.getPublicKey().toSuiAddress()), + deployRemoteToken.pure.string(''), + ], +}) +``` + +Note: The gas payment passes in the `generic` `SUI_TYPE_ARG` as the type argument, as the gas payment is done in Sui via the native Sui coin, so a different type is passed in to handle the `generic`. + +With the gas payment now made, the final step is to trigger the `send_message()` function defined on the [Sui Gateway](https://github.com/axelarnetwork/axelar-cgp-sui/blob/main/move/axelar_gateway/sources/gateway.move). As with the `pay_gas()` further reading on this topic can be found in the [GMP demo](/dev/general-message-passing/sui/gmp-tutorial/#send-message) + +The call to `send_message()` can be made as follows: + +```javascript + deployRemoteToken.moveCall({ + target: `${gatewayPackageId}::gateway::send_message`, + arguments: [ + deployRemoteToken.object(gatewayObjectId), // &Gateway + deployRemoteTokenTicket, // MessageTicket + ], + }) +``` + +With the `pay_gas()` and `send_message()` calls now made, your script can make the cross-chain call to your destination chain to deploy the remote ERC20 token. + +At this point the final step is to broadcast the transaction to Sui by running the `signAndExecuteTransaction` as you did in the previous scripts. This can be done as follows: + +```javascript +// In the run() function +const deployReceipt = await client.signAndExecuteTransaction({ + signer: keypair, + transaction: deployRemoteToken, + options: { showObjectChanges: true, showEvents: true }, +}) + +console.log('✅ Remote token deployment completed:', deployReceipt) +``` + +You can now run the script by calling the following command: + +```bash +node scripts/deployRemoteToken.js --coinPackageId 0x129245163917fd5ec0a90ad83216ca1380ddb37ccbd2be246f62e905f78c88a7 --tokenId 0x291e9b4f659caeecf96e66c008b794dcce55f1b93bfc4f9ca49af54096316ebd +``` + +If executed successfully the script should return the following logs: + +```bash +🚀 Deploying remote interchain token... +✅ Remote token deployment completed: { + digest: '2GffLMzzsXMCDMs4AhhiR6txFGefmtFBqtnUh7infcq6', + events: [ + ... + ] +``` + +The live [cross-chain](https://testnet.axelarscan.io/gmp/2GffLMzzsXMCDMs4AhhiR6txFGefmtFBqtnUh7infcq6) call should now be visible on Axelarscan and you should now have a token deployed on your specified destination chain. + +You can confirm your code is up to date with the [Checkpoint 5](https://github.com/benjamin852/sui-its-example/tree/checkpoint5) + +## Part 8: Transfer Tokens Between Sui and EVM + +The final step is to now send a cross-chain transfer between your two deployed tokens. You should have a non-zero balance for your coin in your wallet from the `mint` script that you ran earlier. + +You can create your final script to transfer your token the same way you did with the previous scripts + +```bash +touch scripts/interchainTransfer.js +``` + +The interchain transfer script will require six different arguments to be passed in. + +1. `destinationChain` - The destination chain you want to transfer to (e.g. `ethereum-sepolia`) +2. `destinationAddress` - The address on the destination chain you want to transfer to. +3. `coinPackageId` - The package ID of the coin you deployed. +4. `tokenId` - The token ID of the coin you registered with ITS. +5. `treasuryCap` - The treasury cap ID of the coin you deployed. +6. `amount` - The amount of tokens you want to transfer. + +You should by now have access to all these values from the logs of your previous scripts. + +Add the standard script boilerplate to your `interchainTransfer.js` file + +```javascript +import { Command } from 'commander' +import { Transaction } from '@mysten/sui/transactions' +import { getWallet } from '../utils/index.js' +import { ethers } from 'ethers' +import { SUI_TYPE_ARG } from '@mysten/sui/utils' +import { SUI_PACKAGE_ID, CLOCK_PACKAGE_ID } from '@axelar-network/axelar-cgp-sui' +import { + suiItsPackageId, + suiItsObjectId, + gasServiceObjectId, + gatewayPackageId, + gasServicePackageId, +} from '../utils/constants.js' + + + +async function run(args) {} + +const interchainTransferCommand = new Command() +interchainTransferCommand + .description('Transfer coin from Sui to Ethereum with ITS') + .requiredOption('--coinPackageId ', 'Coin Package Id') + .requiredOption('--tokenId ', 'The ITS token id') + .requiredOption( + '--destinationChain ', + 'The destination chain' + ) + .requiredOption( + '--destinationAddress ', + 'The destination address' + ) + .requiredOption('--amount ', 'The amount of coins to be sent'), + .requiredOption('--coinObjectId ', 'The coin object Id') + .action(async (opts) => { + try { + await run(opts) + } catch (err) { + console.error('❌ Error:', err.message || err) + process.exit(1) + } + }) + +interchainTransferCommand.parse(process.argv) +``` + + +You can then destructure the passed in arguments, get your key-pair and client, and create a new `Transaction` object as you did in the previous scripts. + +```javascript +// In the run() function +const { + coinPackageId, + tokenId, + destinationChain, + destinationAddress, + amount, + coinObjectId +} = args + +const [keypair, client] = await getWallet() + +const interchainTransferTx = new Transaction() +const coinType = `${coinPackageId}::my_custom_coin::MY_CUSTOM_COIN` +``` + +To make an [interchain_transfer()](/dev/send-tokens/sui/intro/#send-interchain-transfer) call you must first generate a `ticket` by calling the `prepare_interchain_transfer()` function on ITS. This will generate a ticket that can be used to send the transfer across chains. More info on why the two step process for sending an interchain transfer is necessary can be found in the [prepare_interchain_transfer()](/dev/send-tokens/sui/intro/#why-prepare-interchain-transfer-is-necessary) doc. + +The `prepare_interchain_transfer()` call will take in several parameters that must be obtained first. + +The first of these parameters is the `tokenId`. To obtain the `tokenId` in the required format needed for the `prepare_interchain_transfer()` call, you will need to make a `moveCall` to the ITS package. This can be done as follows: + +```javascript +// In the run() function +const tokenIdObj = interchainTransferTx.moveCall({ + target: `${suiItsPackageId}::token_id::from_u256`, + arguments: [interchainTransferTx.pure.u256(tokenId)], +}) +``` + +Next, you need to fetch the `source_channel`. The [channel](/dev/general-message-passing/sui/intro/#channels) that is generated will be used as the `sourceAddress` when the transaction arrives on the destination chain. You can obtain your `Move` formatted channel as follows. + +```javascript +// In the run() function +const gatewayChannelId = interchainTransferTx.moveCall({ + target: `${gatewayPackageId}::channel::new`, +}) +``` + +With the two custom Move types now available you can move on to providing the rest of the arguments for the `prepare_interchain_transfer()` function. The generic `Coin` argument that the `prepare_interchain_transfer()` expects will send the entire balance of the `Coin` object that is sent to it. For example, if you previously minted 100 coins in your `Mint` script you cannot specify an `amount` to send, in other words, if you supply the minted coin object to the `prepare_interchain_transfer()` script it will send the entire 100 coins, even if you only wanted to send 50 coins. To get around this issue you can use the [splitCoins()](https://docs.sui.io/concepts/transactions/prog-txn-blocks/#splitcoins) function to create a new `Coin` to pass in with the exact amount that you actually want to send. This can be done as follows: + +```javascript +// In the run() function +const [coinsToSend] = interchainTransferTx.splitCoins(coinObjectId, [amount]) +``` + +The final configuration is to specify the `destination_address`. In the [prepare_interchain_transfer()](/dev/send-tokens/sui/intro/#prepare-interchain-transfer) function signature the `destination_address` is expecting a `vector` rather than a plain `String`. To obtain the `vector` in your script you need to use `ethers.utils.arrayify()` to hex-decode the `0x` string into a `Uint8Array` of 20 raw bytes, then pass that into your call as a `vector`. + +Start by obtaining the `Uint8Array` with the available ethers helpers. This will represent your destination address as a raw 20 byte value. This value will be passed in as a vector when calling `prepare_interchain_transfer()`. + +```javascript +// In the run() function +const destRaw = ethers.utils.arrayify(destinationAddress) +``` + +You now can begin to create your `Move` call to `prepare_interchain_transfer()`. For this call you will need to pass in the `tokenIdObj`, `coinsToSend`, and `gatewayChannelId` objects you had created before. You can also pass in the `destinationChain` as a pure `String`. The destination address should now be passed in as a `vector` using the `destRaw` object you created earlier. The `metadata` field can passed in as an empty `String` as we will not be sending any executable data along with this interchain transfer call. + +```javascript +// In the run() function +const ticket = interchainTransferTx.moveCall({ + target: `${suiItsPackageId}::interchain_token_service::prepare_interchain_transfer`, + typeArguments: [coinType], + arguments: [ + tokenIdObj, + coinsToSend, + interchainTransferTx.pure.string(destinationChain), + interchainTransferTx.pure.vector('u8', destRaw), + interchainTransferTx.pure.string('0x'), + gatewayChannelId, + ], +}) +``` + +Once your script runs you should now receive a ticket that you can pass in to your [send_interchain_transfer()](/dev/send-tokens/sui/intro/#send-interchain-transfer) call. Let's go ahead and do that: + +```javascript +// In the run() function +const interchainTransferTicket = interchainTransferTx.moveCall({ + target: `${suiItsPackageId}::interchain_token_service::send_interchain_transfer`, + typeArguments: [coinType], + arguments: [ + interchainTransferTx.object(suiItsObjectId), + ticket, + interchainTransferTx.object(SUI_CLOCK_OBJECT_ID), + ], +}) +``` + +Notice, this call to `send_interchain_transfer()` is a lot more straightforward than the previous call to create the ticket. It requires the object id of the deployed ITS package, the ticket that you just created, and Sui's [clock object](https://docs.sui.io/references/framework/sui/clock) for calculating time. The clock object can be added to your `constants.js` file as follows + +```javascript +// In the constants.js file +export const SUI_CLOCK_OBJECT_ID = '0x6'; +``` + +Great, next you must call the `pay_gas()` and `send_message()` functions as you did in your previous cross-chain calls. + +These will be very similar to how you called them in your previous script. Notice in these calls the `ticket` that you pass in is not the `ticket` from the `prepare_interchain_transfer()` function, rather it is the ticket generated from the `send_interchain_transfer()` function call. + +```javascript +// In the run() function +interchainTransferTx.moveCall({ + target: `${gasServicePackageId}::gas_service::pay_gas`, + typeArguments: [SUI_TYPE_ARG], + arguments: [ + interchainTransferTx.object(gasServiceObjectId), + interchainTransferTicket, + gas, + interchainTransferTx.object(keypair.getPublicKey().toSuiAddress()), + interchainTransferTx.pure.string(''), + ], +}) + +interchainTransferTx.moveCall({ + target: `${gatewayPackageId}::gateway::send_message`, + arguments: [ + interchainTransferTx.object(gatewayObjectId), + interchainTransferTicket, + ], +}) +``` + +The final `moveCall` that must be made before broadcasting this transaction is to destroy the channel was created to send the message. This can be done as follows. + +```javascript +// In the run() function +interchainTransferTx.moveCall({ + target: `${gatewayPackageId}::channel::destroy`, + arguments: [interchainTransferTx.object(gatewayChannelId)], +}) +``` + +The object must be destroyed as in Move every object must be explicitly handled, the VM will not allow you to simply leave an object unused in an open transaction. + + +Your options are either to transfer, share, or destroy the object. Since you will no longer need the object, destroying it is the most cost efficient and safest way to handle the object. + + +Now with the instruction to destroy the unused object destroyed, you can broadcast the transaction and log the transaction digest. + +```javascript +// In the run() function +const receipt = await client.signAndExecuteTransaction({ + signer: keypair, + transaction: interchainTransferTx, + options: { showObjectChanges: true }, +}) + +console.log('🧾 Transaction digest:', receipt.digest) +``` + +Great! Your script can now be run as follows + +```bash + node scripts/interchainTransfer.js --coinPackageId 0x129245163917fd5ec0a90ad83216ca1380ddb37ccbd2be246f62e905f78c88a7 --tokenId 0x291e9b4f659caeecf96e66c008b794dcce55f1b93bfc4f9ca49af54096316ebd --destinationChain "ethereum-sepolia" --destinationAddress "0xc5DcAC3e02f878FE995BF71b1Ef05153b71da8BE" --amount 1 --coinObjectId 0x3094b9c7c131ec18b35e41566615d45ccdb1f6242e71adedd8b2d971b362a5be +``` +With the following output in your logs + +```bash +🚀 interchain transfer via ITS +🧾 Transaction digest: 8msndctx8W5zoef7j6ZueypPzCX2dTkYQzU7VWBMkGGo +``` + +This interchain transfer can be viewed on the [Axelarscan](https://testnet.axelarscan.io/gmp/8msndctx8W5zoef7j6ZueypPzCX2dTkYQzU7VWBMkGGo) block explorer. + +You can view the completed code here at the [final checkpoint](https://github.com/benjamin852/sui-its-example/tree/main). + +## Conclusion + +In this guide you have deployed a fresh new custom coin on the Sui blockchain, you have integrated that coin with Axelar's Interchain Token Service and successfully made multiple cross-chain transactions to deploy a remote token on Ethereum and even transfer your integrated token from Sui to Ethereum. Once transferred out of Sui your token will be locked with your token's Token Manager contract on Sui, it will be unlocked when the token is sent back from Ethereum to Sui. + +This guide just scratches the service of the exciting possibilities that Axelar now offers the Sui ecosystem. For simpler integrations with non-custom tokens to Sui we highly encourage you to explore the Axelar [ITS portal](https://interchain.axelar.dev/), which offers a no-code solution for integrating assets to ITS. We would also love to see more advanced customized tokens, such as stablecoins integrated to ITS from Sui. For any open questions please reach out at our [support channel on Github](https://github.com/axelarnetwork/support/issues). + diff --git a/src/content/docs/dev/send-tokens/xrpl/xrpl-its.mdx b/src/content/docs/dev/send-tokens/xrpl/xrpl-its.mdx new file mode 100644 index 000000000..f81edc5c5 --- /dev/null +++ b/src/content/docs/dev/send-tokens/xrpl/xrpl-its.mdx @@ -0,0 +1,126 @@ + +# XRPL Interchain Token Service + +The XRPL Blockchain is unique in comparison to other blockchains integrated with Axelar. Unlike other blockchains, XRPL does not support smart contracts. As such there is no Interchain Token Service contract deployed on the chain the way there is with other EVM and non-EVM blockchain integrations. + +## XRPL Gateway + +The integration leverages the [XRPL Multisig Signing](https://xrpl.org/docs/concepts/accounts/multi-signing) account type to facilitate token transfers. The [gateway](https://github.com/commonprefix/axelar-amplifier/blob/xrpl/contracts/xrpl-multisig-prover/src/xrpl_multisig.rs) is controlled by the [Axelar Verifier set](https://axelarscan.io/verifiers). + +The testnet address for the XRPL Gateway is: [rNrjh1KGZk2jBR3wPfAQnoidtFFYQKbQn2](https://testnet.xrpl.org/accounts/rNrjh1KGZk2jBR3wPfAQnoidtFFYQKbQn2). + +The mainnet address for the XRPL Gateway is: [rfmS3zqrQrka8wVyhXifEeyTwe8AMz2Yhw](https://livenet.xrpl.org/accounts/rfmS3zqrQrka8wVyhXifEeyTwe8AMz2Yhw). + +Axelar's integration to XRPL allows for the cross-chain transfer of both the XRPL native token (XRP itself) as well as custom tokens ([IOU](https://learn.xrpl.org/glossary/iou/)). + + +### Transfer Token + +The interchain transfer flow is similar to that of the regular [GMP flow](/dev/general-message-passing/xrpl/xrpl-gmp/). As with the regular GMP flow, users will be sending a [payment transaction](https://xrpl.org/docs/references/protocol/transactions/types/payment) to the Gateway account. The main difference is that the `MessageType` being sent to the Gateway is an `interchain_transfer` message type instead of a `call_contract` message. + +When transferring a token out of XRPL you will be sending the token from your XRPL account to the Gateway contract. The Gateway will be the custodian of your token on XRPL while it is sent via ITS hub to the destination chain until is bridged back to XRPL. Sending a token will be similar to sending a regular GMP message in that the information that is sent to the Gateway (and eventually to ITS hub) will need to be specified in the [memo](https://xrpl.org/docs/references/protocol/transactions/common-fields#memos-field) field of the transaction. + +What needs to be specified in the `memo` is the following: + +1. `type`: The type of the transaction (which will be `interchain_transfer`) +1. `destination_address`: The address of the destination contract on the destination chain. +1. `destination_chain`: The name of the destination chain. +1. `gas_fee_amount`: The amount to be used to cover the the [cross-chain transaction fees](/dev/gas-service/intro/). +1. `payload`: A message to be sent along with the cross-chain asset transfer. This parameter is only needed if you are sending a gmp message, can be ignored if you are simply sending a token without an executable message. + +Each of the previously mentioned fields will be passed into the memo as a `MemoType` as an encoded hex. You can then specify the value for each of these fields in the `MemoData` field, also encoded in hex. + +A full `JSON` example of the entire required XRPL Interchain Transfer fields can be as follows: + +```json +{ + TransactionType: "Payment", + Account: user.address, + Amount: "1000000", // (1 xrp) + // Amount: { // alternatively, an IOU token amount can be used to cover gas fees + // currency: "ABC", // IOU's currency code + // issuer: "r4DVHyEisbgQRAXCiMtP2xuz5h3dDkwqf1", // IOU issuer's account address + // value: "1" // IOU amount to bridge (in this case, 1 ABC.r4DVH), *including* gas fee amount + // }, + Destination: gateway.address, + Memos: [ + { + Memo: { + MemoType: "74797065", // hex("msg type") + MemoData: "696e746572636861696e5f7472616e73666572" // hex("interchain_transfer") + }, + }, + { + Memo: { + MemoType: "64657374696e6174696f6e5f61646472657373", // hex("destination_address") + MemoData: "30413930633041663142303766364143333466333532303334384462666165373342446133353845" // hex("0A90c0Af1B07f6AC34f3520348Dbfae73BDa358E"), in this case: (0x is omitted) + }, + }, + { + Memo: { + MemoType: "64657374696E6174696F6E5F636861696E", // hex("destination_chain") + MemoData: "7872706c2d65766d2d6465766e6574", // destination chain, hex encoded - hex("xrpl-evm-devnet"), in this case + }, + }, + { + Memo: { + MemoType: "6761735f6665655f616d6f756e74", // hex("gas_fee_amount") + MemoData: "30", // amount of tokens to allocate to gas fees + }, + }, + { // Only include this Memo object when performing a GMP call: + Memo: { + MemoType: "7061796c6f6164", // hex("payload") + // abi-encoded payload/data with which to call the Executable destination contract address: + MemoData: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000e474d5020776f726b7320746f6f3f000000000000000000000000000000000000", + }, + }, + ], +} +``` + +### Example + +A full example can be found [here](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/xrpl/interchain-transfer.js). + +The example makes use of the [XRPL Client library](https://www.npmjs.com/package/xrpl) + +The XRPL client simplifies the process of connecting to the XRPL network, building transactions, signing them, and submitting them for processing. Key components of the XRPL client include: + +The key function in this example is the `interchainTransfer()` function written out as follows. + +```js +async function interchainTransfer(_config, wallet, client, chain, options, args) { + await client.sendPayment( + wallet, + { + destination: chain.contracts.InterchainTokenService.address, + amount: parseTokenAmount(args.token, args.amount), // token is either "XRP" or "." + memos: [ + { memoType: hex('type'), memoData: hex('interchain_transfer') }, + { memoType: hex('destination_address'), memoData: hex(args.destinationAddress.replace('0x', '')) }, + { memoType: hex('destination_chain'), memoData: hex(args.destinationChain) }, + { memoType: hex('gas_fee_amount'), memoData: hex(options.gasFeeAmount) }, + ...(options.payload ? [{ memoType: hex('payload'), memoData: options.payload }] : []), + ], + }, + options, + ); +} +``` + +This function constructs the `memo` that will be used for the transaction, passing in the `type`, `destination_address`, `destination_chain`, and `gas_fee_amount`. The [request](https://js.xrpl.org/classes/Client.html#request) functionality of the XRPL client is then used to submit a [signed](https://js.xrpl.org/classes/Wallet.html#sign) transaction. + +To interact with the example run the following command + +```bash +node xrpl/interchain-transfer.js -e testnet -n xrpl XRP 1 xrpl-evm 0x312dba807EAE77f01EF3dd21E885052f8F617c5B --gasFeeAmount 100000 +``` + +This will send an ITS transfer to the `0x312dba807EAE77f01EF3dd21E885052f8F617c5B` address on the `XRPL-EVM` chain. + +Once the command is run you should as a [transaction](https://testnet.axelarscan.io/gmp/0x8032a4695f4b663a7699da81760997baabb663dea4afc25b78b3434553fcd09d) on the Axelarscan explorer where you can track the entire cross-chain transaction. + +#### Insufficient Gas Error + +In the event of an `insufficient gas` error, you can unblock the underfunded transaction by running the [Add Gas](/dev/general-message-passing/xrpl/xrpl-gmp/#add-gas) top up the missing funds. \ No newline at end of file diff --git a/src/pages/dev/general-message-passing/solidity-utilities.mdx b/src/content/docs/dev/solidity-utilities.mdx similarity index 92% rename from src/pages/dev/general-message-passing/solidity-utilities.mdx rename to src/content/docs/dev/solidity-utilities.mdx index fee298704..55ac73e56 100644 --- a/src/pages/dev/general-message-passing/solidity-utilities.mdx +++ b/src/content/docs/dev/solidity-utilities.mdx @@ -1,8 +1,8 @@ # Solidity utilities -import { Callout } from '/src/components/callout' +import { Callout } from "/src/components/callout"; -To facilitate interchain development, we have provided some Solidity utilites. These can be found [here](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity). Each of these is described below, along with their proposed use. To further assist with the development process the [Axelar Chain's Config](https://www.npmjs.com/package/@axelar-network/axelar-chains-config) package has been made available to provide easy access to all the relevant Axelar configurations on each blockchain Axelar is available on. +To facilitate interchain development, we have provided some Solidity utilities. These can be found [here](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity). Each of these is described below, along with their proposed use. To further assist with the development process the [Axelar Chain's Config](https://www.npmjs.com/package/@axelar-network/axelar-chains-config) package has been made available to provide easy access to all the relevant Axelar configurations on each blockchain Axelar is available on. Note: When deploying a contract with this tool, the msg.sender in the constructor of the app's contract will be the deployer contract address and not the wallet address. So msg.sender should not be used for setting the owner etc. when using these. Instead it should be passed in as a constructor arg @@ -32,7 +32,7 @@ In order to pass in data for a contract's constructor arguments you must encode For example to deploy a contract with a constructor that takes in two arguments, a `uint256` and an `address`, you could call the `deploy()` function as follows: -``` +```solidity function deployContract() external { Create3Deployer.deploy( keccak256(bytes("")), @@ -74,7 +74,7 @@ For those who may be using [Create2 Deployer](https://github.com/axelarnetwork/a #### Create2Deployer JS -The above can be used directly, but we also provide a script to execute this functionality from a Jasvscript file. Simply import [`create2Deployer.js`](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/blob/main/scripts/create2Deployer.js). The following methods are exported from from the `create2Deployer.js` file: +The above can be used directly, but we also provide a script to execute this functionality from a JavaScript file. Simply import [`create2Deployer.js`](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/blob/main/scripts/create2Deployer.js). The following methods are exported from from the `create2Deployer.js` file: - `async estimateGasForDeploy(contractJson, args = [])`: estimates the gas needed to deploy a contract with a certain `contractJson` and `args` - `async estimateGasForDeployAndInit(contractJson, args = [], initArgs = [])`: estimates the gas needed to deploy a contract with a certain `contractJson` and `args`, and to have the `init(...initArgs)` called as part of the deployment. diff --git a/src/content/docs/dev/what-is-mobius-development-stack.mdx b/src/content/docs/dev/what-is-mobius-development-stack.mdx new file mode 100644 index 000000000..651cf0e42 --- /dev/null +++ b/src/content/docs/dev/what-is-mobius-development-stack.mdx @@ -0,0 +1,20 @@ +# What is Mobius Development Stack? + +Axelar [MDS](https://www.axelar.network/blog/mobius-development-stack-launch) is a suite of open tools and protocols that unlock an entirely new omnichain design space. MDS pioneers a new interoperability standard leveraging enhanced AXL token utility to power infinite security and scalability across Web3. For the first time, applications can connect easily to users and logic anywhere on the internet – maintaining verified and open properties end-to-end. + +With Axelar MDS, the possibilities extend far beyond simple bridges or oracles. A user could send a message on Telegram that rebalances a vault on Sui, which in turn interacts with DeFi protocols on Arbitrum and a financial institution's private blockchain. This level of integration and interoperability opens up a new world of possibilities for decentralized applications. + +![Axelar MDS](/images/axelar-mds-diagram.jpg) + +With one connection, infinite possibilities. + +The three main components of Axelar MDS are: + +- [Interchain Amplifier](/dev/amplifier/chain-integration/): Now on mainnet, a simple, permissionless way to connect your chain with the Axelar network and its interconnected chains. It enables dynamic, customizable integrations, with chains like Sui, Aptos, and Solana cued up to connect. +- [Interchain Token Service (ITS)](/dev/send-tokens/interchain-tokens/intro/): An institutional-grade set of tokenization tools that replace bridges completely, enabling the minting and managing of tokens across any connected blockchain. With ITS, tokens can move cross-chain natively while maintaining full functionality and fungibility. +- [Axelar Virtual Machine (AVM)](https://www.axelar.network/blog/axelar-virtual-machine-future-of-interoperability) underpins Amplifier and ITS to enable smart contract logic at the cross-chain layer. This opens doors for a new generation of multichain developer tools and sophisticated dApps. Ethereum introduced programmable money; Axelar introduces programmable interoperability. + +Plus these additional features, combining to create the most complete interoperability platform on the market: + +- Flexible, augmented economic security: connections to ETH (via [EigenLayer](https://www.eigenlayer.xyz/) and other exogenous collateral adds a layer of customizability to Interchain Amplifier, which already allows custom configuration of security for new integrations. +- Open interoperability interface built in collaboration with OpenZeppelin and integrated into [OpenZeppelin's](https://www.openzeppelin.com/) leading smart-contract libraries. Developers adopting these open-source semantics can plug in any interoperability technology. diff --git a/src/pages/learn/axlusdc.mdx b/src/content/docs/learn/axlusdc.mdx similarity index 76% rename from src/pages/learn/axlusdc.mdx rename to src/content/docs/learn/axlusdc.mdx index 024fa8eb4..88ac7be21 100644 --- a/src/pages/learn/axlusdc.mdx +++ b/src/content/docs/learn/axlusdc.mdx @@ -1,33 +1,35 @@ # What is axlUSDC -* axlUSDC is a wrapped, multi-chain representation of USDC, a dollar stablecoin. +- axlUSDC is a wrapped, multi-chain representation of USDC, a dollar stablecoin. -* For each unit of axlUSDC, there is a unit of USDC locked in an Axelar Gateway on Ethereum. +- For each unit of axlUSDC, there is a unit of USDC locked in an Axelar Gateway on Ethereum. -* axlUSDC is secured by a dynamic validator set running delegated Proof-of-Stake, which holds key shares in the Axelar Gateways via multi-party cryptography. +- axlUSDC is secured by a dynamic validator set running delegated Proof-of-Stake, which holds key shares in the Axelar Gateways via multi-party cryptography. -* Acquire axlUSDC in three ways: +- Acquire axlUSDC in three ways: - * Swap via liquid pairs on [any of the DEXs listed here](https://axelar.network/blog/liquidity-pools-for-bridged-assets-via-axelar). - * Swap via [Squid](https://app.squidrouter.com/), a cross-chain liquidity router built on Axelar. - * Mint via [Satellite](https://satellite.money/), a cross-chain bridge built by Axelar + - Swap via liquid pairs on [any of the DEXs listed here](https://axelar.network/blog/liquidity-pools-for-bridged-assets-via-axelar). + - Swap via [Squid](https://app.squidrouter.com/), a cross-chain liquidity router built on Axelar. + - Mint via [Satellite](https://satellite.money/), a cross-chain bridge built by Axelar ## USDC and axlUSDC + USDC is the ticker for [USD Coin](https://www.circle.com/en/usdc). It's a stablecoin, pegged to the US dollar, issued by Circle, a US company. So, what is axlUSDC, why do we need it, and how can you get it? This post will briefly explain. USDC is issued on Ethereum – but dApps and users in other ecosystems also value the stablecoin's properties. Many of them use axlUSDC, a wrapped version of USDC that can travel between chains, as a multi-chain stablecoin. -In brief, axlUSDC is generated via [cross-chain bridges](https://axelar.network/blog/cross-chain-bridges-benefits-limitations-risks). These dApps accept a deposit of USDC at an Axelar Gateway on Ethereum, and mint an equivalent amount of axlUSDC on the destination chain (minus fees). +In brief, axlUSDC is generated via [cross-chain bridges](https://axelar.network/blog/cross-chain-bridges-benefits-limitations-risks). These dApps accept a deposit of USDC at an Axelar Gateway on Ethereum, and mint an equivalent amount of axlUSDC on the destination chain (minus fees). Two key points to understand what axlUSDC is and how it can be used: -* For every unit of axlUSDC, there is a unit of USDC locked in [a Gateway on Ethereum](https://etherscan.io/address/0x4f4495243837681061c4743b74b3eedf548d56a5#tokentxns). -* Once minted, axlUSDC can flow from chain to chain, without going back through Ethereum. +- For every unit of axlUSDC, there is a unit of USDC locked in [a Gateway on Ethereum](https://etherscan.io/address/0x4f4495243837681061c4743b74b3eedf548d56a5#tokentxns). +- Once minted, axlUSDC can flow from chain to chain, without going back through Ethereum. + +You can reference [Gateway addresses on various EVM chains and the token addresses of axlUSDC](/resources/contract-addresses/mainnet/). -You can reference [Gateway addresses on various EVM chains and the token addresses of axlUSDC](/resources/mainnet). +## How is axlUSDC secured? -## How is axlUSDC secured? -Like all Axelar-wrapped assets, axlUSDC's security depends on a dynamic validator set (numbering 70 at this writing), running delegated proof-of-stake. In other words, Axelar secures cross-chain communication using the same approach as many of the chains it connects. +Like all Axelar-wrapped assets, axlUSDC's security depends on a dynamic validator set (numbering 70 at this writing), running delegated proof-of-stake. In other words, Axelar secures cross-chain communication using the same approach as many of the chains it connects. Units of axlUSDC are minted when a user deposits USDC into a Gateway contract on the Ethereum chain. Axelar's decentralized validator set secures these Gateways via key shares in a multiparty cryptography scheme. See also [Gateways and how they are secured](/learn). @@ -36,15 +38,16 @@ Once a cross-chain message is initiated by a dApp user, its first stop is to int The Gateway is controlled by a key, which is held jointly by all Axelar validators. This is accomplished through a multiparty cryptography scheme, where the key is divided into many pieces, called key shares. Each validator holds many key shares, and the amount of shares is dictated by the amount AXL tokens staked with the validator. ## Where can I get axlUSDC? -There are three ways to acquire axlUSDC: + +There are three ways to acquire axlUSDC: 1. DEXs on many connected chains list pairs in axlUSDC, supported by liquidity pools. We maintain a [regularly updated list of liquid pools for axlUSDC](https://axelar.network/blog/liquidity-pools-for-bridged-assets-via-axelar) (and all Axelar-wrapped assets). -1. Squid, built with Axelar's General Message Passing, provides liquid [cross-chain swaps](https://axelar.network/blog/what-is-a-cross-chain-swap) using axlUSDC as a routing asset. Using Squid, you can start from any connected chain and swap into axlUSDC on any other connected chain. Squid is the engine powering liquid cross-chain swaps on a growing list of DEXs, and you can always use their [cross-chain swap widget](https://app.squidrouter.com/) to handle any kind of cross-chain swap you like, without having to trust your funds to a centralized exchange. -1. If you're holding USDC and want to take it cross-chain, you can bridge it via [satellite.money](https://satellite.money), Axelar's bridging app. +1. Squid, built with Axelar's General Message Passing, provides liquid [cross-chain swaps](https://axelar.network/blog/what-is-a-cross-chain-swap) using axlUSDC as a routing asset. Using Squid, you can start from any connected chain and swap into axlUSDC on any other connected chain. Squid is the engine powering liquid cross-chain swaps on a growing list of DEXs, and you can always use their [cross-chain swap widget](https://app.squidrouter.com/) to handle any kind of cross-chain swap you like, without having to trust your funds to a centralized exchange. +1. If you're holding USDC and want to take it cross-chain, you can bridge it via [satellite.money](https://satellite.money), Axelar's bridging app. For now, axlUSDC is widely used in the Cosmos ecosystem, where it is the canonical representation of USDC on [Osmosis](https://osmosis.zone/) and many other Cosmos chains. -Learn more about cross-chain token transfers using General Message Passing that can send axlUSDC and other wrapped assets: +Learn more about cross-chain token transfers using General Message Passing that can send axlUSDC and other wrapped assets: -* Read this [blog post from Axelar co-founder Sergey Gorbunov](https://axelar.network/blog/cross-chain-function-calls-will-replace-bridges). -* [Start building with General Message Passing and axlUSDC](/dev/general-message-passing/overview) \ No newline at end of file +- Read this [blog post from Axelar co-founder Sergey Gorbunov](https://axelar.network/blog/cross-chain-function-calls-will-replace-bridges). +- [Start building with General Message Passing and axlUSDC](/dev/general-message-passing/overview) diff --git a/src/pages/learn/cli.mdx b/src/content/docs/learn/cli.mdx similarity index 92% rename from src/pages/learn/cli.mdx rename to src/content/docs/learn/cli.mdx index 7e588da57..efd89ffd0 100644 --- a/src/pages/learn/cli.mdx +++ b/src/content/docs/learn/cli.mdx @@ -1,6 +1,6 @@ # Axelar command-line interface (CLI) -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Some CLI commands require access to a fully synced Axelar node. Learn how to [start your own Axelar node](/node/join). @@ -17,10 +17,9 @@ In addition to the Axelar-specific CLI features mentioned above, Axelar also off View the [full CLI documentation](https://github.com/axelarnetwork/axelar-core/blob/main/docs/cli/toc.md) for the latest node version, or choose a specific version: - - + Tip: If you submit a transaction and encounter an out of gas error, use the following flags to set the gas manually. - +
    ```bash --gas=auto --gas-adjustment=1.5 ``` diff --git a/src/pages/learn/cli/axl-from-evm.mdx b/src/content/docs/learn/cli/axl-from-evm.mdx similarity index 83% rename from src/pages/learn/cli/axl-from-evm.mdx rename to src/content/docs/learn/cli/axl-from-evm.mdx index 8a5150634..575a0c8e4 100644 --- a/src/pages/learn/cli/axl-from-evm.mdx +++ b/src/content/docs/learn/cli/axl-from-evm.mdx @@ -1,13 +1,13 @@ # Redeem AXL from an EVM chain -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Redeem AXL tokens from an EVM chain to Axelar using the terminal. ## Prerequisites - Skill level: intermediate -- Prerequisites for [Send AXL to an EVM chain](./axl-to-evm) +- Prerequisites for [Send AXL to an EVM chain](/learn/cli/axl-to-evm/) ## Redeem AXL tokens from an EVM chain @@ -32,22 +32,25 @@ axelard q nexus latest-deposit-address {EVM_CHAIN} axelarnet {MY_ADDR} Use MetaMask to send some wrapped AXL tokens on `{EVM_CHAIN}` to the new temporary deposit address `{EVM_TEMP_ADDR}`. Save the transaction hash `{EVM_TX_HASH}` for later. - Danger: Send only `Axelar` ERC20 tokens to `{EVM_TEMP_ADDR}`. Any other token sent to `{EVM_TEMP_ADDR}` will be lost. + Danger: Send only `Axelar` ERC-20 tokens to `{EVM_TEMP_ADDR}`. Any other token + sent to `{EVM_TEMP_ADDR}` will be lost. Note: Third-party monitoring tools will automatically complete the remaining steps of this process. -Wait a few minutes then check your Axelar `my_account` account AXL token balance as per [Basic node management](/node/basic). +Wait a few minutes then check your Axelar `my_account` account AXL token balance as per [Basic node management](/node/basic/). + Caution: If you attempt the remaining steps while third-party monitoring tools are active then your commands are likely to conflict with third-party commands. In this case you are likely to observe errors. Deeper investigation might be needed to resolve conflicts and complete the transfer. The remaining steps are needed only if there are no active third-party monitoring tools and you wish to complete the process manually. + -Do not proceed to the next step until you have waited for sufficiently many block confirmations on the EVM chain. Block confirmation minimums can be found at [Testnet resources](/resources/testnet), [Mainnet resources](/resources/mainnet). +Do not proceed to the next step until you have waited for sufficiently many block confirmations on the EVM chain. Block confirmation minimums can be found at [Testnet Resources](/resources/contract-addresses/testnet/), [Mainnet Resources](/resources/contract-addresses/mainnet/). Confirm the EVM chain transaction on Axelar. @@ -87,13 +90,15 @@ Wait for `status: BATCHED_COMMANDS_STATUS_SIGNED` and copy the `execute_data`. Use MetaMask to send a transaction on `{EVM_CHAIN}` with the `execute_data` to the Axelar gateway contract address `{GATEWAY_ADDR}`. - Danger: Post your transaction to the correct chain! Set your MetaMask network to `{EVM_CHAIN}`. + Danger: Post your transaction to the correct chain! Set your MetaMask network + to `{EVM_CHAIN}`. Caution: Manually increase the gas limit to 5 million gas (5000000). If you don't do this then the transaction will fail due to insufficient gas and you will not receive your tokens. Before you click "confirm": select "EDIT", change "Gas Limit" to 5000000, and "Save" + @@ -101,7 +106,7 @@ Before you click "confirm": select "EDIT", change "Gas Limit" to 5000000, and "S ### 1. Documentation -[Testnet resources](/resources/testnet), [Mainnet resources](/resources/mainnet). +[Testnet Resources](/resources/contract-addresses/testnet/), [Mainnet Resources](/resources/contract-addresses/mainnet/). ### 2. Terminal @@ -113,7 +118,7 @@ axelard q evm gateway-address {EVM_CHAIN} To send a transaction to `{GATEWAY_ADDR}` using MetaMask: paste hex from `execute_data` above into "Hex Data" field. (Do not send tokens!) -Optional: Check your Axelar `my_account` account AXL token balance as per [Basic node management](/node/basic) so that you can observe balance change. +Optional: Check your Axelar `my_account` account AXL token balance as per [Basic node management](/node/basic/) so that you can observe balance change. Execute the pending transfer: diff --git a/src/pages/learn/cli/axl-to-evm.mdx b/src/content/docs/learn/cli/axl-to-evm.mdx similarity index 88% rename from src/pages/learn/cli/axl-to-evm.mdx rename to src/content/docs/learn/cli/axl-to-evm.mdx index 678f3fa1f..b0895905d 100644 --- a/src/pages/learn/cli/axl-to-evm.mdx +++ b/src/content/docs/learn/cli/axl-to-evm.mdx @@ -1,27 +1,27 @@ # Send AXL to an EVM chain -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Transfer AXL tokens from Axelar to an EVM chain using the terminal. ## Prerequisites - Skill level: intermediate -- You have downloaded the Axelar blockchain and are comfortable with [Basic node management](/node/basic). +- You have downloaded the Axelar blockchain and are comfortable with [Basic node management](/node/basic/). - Your Axelar node has an account named `my_account` that you control. Let `{MY_ADDR}` denote the address of your `my_account` account. - Select an EVM chain `{EVM_CHAIN}` from: Ethereum, Avalanche, Fantom, Moonbeam, Polygon. -- Complete steps from [MetaMask for EVM chains](/resources/metamask) to connect your MetaMask to `{EVM_CHAIN}`. +- Complete steps from [MetaMask for EVM chains](/resources/metamask/) to connect your MetaMask to `{EVM_CHAIN}`. - You need both AXL tokens and `{EVM_CHAIN}` tokens to pay transaction fees. - **Testnet:** - - Get some `{EVM_CHAIN}` testnet tokens as per [MetaMask for EVM chains](/resources/metamask). + - Get some `{EVM_CHAIN}` testnet tokens as per [MetaMask for EVM chains](/resources/metamask/). - Get some AXL tokens from the Axelar faucets: [testnet](https://faucet.testnet.axelar.dev/). - **Mainnet:** You are responsible for obtaining your own tokens. - `{EVM_DEST_ADDR}` is an address controlled by you on the external EVM chain `{EVM_CHAIN}`. (In your MetaMask, for example.) This is where your AXL tokens will be sent. -- `{AMOUNT}` is the amount of AXL tokens you wish to transfer, denominated in `uaxl`. Recall that `1 AXL = 1000000 uaxl`. See [Testnet resources](/resources/testnet) or [Mainnet resources](/resources/mainnet) for minimum transfer amounts. +- `{AMOUNT}` is the amount of AXL tokens you wish to transfer, denominated in `uaxl`. Recall that `1 AXL = 1000000 uaxl`. See [Testnet Resources](/resources/contract-addresses/testnet/) or [Mainnet Resources](/resources/contract-addresses/mainnet/) for minimum transfer amounts. ## Send AXL tokens from Axelar to an EVM chain -Optional: Verify that your `my_account` account has sufficient balance as per [Basic node management](/node/basic). +Optional: Verify that your `my_account` account has sufficient balance as per [Basic node management](/node/basic/). Link your `{EVM_DEST_ADDR}` to a new temporary deposit address on Axelar: @@ -50,13 +50,15 @@ axelard tx bank send my_account {AXELAR_TEMP_ADDR} {AMOUNT}uaxl --from my_accoun Note: Third-party monitoring tools will automatically complete the remaining steps of this process. -Wait a few minutes then check your MetaMask for the AXL tokens. Don't forget to import the AXL token into MetaMask so you can see your balance as described in [MetaMask for EVM chains](/resources/metamask). +Wait a few minutes then check your MetaMask for the AXL tokens. Don't forget to import the AXL token into MetaMask so you can see your balance as described in [MetaMask for EVM chains](/resources/metamask/). + Caution: If you attempt the remaining steps while third-party monitoring tools are active then your commands are likely to conflict with third-party commands. In this case you are likely to observe errors. Deeper investigation might be needed to resolve conflicts and complete the transfer. The remaining steps are needed only if there are no active third-party monitoring tools and you wish to complete the process manually. + Confirm the deposit transaction. Look for `{TX_HASH}` in the output of the previous command. @@ -89,13 +91,15 @@ Wait for `status: BATCHED_COMMANDS_STATUS_SIGNED` and copy the `execute_data`. Use MetaMask to send a transaction on `{EVM_CHAIN}` with the `execute_data` to the Axelar gateway contract address `{GATEWAY_ADDR}`. - Danger: Post your transaction to the correct chain! Set your MetaMask network to `{EVM_CHAIN}`. + Danger: Post your transaction to the correct chain! Set your MetaMask network + to `{EVM_CHAIN}`. Caution: Manually increase the gas limit to 5 million gas (5000000). If you don't do this then the transaction will fail due to insufficient gas and you will not receive your tokens. Before you click "confirm": select "EDIT", change "Gas Limit" to 5000000, and "Save" + @@ -103,7 +107,7 @@ Before you click "confirm": select "EDIT", change "Gas Limit" to 5000000, and "S ### 1. Documentation -[Testnet resources](/resources/testnet), [Mainnet resources](/resources/mainnet). +[Testnet Resources](/resources/contract-addresses/testnet/), [Mainnet Resources](/resources/contract-addresses/mainnet/). ### 2. Terminal diff --git a/src/pages/learn/cli/reference.md b/src/content/docs/learn/cli/reference.md similarity index 62% rename from src/pages/learn/cli/reference.md rename to src/content/docs/learn/cli/reference.md index 8db9beea0..da3e2253a 100644 --- a/src/pages/learn/cli/reference.md +++ b/src/content/docs/learn/cli/reference.md @@ -1,11 +1,12 @@ # Axelar CLI reference -In addition to the Axelar-specific CLI features mentioned in the [CLI Introduction](./), Axelar also offers the same basic set of CLI commands as any other Cosmos SDK project. +In addition to the Axelar-specific CLI features mentioned in the [CLI Introduction](./), Axelar also offers the same basic set of CLI commands as any other Cosmos SDK project. ## Complete Axelar CLI reference + View the [full CLI documentation](https://github.com/axelarnetwork/axelar-core/blob/main/docs/cli/toc.md) for the latest node version, or choose a specific version: -* [v33](https://github.com/axelarnetwork/axelar-core/blob/v0.33.3/docs/cli/toc.md) -* [v32](https://github.com/axelarnetwork/axelar-core/blob/v0.32.2/docs/cli/toc.md) -* [v31](https://github.com/axelarnetwork/axelar-core/blob/v0.31.4/docs/cli/toc.md) -* [v29](https://github.com/axelarnetwork/axelar-core/blob/v0.29.1/docs/cli/toc.md) \ No newline at end of file +- [v33](https://github.com/axelarnetwork/axelar-core/blob/v0.33.3/docs/cli/toc.md) +- [v32](https://github.com/axelarnetwork/axelar-core/blob/v0.32.2/docs/cli/toc.md) +- [v31](https://github.com/axelarnetwork/axelar-core/blob/v0.31.4/docs/cli/toc.md) +- [v29](https://github.com/axelarnetwork/axelar-core/blob/v0.29.1/docs/cli/toc.md) diff --git a/src/pages/learn/cli/ust-from-evm.mdx b/src/content/docs/learn/cli/ust-from-evm.mdx similarity index 86% rename from src/pages/learn/cli/ust-from-evm.mdx rename to src/content/docs/learn/cli/ust-from-evm.mdx index 2fbbdcf48..bf55f6ada 100644 --- a/src/pages/learn/cli/ust-from-evm.mdx +++ b/src/content/docs/learn/cli/ust-from-evm.mdx @@ -1,13 +1,13 @@ # Redeem UST from an EVM chain -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Redeem UST tokens from an EVM chain to Terra using the terminal. ## Prerequisites - Skill level: intermediate -- Prerequisites for [Send UST to an EVM chain](./ust-to-evm) +- Prerequisites for [Send UST to an EVM chain](/learn/cli/ust-to-evm/) - `{TERRA_DEST_ADDR}` is an address controlled by you on the Terra chain. This is where your UST tokens will be redeemed. ## Redeem UST tokens from an EVM chain @@ -27,22 +27,25 @@ successfully linked {EVM_TEMP_ADDR} and {TERRA_DEST_ADDR} Use MetaMask to send some wrapped AXL tokens on `{EVM_CHAIN}` to the new temporary deposit address `{EVM_TEMP_ADDR}`. Save the transaction hash `{EVM_TX_HASH}` for later. - Danger: Send only `Axelar Wrapped UST` ERC20 tokens to `{EVM_TEMP_ADDR}`. Any other token sent to `{EVM_TEMP_ADDR}` will be lost. + Danger: Send only `Axelar Wrapped UST` ERC-20 tokens to `{EVM_TEMP_ADDR}`. Any + other token sent to `{EVM_TEMP_ADDR}` will be lost. Note: Third-party monitoring tools will automatically complete the remaining steps of this process. Wait a few minutes then check your Terra `{TERRA_DEST_ADDR}` account UST token balance. + Caution: If you attempt the remaining steps while third-party monitoring tools are active then your commands are likely to conflict with third-party commands. In this case you are likely to observe errors. Deeper investigation might be needed to resolve conflicts and complete the transfer. The remaining steps are needed only if there are no active third-party monitoring tools and you wish to complete the process manually. + -Do not proceed to the next step until you have waited for sufficiently many block confirmations on the EVM chain. Block confirmation minimums can be found at [Testnet resources](/resources/testnet), [Mainnet resources](/resources/mainnet). +Do not proceed to the next step until you have waited for sufficiently many block confirmations on the EVM chain. Block confirmation minimums can be found at [Testnet Resources](/resources/contract-addresses/testnet/), [Mainnet Resources](/resources/contract-addresses/mainnet/). Confirm the EVM chain transaction on Axelar. @@ -76,13 +79,15 @@ Wait for `status: BATCHED_COMMANDS_STATUS_SIGNED` and copy the `execute_data`. Use MetaMask to send a transaction on `{EVM_CHAIN}` with the `execute_data` to the Axelar gateway contract address `{GATEWAY_ADDR}`. - Danger: Post your transaction to the correct chain! Set your MetaMask network to `{EVM_CHAIN}`. + Danger: Post your transaction to the correct chain! Set your MetaMask network + to `{EVM_CHAIN}`. Caution: Manually increase the gas limit to 5 million gas (5000000). If you don't do this then the transaction will fail due to insufficient gas and you will not receive your tokens. Before you click "confirm": select "EDIT", change "Gas Limit" to 5000000, and "Save" + @@ -90,7 +95,7 @@ Before you click "confirm": select "EDIT", change "Gas Limit" to 5000000, and "S ### 1. Documentation -[Testnet resources](/resources/testnet), [Mainnet resources](/resources/mainnet). +[Testnet Resources](/resources/contract-addresses/testnet/), [Mainnet Resources](/resources/contract-addresses/mainnet/). ### 2. Terminal diff --git a/src/pages/learn/cli/ust-to-evm.mdx b/src/content/docs/learn/cli/ust-to-evm.mdx similarity index 81% rename from src/pages/learn/cli/ust-to-evm.mdx rename to src/content/docs/learn/cli/ust-to-evm.mdx index b5b311b80..67f9a4276 100644 --- a/src/pages/learn/cli/ust-to-evm.mdx +++ b/src/content/docs/learn/cli/ust-to-evm.mdx @@ -1,13 +1,13 @@ # Send UST to an EVM chain -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Transfer UST tokens from Terra to an EVM chain using the terminal. ## Prerequisites - Skill level: intermediate -- Prerequisites for [Send AXL to an EVM chain](./axl-to-evm) +- Prerequisites for [Send AXL to an EVM chain](/learn/cli/axl-to-evm/) ## Send UST tokens from Terra to an EVM chain @@ -35,8 +35,8 @@ Use a web wallet such as Keplr. See [Transfer Terra assets to EVM chains using S ### IBC from the terminal You need shell access to a Terra node with at least `{AMOUNT}` balance of UST tokens in an account called `terra-validator`. -Get `{TERRA_TO_AXELAR_CHANNEL_ID}` from [Testnet resources](/resources/testnet) or [Mainnet resources](/resources/mainnet). - +Get `{TERRA_TO_AXELAR_CHANNEL_ID}` from [Testnet Resources](/resources/contract-addresses/testnet/) or [Mainnet Resources](/resources/contract-addresses/mainnet/). +
    ```bash terrad tx ibc-transfer transfer transfer {TERRA_TO_AXELAR_CHANNEL_ID} {AXELAR_TEMP_ADDR} --packet-timeout-timestamp 0 --packet-timeout-height "0-20000" {AMOUNT}uusd --gas-prices 0.15uusd --from terra-validator -y -b block ``` @@ -48,16 +48,18 @@ Wait a few minutes for the IBC relayer to relay your transaction to Axelar. Note: Third-party monitoring tools will automatically complete the remaining steps of this process. -Wait a few minutes then check your MetaMask for the UST tokens. Don't forget to import the UST token into MetaMask so you can see your balance as described in [MetaMask for EVM chains](/resources/metamask). +Wait a few minutes then check your MetaMask for the UST tokens. Don't forget to import the UST token into MetaMask so you can see your balance as described in [MetaMask for EVM chains](/resources/metamask/). + Caution: If you attempt the remaining steps while third-party monitoring tools are active then your commands are likely to conflict with third-party commands. In this case you are likely to observe errors. Deeper investigation might be needed to resolve conflicts and complete the transfer. The remaining steps are needed only if there are no active third-party monitoring tools and you wish to complete the process manually. + -Verify the IBC transaction by checking the balances of `{AXELAR_TEMP_ADDR}` as per [Basic node management](/node/basic). Output should contain something like: +Verify the IBC transaction by checking the balances of `{AXELAR_TEMP_ADDR}` as per [Basic node management](/node/basic/). Output should contain something like: ``` balances: @@ -66,12 +68,14 @@ balances: ``` - Note: You will not see `UST`, `uusd` or a similar token denomination for `{IBC_DENOM}`. IBC token denominations look something like `ibc/6F4968A73F90CF7DE6394BF937D6DF7C7D162D74D839C13F53B41157D315E05F` + Note: You will not see `UST`, `uusd` or a similar token denomination for ` + {IBC_DENOM}`. IBC token denominations look something like + `ibc/6F4968A73F90CF7DE6394BF937D6DF7C7D162D74D839C13F53B41157D315E05F` -Get `{IBC_DENOM}` from [Testnet resources](/resources/testnet) or [Mainnet resources](/resources/mainnet). +Get `{IBC_DENOM}` from [Testnet Resources](/resources/contract-addresses/testnet/) or [Mainnet Resources](/resources/contract-addresses/mainnet/). -The remaining steps are similar to [Transfer AXL tokens from Axelar to an EVM chain using the terminal](./axl-to-evm). +The remaining steps are similar to [Transfer AXL tokens from Axelar to an EVM chain using the terminal](/learn/cli/axl-to-evm/). Confirm the deposit transaction. Look for `{TX_HASH}` in the output of the previous command. @@ -103,13 +107,15 @@ Wait for `status: BATCHED_COMMANDS_STATUS_SIGNED` and copy the `execute_data`. Use MetaMask to send a transaction on `{EVM_CHAIN}` with the `execute_data` to the Axelar gateway contract address `{GATEWAY_ADDR}`. - Danger: Post your transaction to the correct chain! Set your MetaMask network to `{EVM_CHAIN}`. + Danger: Post your transaction to the correct chain! Set your MetaMask network + to `{EVM_CHAIN}`. Caution: Manually increase the gas limit to 5 million gas (5000000). If you don't do this then the transaction will fail due to insufficient gas and you will not receive your tokens. Before you click "confirm": select "EDIT", change "Gas Limit" to 5000000, and "Save" + @@ -117,7 +123,7 @@ Before you click "confirm": select "EDIT", change "Gas Limit" to 5000000, and "S ### 1. Documentation -[Testnet resources](/resources/testnet), [Mainnet resources](/resources/mainnet). +[Testnet Resources](/resources/contract-addresses/testnet/), [Mainnet Resources](/resources/contract-addresses/mainnet/). ### 2. Terminal diff --git a/src/pages/learn/evm-governance.mdx b/src/content/docs/learn/evm-governance.mdx similarity index 100% rename from src/pages/learn/evm-governance.mdx rename to src/content/docs/learn/evm-governance.mdx diff --git a/src/pages/learn/intro.mdx b/src/content/docs/learn/intro.mdx similarity index 86% rename from src/pages/learn/intro.mdx rename to src/content/docs/learn/intro.mdx index 9660ebab0..95df64041 100644 --- a/src/pages/learn/intro.mdx +++ b/src/content/docs/learn/intro.mdx @@ -1,3 +1,3 @@ # Learn about Axelar -Dive into all the components that come together to form the Axelar network, for a high-level understanding of the vision and design; go deeper and gain technical knowledge of specialized functions, including our CLI and SDK. +Dive into all the components that come together to form the Axelar network, for a high-level understanding of the vision and design; go deeper and gain technical knowledge of specialized functions, including our CLI and SDK. diff --git a/src/pages/learn/network/flow.mdx b/src/content/docs/learn/network/flow.mdx similarity index 87% rename from src/pages/learn/network/flow.mdx rename to src/content/docs/learn/network/flow.mdx index 245ef0e29..3b009d00e 100644 --- a/src/pages/learn/network/flow.mdx +++ b/src/content/docs/learn/network/flow.mdx @@ -1,7 +1,8 @@ # General Flow of Events processed by Axelar Network -This section will provide a high-level understanding of the end-to-end flow by which Axelar network processes cross-chain messages. It includes: -- How messages are picked up by Axelar on external connected chains. +This section will provide a high-level understanding of the end-to-end flow by which Axelar network processes cross-chain messages. It includes: + +- How messages are picked up by Axelar on external connected chains. - How messages are delivered to the destination chains. - How Axelar validators and cryptography work to securely route and transfer messages. - An introduction to the underlying relayer services that provide a smooth user experience. @@ -12,23 +13,29 @@ Before understanding the flow of events processed by Axelar, it's important to u Axelar is a proof-of-stake blockchain network built using Cosmos SDK. It has its own permissionless set of validators, which constantly produce blocks containing transactions. This validator set is used by the network to securely process cross-chain messages through voting on the legitimacy of all messages. To understand more about the setup, take a look at the Axelar Tech Stack Diagram. -![tech-stack.png](/images/learn-tech-stack.jpg) + + + +
    +![learn-security-decentralization.png](/images/learn-tech-stack-light.svg) +
    Axelar delivers secure cross-chain communication between separate blockchain networks. This could involve making cross-chain token transfers, calling a smart contract on another chain or passing general, arbitrary messages across chains. While each feature's exact processing flow varies, it can be simplified down to a cross-chain "message" that the network processes. ## Cross-chain General Message Passing requests -Axelar enables dApp builders to add cross-chain functionality to their applications, through a suite of APIs. These APIs allow a dApp user to send a message containing arbitrary data cross-chain, from the source chain to the destination chain. Thus, a dApp may call a smart contract on the destination chain, and attach general data information to be used as input for the smart contract call. To do this, the dApp interacts with the Axelar Gateway, an Axelar-operated installation on the source chain, which contains the functions and logic needed for initiating and processing any cross-chain messages. +Axelar enables dApp builders to add cross-chain functionality to their applications, through a suite of APIs. These APIs allow a dApp user to send a message containing arbitrary data cross-chain, from the source chain to the destination chain. Thus, a dApp may call a smart contract on the destination chain, and attach general data information to be used as input for the smart contract call. To do this, the dApp interacts with the Axelar Gateway, an Axelar-operated installation on the source chain, which contains the functions and logic needed for initiating and processing any cross-chain messages. ## Gateways -Once a cross-chain message is initiated by a dApp user, its first stop is to interact with an Axelar Gateway. On each chain connected to Axelar network, a Gateway is deployed. On EVM chains, it is a smart contract address. On Cosmos and other non-EVM chains, it is an application with logic and the ability to communicate with Axelar network. This Gateway is used to receive messages from a connected dApp and send them into the Axelar network for routing to any connected chain. +Once a cross-chain message is initiated by a dApp user, its first stop is to interact with an Axelar Gateway. On each chain connected to Axelar network, a Gateway is deployed. On EVM chains, it is a smart contract address. On Cosmos and other non-EVM chains, it is an application with logic and the ability to communicate with Axelar network. This Gateway is used to receive messages from a connected dApp and send them into the Axelar network for routing to any connected chain. -The Gateway is controlled by a key, which is held jointly by all Axelar validators. This is accomplished through a multiparty cryptography scheme, where the key is divided into many pieces, called key shares. Each validator holds many key shares, and the amount of shares is dictated by the amount AXL tokens staked with the validator. +The Gateway is controlled by a key, which is held jointly by all Axelar validators. This is accomplished through a multiparty cryptography scheme, where the key is divided into many pieces, called key shares. Each validator holds many key shares, and the amount of shares is dictated by the amount AXL tokens staked with the validator. Simply put, Gateways enable communication between Axelar and its connected chains, and they have two main functions. On the source chain where the message originates, the Gateway enables initiating cross-chain message requests. On the destination chain where the message is received, the Gateway enables the message to be executed and completes the cross-chain protocol. - ## Message processing and relayers Axelar network must be aware of events happening and cross-chain communication requests being submitted on external supported chains. This function is handled by relayers. Once a Gateway receives a message, it will generate an event. Axelar runs relayer services which observe all connected chains, and these relayers will pick up the event and submit it to the Axelar network for processing. These relayer services are a free, operational convenience Axelar provides, and can be run by anyone who wishes to create and use their own relayer service instead. @@ -37,34 +44,45 @@ Axelar network must be aware of events happening and cross-chain communication r Since anyone can run their own relayer services and submit events to Axelar network (see the previous section on message processing and relayers), all events received by Axelar must first go through validation, to ensure the submitted events are correct and trustworthy. In many blockchain ecosystems, trust comes from the network validators, who are incentivized to behave honestly through consensus protocols, such as proof-of-stake. These validators are already incentivized by Axelar network’s proof-of-stake consensus model to create blocks and approve transactions, so it is a natural extension to have the validators participate in consensus and vote on the truthfulness of cross-chain events being submitted. -Once the event sent by an external chain is received by Axelar, a poll is generated and Axelar validators vote on the poll. In order to vote on the legitimacy of a message, Axelar validators need to verify the submitted event. Each validator runs their own node for the source chain where the incoming event originated, and by querying the RPC endpoint of their source-chain node, validators can check if the submitted event was observed on their source-chain node. If the event is found, the validator votes in the poll to approve the message as legitimate. +Once the event sent by an external chain is received by Axelar, a poll is generated and Axelar validators vote on the poll. In order to vote on the legitimacy of a message, Axelar validators need to verify the submitted event. Each validator runs their own node for the source chain where the incoming event originated, and by querying the RPC endpoint of their source-chain node, validators can check if the submitted event was observed on their source-chain node. If the event is found, the validator votes in the poll to approve the message as legitimate. -As Axelar grows and connects more and more chains, it becomes increasingly restrictive to require every Axelar validator to run a node for every chain supported by the network. Instead, Axelar validators are incentivized to run nodes for as many supported chains as possible, through increased staking rewards, based on the number of chains they support. By having Axelar’s decentralized, proof-of-stake validator network vote on the legitimacy of each cross-chain message, the network is able to process and route them to the destination chains securely. Only verified events are translated into actions on the destination chain, and events not verified by Axelar validators are discarded. Afterwards, the event is validated by the Axelar network, processed by the network consensus protocol and recorded in a block. The cross-chain message is routed into a queue of messages for the destination chain, and ready to be sent to the destination-chain Gateway. +As Axelar grows and connects more and more chains, it becomes increasingly restrictive to require every Axelar validator to run a node for every chain supported by the network. Instead, Axelar validators are incentivized to run nodes for as many supported chains as possible, through increased staking rewards, based on the number of chains they support. By having Axelar’s decentralized, proof-of-stake validator network vote on the legitimacy of each cross-chain message, the network is able to process and route them to the destination chains securely. Only verified events are translated into actions on the destination chain, and events not verified by Axelar validators are discarded. Afterwards, the event is validated by the Axelar network, processed by the network consensus protocol and recorded in a block. The cross-chain message is routed into a queue of messages for the destination chain, and ready to be sent to the destination-chain Gateway. -By using proof-of-stake consensus to secure cross-chain messages, additional assumptions in security are avoided, as most of the Axelar-connected networks use the same proof-of-stake consensus model to validate their transactions. +By using proof-of-stake consensus to secure cross-chain messages, additional assumptions in security are avoided, as most of the Axelar-connected networks use the same proof-of-stake consensus model to validate their transactions. ## Submitting a message to the destination chain -After the message is approved by Axelar network validators, it needs to be authorized. The Gateway can only allow actions on the external chain if the number of validators holding key shares who authorize the action reaches a set threshold. +After the message is approved by Axelar network validators, it needs to be authorized. The Gateway can only allow actions on the external chain if the number of validators holding key shares who authorize the action reaches a set threshold. -Once a message is authorized, anyone can take this signed message and submit it to the destination chain for processing. Similar to the relayer services described earlier, which observe external chain events and bring them into Axelar network, another set of relayer services monitors outgoing transaction queues containing cross-chain messages that are already approved and signed, and periodically submits these transactions to external chains. Just as for incoming messages, these outbound Axelar relayer services are a free, operational convenience Axelar provides, and can be run by anyone who wishes to create and use their own relayer service instead. +Once a message is authorized, anyone can take this signed message and submit it to the destination chain for processing. Similar to the relayer services described earlier, which observe external chain events and bring them into Axelar network, another set of relayer services monitors outgoing transaction queues containing cross-chain messages that are already approved and signed, and periodically submits these transactions to external chains. Relayers can be run by anyone who wishes to create and use their own relayer service instead. -After a relayer sends it out, a Gateway on the destination chain receives the approved message, where its payload is marked as approved by Axelar. The Gateway stores the contract call approval along with a hash of the payload, representing the legitimacy of this cross-chain message. The approved payload can now be executed by anyone at any time. +After a relayer sends it out, a Gateway on the destination chain receives the approved message, where its payload is marked as approved by Axelar. The Gateway stores the contract call approval along with a hash of the payload, representing the legitimacy of this cross-chain message. The approved payload can now be executed by anyone at any time. ## Gas and executor services Once the cross-chain payload is marked as approved by the Axelar Gateway contract, it needs to be sent to the destination dApp or contract and executed, in order to perform a function call or token transfer. This execution requires tokens of the destination chain to cover gas fee costs. The gas could be paid in a few different ways. One option is to have the Web3 user pay the fee manually for their own cross-chain message. This makes for an inconvenient user experience, as it requires the user to acquire destination-chain and source-chain tokens. Axelar offers Gas and Executor services to help make this easier. -Axelar creates and deploys a smart contract called the Gas Receiver to all connected EVM chains. (General Message Passing for Cosmos chains is currently under development and this may enable Gas-Receiver-like services to be deployed there, as well.) This Gas Receiver allows the user to pay for all transaction fees required throughout the entire journey of their cross-chain message in a one-time payment on the source chain, in the source chain's native token. The Gas Receiver estimates the total gas cost required across source chain, Axelar network and destination chain, and converts source-chain tokens (or any token Axelar supports) into AXL, destination-chain tokens and any other required currencies. For more details on this process, see the diagram below and read this [blog post](https://medium.com/@axelar-foundation/the-axl-token-the-cross-chain-future-3dee3dc45e95) providing a high-level description of the AXL token's uses and benefits. - -![tx-flow-simple.png](/images/learn-tx-flow-simple.jpg) - +Axelar creates and deploys a smart contract called the Gas Receiver to all connected EVM chains. (General Message Passing for Cosmos chains is currently under development and this may enable Gas-Receiver-like services to be deployed there, as well.) This Gas Receiver allows the user to pay for all transaction fees required throughout the entire journey of their cross-chain message in a one-time payment on the source chain, in the source chain's native token. The Gas Receiver estimates the total gas cost required across source chain, Axelar network and destination chain, and converts source-chain tokens (or any token Axelar supports) into AXL, destination-chain tokens and any other required currencies. For more details on this process, see the diagram below and read this [blog post](https://medium.com/@axelar-foundation/the-axl-token-the-cross-chain-future-3dee3dc45e95) providing a high-level description of the AXL token's uses and benefits. + + + + Your browser does not support SVG + ## Monitoring and recovery -Once the message is executed on the destination chain, its cross-chain journey is complete. However, there may be factors that prevent this completion at various stages of the process. These might include a gas limit set too low, or contract logic that is incompatible with a function called on the destination chain. In order to mitigate against these obstructions, Axelar provides various tools for [debugging](https://docs.axelar.dev/dev/debug/error-debugging), [monitoring and recovery](https://docs.axelar.dev/dev/general-message-passing/monitoring). - -For example, while a cross-chain message is being processed by Axelar, a user or developer can follow and observe its journey. The Axelarscan explorer has a General Message Passing [tracking tool](https://testnet.axelarscan.io/gmp/search) built for this purpose. The user can enter their source-chain sender address or transaction hash into the Axelarscan search bar to find their cross-chain message. This will bring up a detailed page containing information about the message, and its current status. If there are any issues with the transaction, this page will also suggest possible fixes. Visit this [link](https://docs.axelar.dev/dev/general-message-passing/monitoring) for more information on how to use this monitoring and recovery tool. - - +Once the message is executed on the destination chain, its cross-chain journey is complete. However, there may be factors that prevent this completion at various stages of the process. These might include a gas limit set too low, or contract logic that is incompatible with a function called on the destination chain. In order to mitigate against these obstructions, Axelar provides various tools for [debugging](/dev/general-message-passing/debug/error-debugging/), [monitoring and recovery](/dev/general-message-passing/monitoring/). +For example, while a cross-chain message is being processed by Axelar, a user or developer can follow and observe its journey. The Axelarscan explorer has a General Message Passing [tracking tool](https://testnet.axelarscan.io/gmp/search) built for this purpose. The user can enter their source-chain sender address or transaction hash into the Axelarscan search bar to find their cross-chain message. This will bring up a detailed page containing information about the message, and its current status. If there are any issues with the transaction, this page will also suggest possible fixes. Visit this [link](/dev/general-message-passing/monitoring/) for more information on how to use this monitoring and recovery tool. diff --git a/src/pages/learn/security.mdx b/src/content/docs/learn/security.mdx similarity index 82% rename from src/pages/learn/security.mdx rename to src/content/docs/learn/security.mdx index 17f2779ea..5ce0ffd89 100644 --- a/src/pages/learn/security.mdx +++ b/src/content/docs/learn/security.mdx @@ -15,8 +15,12 @@ In Byzantine systems, if you break liveness, the system halts its operation, but This kind of decentralization is critical to satisfy strong safety and liveness properties needed to handle cross-chain functions. This is why Axelar is built using battle-tested proof-of-stake consensus, supporting a diverse and dynamic validator set. Anyone can join, anyone can participate, anyone can contribute to the security of the network. -![learn-security-decentralization.png](/images/learn-security-decentralization.jpg) - + +
    +![learn-security-decentralization.png](/images/learn-security-decentralization-light.svg) +
    ## Quadratic voting @@ -28,8 +32,13 @@ Quadratic voting is a way to continue decentralizing the system while making it Note that while quadratic voting is implemented for validation and processing of cross-chain transactions, the underlying consensus follows the standard PoS staking model (1 token, 1 vote) for block production and rewards. -![learn-security-quadratic-voting.png](/images/learn-security-quadratic-voting.jpg) + +
    +![learn-security-quadratic-voting.png](/images/learn-security-quadratic-voting-light.svg) +
    ## Preemptive measures @@ -41,18 +50,18 @@ Axelar network supports General Message Passing, but certain major assets (e.g., ### Key rotations on the network -Validators of the Axelar network maintain keys that allow them to coauthorize cross-chain requests, a process similar to how validators coauthorize every block on the blockchain. Validators are strongly encouraged to implement best practices for isolating these keys, and are [required to rotate them periodically](https://docs.axelar.dev/validator/operations/mnemonic-rotation). These key rotations secure the network against a persistent attacker, who might try to accumulate malicious keys by compromising validators sequentially. +Validators of the Axelar network maintain keys that allow them to coauthorize cross-chain requests, a process similar to how validators coauthorize every block on the blockchain. Validators are strongly encouraged to implement best practices for isolating these keys, and are [required to rotate them periodically](/validator/operations/mnemonic-rotation/). These key rotations secure the network against a persistent attacker, who might try to accumulate malicious keys by compromising validators sequentially. ### Audits -The Axelar network code periodically goes through rigorous audits. Audits are published [here](https://github.com/axelarnetwork/audits). +The Axelar network code periodically goes through rigorous audits. Audits are published [here](https://github.com/axelarnetwork/audits). In addition, all Axelar network code and contracts are open-source, meaning anyone can review the code and look for vulnerabilities. Comments and revision from white-hat hackers are actively encouraged. There is also an active [bug-bounty program](https://immunefi.com/bounty/axelarnetwork/) set up, which incentivizes security submissions. ## Application-level security add-ons -On top of the above security measures, Axelar supports Turing-complete [General Message Passing](https://docs.axelar.dev/dev/gmp-overview). This functionality enables application developers to build their own custom cross-chain security policies. For instance, a DeFi application may impose additional limits on the volume of transferred funds, repeat transactions, co-authoring large transfers, etc. These application-specific features can work alongside the network requirements to deliver an even stronger security guarantee. +On top of the above security measures, Axelar supports Turing-complete [General Message Passing](/dev/general-message-passing/overview/). This functionality enables application developers to build their own custom cross-chain security policies. For instance, a DeFi application may impose additional limits on the volume of transferred funds, repeat transactions, co-authoring large transfers, etc. These application-specific features can work alongside the network requirements to deliver an even stronger security guarantee. ## Summary conclusion -In summary, Axelar tackles the complex issue of network security by having multiple layers of defenses in place. The security stack begins with decentralized, proof-of-stake consensus and diverse node tech stacks. Quadratic voting supports continued, scalable decentralization over time by preventing power consolidation among the top validators. To contain any potential errors and other failures that may occur, preventative measures are put in place, like frequent key rotations and transaction rate limits. The codebase has been thoroughly audited and is open source, with a bug bounty program to encourage whitehat submissions from the community. General Message Passing provides the ability for application-layer projects to add security features as needed for their use case, atop the Axelar security stack described here. +In summary, Axelar tackles the complex issue of network security by having multiple layers of defenses in place. The security stack begins with decentralized, proof-of-stake consensus and diverse node tech stacks. Quadratic voting supports continued, scalable decentralization over time by preventing power consolidation among the top validators. To contain any potential errors and other failures that may occur, preventative measures are put in place, like frequent key rotations and transaction rate limits. The codebase has been thoroughly audited and is open source, with a bug bounty program to encourage whitehat submissions from the community. General Message Passing provides the ability for application-layer projects to add security features as needed for their use case, atop the Axelar security stack described here. diff --git a/src/pages/learn/txduration.mdx b/src/content/docs/learn/txduration.mdx similarity index 100% rename from src/pages/learn/txduration.mdx rename to src/content/docs/learn/txduration.mdx diff --git a/src/pages/node/basic.mdx b/src/content/docs/node/basic.mdx similarity index 88% rename from src/pages/node/basic.mdx rename to src/content/docs/node/basic.mdx index dced20f69..96623f7ee 100644 --- a/src/pages/node/basic.mdx +++ b/src/content/docs/node/basic.mdx @@ -1,16 +1,15 @@ # Basic node management -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Start and stop your node, test whether your blockchain is downloaded. Backup your keys and chain data. Create an account, check your AXL balance, get AXL tokens from the faucet. ## Prerequisites -- Configure your environment as per [CLI configuration](config-cli) and [Node configuration](config-node). +- Configure your environment as per [CLI configuration](/node/config-cli/) and [Node configuration](/node/config-node/). - Install [lz4](https://lz4.github.io/lz4/) - Ensure AXELARD_HOME variable is set in your current session. See https://docs.axelar.dev/node/config-node#home-directory (example AXELARD_HOME="$HOME/.axelar"). - ## Start your Axelar node You may wish to redirect log output to a file (your command will be launched in background): @@ -40,7 +39,6 @@ Look for the field `catching_up`: - `true`: you are still downloading the blockchain. - `false`: you have finished downloading the blockchain. - ## Stop your Axelar node Stop your currently running Axelar node: @@ -85,7 +83,9 @@ $AXELARD_HOME/bin/axelard keys add my_account --home $AXELARD_HOME ``` - Caution: The above command will print a mnemonic to stdout. This mnemonic allows you to recover the secret key for your new account. Be sure to store a backup of the mnemonic in a safe place. + Caution: The above command will print a mnemonic to stdout. This mnemonic + allows you to recover the secret key for your new account. Be sure to store a + backup of the mnemonic in a safe place. ## Learn your address @@ -101,7 +101,8 @@ $AXELARD_HOME/bin/axelard keys show validator -a --home $AXELARD_HOME Let `{MY_ADDRESS}` denote the address of your `my_account` account. - Tip: Your balance will appear only after you have downloaded the blockchain and exited `catching_up` mode. + Tip: Your balance will appear only after you have downloaded the blockchain + and exited `catching_up` mode. ```bash diff --git a/src/pages/node/config-cli.mdx b/src/content/docs/node/config-cli.mdx similarity index 90% rename from src/pages/node/config-cli.mdx rename to src/content/docs/node/config-cli.mdx index b191d1573..e9697fac3 100644 --- a/src/pages/node/config-cli.mdx +++ b/src/content/docs/node/config-cli.mdx @@ -2,7 +2,7 @@ By default, many Axelar CLI commands contain boilerplate material that obfuscates the command and adds complexity to documentation. Here we describe documentation conventions and ways to configure your system so as to reduce this boilerplate. -Example: As per [Send AXL to an EVM chain](../learn/cli/axl-to-evm) you can use the CLI to get a deposit address for cross-chain transfer of AXL tokens via the command +Example: As per [Send AXL to an EVM chain](/learn/cli/axl-to-evm/) you can use the CLI to get a deposit address for cross-chain transfer of AXL tokens via the command ```bash axelard tx axelarnet link {EVM_CHAIN} {EVM_DEST_ADDR} uaxl --from my_account @@ -16,7 +16,7 @@ echo $KEYRING_PASSWORD | ~/.axelar_testnet/bin/axelard tx axelarnet link {EVM_CH Let us explain the changes: -- **Keyring password.** `echo $KEYRING_PASSWORD` : Commands that use `tx` to post a signed transaction to the network require a password to unlock the keyring. For simplicity documentation elides the keyring password. See [Keyring backend](keyring) for more info. +- **Keyring password.** `echo $KEYRING_PASSWORD` : Commands that use `tx` to post a signed transaction to the network require a password to unlock the keyring. For simplicity documentation elides the keyring password. See [Keyring backend](/node/keyring/) for more info. - **Path to `axelard`.** `~/.axelar_testnet/bin/axelard` : You can avoid the need to type the full path to `axelard` by putting `axelard` in your `PATH` environment variable or defining a shell alias. - **Gas.** `--gas auto --gas-adjustment 1.5` : Commands that use `tx` to post a signed transaction to the network must pay transaction fees called _gas_. By default `axelard` estimates the gas fee but sometimes this estimation is inaccurate and the transaction fails due to insufficient gas fee. These gas flags instruct `axelard` to estimate gas more accurately, then increase the maximum gas for the transaction by a factor you specify (`1.5` in this case) so that your transaction is more likely to have sufficient gas even if actual network fees exceed the estimate. For simplicity documentation elides these flags. - **Chain ID.** `--chain-id axelar-testnet-lisbon-3` : Commands that use `tx` to post a signed transaction to the network must specify the `chain-id` for the transaction. You could instead set the `AXELARD_CHAIN_ID` environment variable. diff --git a/src/pages/node/config-node.mdx b/src/content/docs/node/config-node.mdx similarity index 86% rename from src/pages/node/config-node.mdx rename to src/content/docs/node/config-node.mdx index a35e123d3..40d8aaf30 100644 --- a/src/pages/node/config-node.mdx +++ b/src/content/docs/node/config-node.mdx @@ -1,16 +1,17 @@ # Node configuration -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; ## Prerequisites - **Operating system:** MacOS(x86 intel chip) or Ubuntu (tested on 18.04). - **Hardware:** 4 cores, 8-16GB RAM, 512 GB drive, arm64 or amd64. Recommended 6-8 cores, 16-32 GB RAM, 1 TB+ drive. - Increase the maximum number of open files on your system. Example: `ulimit -n 16384`. You may wish to add this command to your shell profile so that you don't need to execute it next time you restart your machine. -- [CLI configuration](config-cli). +- [CLI configuration](/node/config-cli/). - Tip: Planning to run your own validator? Validators have different hardware requirements. See [Validator setup](../validator/setup/overview). + Tip: Planning to run your own validator? Validators have different hardware + requirements. See [Validator setup](/validator/setup/overview/). ## Download binaries and initialize configuration @@ -44,10 +45,13 @@ gpg --verify [axelard_binary_signature_path] [axelard_binary_path] ``` On github the signatures are attached to the releases. To download the signatures from the axelar-releases AWS Bucket, you can add `.asc` to the end of the binary URL. For example, if the path of the binary is: + ```bash https://axelar-releases.s3.us-east-2.amazonaws.com/axelard/v0.26.0/axelard-darwin-arm64-v0.26.0 ``` + The path for the signature will be: + ```bash https://axelar-releases.s3.us-east-2.amazonaws.com/axelard/v0.26.0/axelard-darwin-arm64-v0.26.0.asc ``` @@ -56,10 +60,10 @@ https://axelar-releases.s3.us-east-2.amazonaws.com/axelard/v0.26.0/axelard-darwi By default the `setup-node.sh` script sets the home directory for your node as follows: -| Network | Home directory path | -| --------- | --------------------- | -| mainnet | `$HOME/.axelar` | -| testnet | `$HOME/.axelar_testnet` | +| Network | Home directory path | +| ------- | ----------------------- | +| mainnet | `$HOME/.axelar` | +| testnet | `$HOME/.axelar_testnet` | On a fresh install `setup-node.sh` puts the following in your node's home directory: @@ -73,5 +77,7 @@ On a fresh install `setup-node.sh` puts the following in your node's home direct │   ├── config.toml │   ├── genesis.json │   └── seeds.toml +├── lib +│   └── libwasmvm.${arch}.so └── logs ``` diff --git a/src/pages/node/join-genesis.mdx b/src/content/docs/node/join-genesis.mdx similarity index 72% rename from src/pages/node/join-genesis.mdx rename to src/content/docs/node/join-genesis.mdx index 1aedcaed8..802987b0e 100644 --- a/src/pages/node/join-genesis.mdx +++ b/src/content/docs/node/join-genesis.mdx @@ -1,36 +1,43 @@ # Genesis sync -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; -import UpgradePath from '/src/upgrade-path.md'; -import UpgradePathTestnet from '/src/upgrade-path-testnet.md'; +import UpgradePathTestnet from "/src/upgrade-path-testnet.md"; +import UpgradePath from "/src/upgrade-path.md"; Start your Axelar node and download the blockchain from scratch. - Tip: Looking for instructions using the old script `node.sh`? See [here](join-old). + Tip: Looking for instructions using the old script `node.sh`? See + [here](/node/join-old/). - Tip: These instructions synchronize your Axelar node from scratch using the Axelar peer-to-peer network. You can synchronize your node more quickly by downloading a recent snapshot of the blockchain as per [Quick sync](join). + Tip: These instructions synchronize your Axelar node from scratch using the + Axelar peer-to-peer network. You can synchronize your node more quickly by + downloading a recent snapshot of the blockchain as per [Quick + sync](/node/join/). ## Prerequisites -- [CLI configuration](config-cli). +- [CLI configuration](/node/config-cli/). - Ensure AXELARD_HOME variable is set in your current session. See https://docs.axelar.dev/node/config-node#home-directory (example AXELARD_HOME="$HOME/.axelar"). ## Follow the upgrade path -Configure your system as per [Node configuration](config-node) except specify the correct version of `axelard` according to your network and position in the upgrade path: +Configure your system as per [Node configuration](/node/config-node/) except specify the correct version of `axelard` according to your network and position in the upgrade path: + + - + + @@ -48,13 +55,17 @@ setup-node.sh will download axelard binary version you specified in "$AXELARD_HO -rwxr-xr-x 1 kalid staff 70832530 Jul 6 11:04 axelard-v0.13.6 lrwxr-xr-x 1 kalid staff 48 Jul 6 11:04 axelard -> /Users/kalid/.axelar_testnet/bin/axelard-v0.13.6 ``` - +
    -
    ./scripts/setup-node.sh -n mainnet -a v0.10.7
    +```bash +./scripts/setup-node.sh -n mainnet -a v0.10.7 +```
    -
    ./scripts/setup-node.sh -n testnet -a v0.13.6
    +```bash +./scripts/setup-node.sh -n testnet -a v0.13.6 +```
    diff --git a/src/pages/node/join-old.mdx b/src/content/docs/node/join-old.mdx similarity index 80% rename from src/pages/node/join-old.mdx rename to src/content/docs/node/join-old.mdx index 3e9004f6c..70815edf3 100644 --- a/src/pages/node/join-old.mdx +++ b/src/content/docs/node/join-old.mdx @@ -1,11 +1,14 @@ # Old instructions: Quick sync (recommended) -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Start your Axelar node and download the blockchain. - Tip: These instructions synchronize your Axelar node quickly by downloading a recent snapshot of the blockchain. If instead you prefer to synchronize your Axelar node using the Axelar peer-to-peer network then see [Genesis sync](./join-genesis) + Tip: These instructions synchronize your Axelar node quickly by downloading a + recent snapshot of the blockchain. If instead you prefer to synchronize your + Axelar node using the Axelar peer-to-peer network then see [Genesis + sync](/node/join-genesis/) ## Prerequisites @@ -16,11 +19,11 @@ Start your Axelar node and download the blockchain. - Install [`jq`](https://stedolan.github.io/jq/download/). - Install `lz4`: [MacOS](https://formulae.brew.sh/formula/lz4) | [Ubuntu](https://snapcraft.io/install/lz4/ubuntu) - Increase the maximum number of open files on your system. Example: `ulimit -n 16384`. You may wish to add this command to your shell profile so that you don't need to execute it next time you restart your machine. -- You have configured your environment for `axelard` CLI commands as per [Configure your environment](/node/config-node). +- You have configured your environment for `axelard` CLI commands as per [Configure your environment](/node/config-node/). ## Choose a keyring password -Your Axelar keyring is encrypted with a password you choose. Learn more about keyring passwords at [Keyring backend](/node/keyring). +Your Axelar keyring is encrypted with a password you choose. Learn more about keyring passwords at [Keyring backend](/node/keyring/). In what follows you will execute a shell script `node.sh` to join the Axelar network. Your keyring password is supplied to `node.sh` via a `KEYRING_PASSWORD` environment variable. The script `node.sh` enforces an 8-character minimum for your keyring password. @@ -32,12 +35,14 @@ Clone the [`axelerate-community`](https://github.com/axelarnetwork/axelarate-com git clone https://github.com/axelarnetwork/axelarate-community.git cd axelarate-community ``` - +
    Launch a new Axelar mainnet node with version `0.10.7` of axelar-core: -
    ./scripts/node.sh -a v0.10.7 -n mainnet
    +```bash +./scripts/node.sh -a v0.10.7 -n mainnet +``` Your Axelar node will initialize your data folder `~/.axelar`
    @@ -46,7 +51,9 @@ Your Axelar node will initialize your data folder `~/.axelar`
    Launch a new Axelar testnet node with version `0.13.6` of axelar-core: -
    ./scripts/node.sh -a v0.13.6 -n testnet
    +```bash +./scripts/node.sh -a v0.13.6 -n testnet +``` Your Axelar node will initialize your data folder `~/.axelar_testnet`
    @@ -63,12 +70,14 @@ BACKUP and DELETE the `validator` account secret mnemonic: -
    ~/.axelar/validator.txt
    - + ```bash + ~/.axelar/validator.txt + ```
    -
    ~/.axelar_testnet/validator.txt
    - +```bash +~/.axelar_testnet/validator.txt + ```
    @@ -76,11 +85,15 @@ BACKUP but do NOT DELETE the Tendermint consensus secret key (this is needed on -
    ~/.axelar/.core/config/priv_validator_key.json
    +```bash +~/.axelar/.core/config/priv_validator_key.json + ```
    -
    ~/.axelar_testnet/.core/config/priv_validator_key.json
    + ```bash + ~/.axelar_testnet/.core/config/priv_validator_key.json + ```
    @@ -93,11 +106,15 @@ In a new terminal window: -
    tail -f ~/.axelar/logs/axelard.log
    +```bash +tail -f ~/.axelar/logs/axelard.log + ```
    -
    tail -f ~/.axelar_testnet/logs/axelard.log
    +```bash +tail -f ~/.axelar_testnet/logs/axelard.log +```
    @@ -118,15 +135,19 @@ Delete your `data` directory: -
    rm -r ~/.axelar/.core/data
    + ```bash + rm -r ~/.axelar/.core/data + ```
    -
    rm -r ~/.axelar_testnet/.core/data
    + ```bash + rm -r ~/.axelar_testnet/.core/data + ```
    - +
    # Download the latest Axelar blockchain snapshot Download the latest Axelar blockchain snapshot for your chosen network (testnet or mainnet) from a provider: @@ -145,12 +166,16 @@ Decompress the downloaded snapshot into your `data` directory: -
    lz4 -dc --no-sparse \{SNAPSHOT_FILE
    - | tar xfC - ~/.axelar/.core
    + ```bash + lz4 -dc --no-sparse \{SNAPSHOT_FILE + | tar xfC - ~/.axelar/.core + ```
    -
    lz4 -dc --no-sparse \{SNAPSHOT_FILE
    - | tar xfC - ~/.axelar_testnet/.core
    + ```bash + lz4 -dc --no-sparse \{SNAPSHOT_FILE + | tar xfC - ~/.axelar_testnet/.core + ```
    @@ -160,11 +185,15 @@ Resume your Axelar node with the latest version of axelar-core: -
    ./scripts/node.sh -n mainnet
    + ```bash + ./scripts/node.sh -n mainnet + ```
    -
    ./scripts/node.sh -n testnet
    + ```bash + ./scripts/node.sh -n testnet + ```
    @@ -192,4 +221,4 @@ Congratulations! You joined the Axelar network and downloaded the blockchain. Learn what you can do with Axelar: -- [Basic node management](./basic) +- [Basic node management](/node/basic/) diff --git a/src/pages/node/join.mdx b/src/content/docs/node/join.mdx similarity index 74% rename from src/pages/node/join.mdx rename to src/content/docs/node/join.mdx index 62976d8cb..fe283be18 100644 --- a/src/pages/node/join.mdx +++ b/src/content/docs/node/join.mdx @@ -1,29 +1,36 @@ # Quick sync -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Start your Axelar node using a snapshot. - Tip: Looking for instructions using the old script `node.sh`? See [here](join-old). + Tip: Looking for instructions using the old script `node.sh`? See + [here](/node/join-old/). - Tip: These instructions synchronize your Axelar node quickly by downloading a recent snapshot of the blockchain. If instead you prefer to synchronize your Axelar node using the Axelar peer-to-peer network then see [Genesis sync](join-genesis) + Tip: These instructions synchronize your Axelar node quickly by downloading a + recent snapshot of the blockchain. If instead you prefer to synchronize your + Axelar node using the Axelar peer-to-peer network then see [Genesis + sync](/node/join-genesis/) ## Prerequisites -- Configure your environment as per [CLI configuration](config-cli) and [Node configuration](config-node). -- Ensure `AXELARD_HOME` variable is set in your current session. See [node config](https://docs.axelar.dev/node/config-node#home-directory) (e.g. `AXELARD_HOME="$HOME/.axelar"`). +- Configure your environment as per [CLI configuration](/node/config-cli/) and [Node configuration](/node/config-node/). +- Ensure `AXELARD_HOME` variable is set in your current session. See [node config](/node/config-node#home-directory) (e.g. `AXELARD_HOME="$HOME/.axelar"`). ## Download the latest Axelar blockchain snapshot Download the latest Axelar blockchain snapshot for your chosen network (testnet or mainnet) from a provider: -- [bwarelabs.com](https://bwarelabs.com/snapshots) - [quicksync.io](https://quicksync.io/networks/axelar.html) -- [staketab.com](https://services.staketab.com/snapshots/axelar) + + + Axelar does not support state sync, so a snapshot should be more than 100GB in + size. + The following instructions assume you downloaded the `pruned` snapshot from `quicksync.io`. diff --git a/src/pages/node/keyring.mdx b/src/content/docs/node/keyring.mdx similarity index 77% rename from src/pages/node/keyring.mdx rename to src/content/docs/node/keyring.mdx index dc8507a07..c5b3e52a6 100644 --- a/src/pages/node/keyring.mdx +++ b/src/content/docs/node/keyring.mdx @@ -1,20 +1,23 @@ # Keyring backend -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; -Many Axeler CLI commands require an Axelar account controlled by a secret key. Your secret key must be stored securely so as to minimize the risk of exposure to an attacker. +Many Axelar CLI commands require an Axelar account controlled by a secret key. Your secret key must be stored securely so as to minimize the risk of exposure to an attacker. Like every Cosmos-based network, Axelar nodes store secret keys in a _keyring_. The keyring can be configured with one of several _backend_ implementations. Learn more about keyring backend configuration from the [Cosmos keyring documentation](https://docs.cosmos.network/v0.44/run-node/keyring.html). Axelar nodes use the `file` keyring backend by default. This means that your secret keys are stored in a password-encrypted file on disk. Under the `file` backend, you must provide your keyring password each time you execute certain Axelar CLI commands. - Protect your keyring password: There are several methods to provide your password for Axelar CLI commands. Each method comes with its own security and convenience properties. Whichever method you choose, be sure to follow best practices to keep your keyring password safe. + Protect your keyring password: There are several methods to provide your + password for Axelar CLI commands. Each method comes with its own security and + convenience properties. Whichever method you choose, be sure to follow best + practices to keep your keyring password safe. ## Prerequisites -- Configure your environment as per [CLI configuration](config-cli) and [Node configuration](config-node). +- Configure your environment as per [CLI configuration](/node/config-cli/) and [Node configuration](/node/config-node/). - Ensure AXELARD_HOME variable is set in your current session. See https://docs.axelar.dev/node/config-node#home-directory (example AXELARD_HOME="$HOME/.axelar"). ## Manual password entry @@ -28,7 +31,7 @@ Enter keyring passphrase: {TYPE_YOUR_PASSWORD_HERE} ## Automatic password entry -It can be inconvenient to type your password for each Axlear CLI command, especially if you wish to automate CLI commands. +It can be inconvenient to type your password for each Axelar CLI command, especially if you wish to automate CLI commands. Suppose your keyring password is stored in a shell environment variable called `KEYRING_PASSWORD`. You could prefix your CLI commands with `echo $KEYRING_PASSWORD | `. For example: @@ -37,7 +40,9 @@ echo $KEYRING_PASSWORD | $AXELARD_HOME/bin/axelard keys show my_account -a ``` - Danger: If an attacker were to gain access to your system then the attacker could read your keyring password from your shell environment and then use it to expose your secret keys. + Danger: If an attacker were to gain access to your system then the attacker + could read your keyring password from your shell environment and then use it + to expose your secret keys. ## Axelar documentation elides password entry diff --git a/src/content/docs/resources/axelar-commandid.mdx b/src/content/docs/resources/axelar-commandid.mdx new file mode 100644 index 000000000..0fbe38165 --- /dev/null +++ b/src/content/docs/resources/axelar-commandid.mdx @@ -0,0 +1,125 @@ +# The Axelar `CommandID` + +Ensuring the authenticity and integrity of messages is crucial in cross-chain communication. The `CommandID` in the [Axelar network](https://www.axelar.network/) plays a significant role in this process, acting as a unique identifier for interchain messages. + +This guide explains what an Axelar `CommandID` is, how it is generated, and its importance in the [Solidity Axelar GMP SDK](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity). + +## What is the Axelar `CommandID`? + +Axelar `CommandID` is a unique identifier assigned to each message or command that facilitates interchain communication. It ensures that each message can be tracked, verified, and validated across different blockchain networks, preventing issues such as replay attacks or message tampering. + +## How is an Axelar `CommandID` generated? + +Generating an Axelar `CommandID` involves combining specific attributes of the message, such as the `sourceChain`, `messageId`, and other relevant data, and then hashing this combination to produce a unique identifier. This process ensures that each `CommandID` is unique for the message it represents. + +### Solidity Implementation + +In the provided Solidity contract, the `messageToCommandId()` function generates the `CommandID`. + +Here's how it works: + +```solidity +/** + * @notice Compute the commandId for a message. + * @param sourceChain The name of the source chain as registered on Axelar. + * @param messageId The unique message id for the message. + * @return The commandId for the message. + */ +function messageToCommandId(string calldata sourceChain, string calldata messageId) public pure returns (bytes32) { + // Axelar doesn't allow `sourceChain` to contain '_', hence this encoding is unambiguous + return keccak256(bytes(string.concat(sourceChain, '_', messageId))); +} +``` + +This function takes two parameters: `sourceChain` and `messageId`. It concatenates these parameters with an underscore (`_`) separator, ensuring the combination is unique and unambiguous. The concatenated string is then hashed using `keccak256` to produce the `CommandID`. You can view the source code [here](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/blob/1db893b373ec9fcd7cf838ebea4b3a7a24585791/contracts/gateway/BaseAmplifierGateway.sol#L103C14-L103C32). + +### Go implementation + +The `CommandID` is generated similarly by hashing relevant data in the Go implementation. + +Here's an example function for generating a `CommandID`: + +```go +// NewCommandID generates a new CommandID using the provided data and chain ID +func NewCommandID(data []byte, chainID sdk.Int) []byte { + return crypto.Keccak256(data, chainID.Bytes()) +} +``` + +This function combines the provided data and chain ID, then hashes the combination using `Keccak256()` to produce the `CommandID`. The source code for this can be found [here](https://github.com/axelarnetwork/axelar-core/blob/main/x/evm/types/command.go). + +### Example commands + +Here are a few examples of command creation in the provided Go code: + +- Burn Token: + +```go +// NewBurnTokenCommand creates a command to burn tokens with the given burner's information +func NewBurnTokenCommand(chainID sdk.Int, keyID multisig.KeyID, height int64, burnerInfo BurnerInfo, isTokenExternal bool) Command { + heightBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(heightBytes, uint64(height)) + + burnTokenMaxGasCost := burnInternalTokenMaxGasCost + if isTokenExternal { + burnTokenMaxGasCost = burnExternalTokenMaxGasCost + } + + return Command{ + ID: NewCommandID(append(burnerInfo.Salt.Bytes(), heightBytes...), chainID), + Type: COMMAND_TYPE_BURN_TOKEN, + Params: createBurnTokenParams(burnerInfo.Symbol, common.Hash(burnerInfo.Salt)), + KeyID: keyID, + MaxGasCost: uint32(burnTokenMaxGasCost), + } +} +``` + +- Deploy Token: + +```go +// NewDeployTokenCommand creates a command to deploy a token +func NewDeployTokenCommand(chainID sdk.Int, keyID multisig.KeyID, asset string, tokenDetails TokenDetails, address Address, dailyMintLimit sdk.Uint) Command { + return Command{ + ID: NewCommandID([]byte(fmt.Sprintf("%s_%s", asset, tokenDetails.Symbol)), chainID), + Type: COMMAND_TYPE_DEPLOY_TOKEN, + Params: createDeployTokenParams(tokenDetails.TokenName, tokenDetails.Symbol, tokenDetails.Decimals, tokenDetails.Capacity, address, dailyMintLimit), + KeyID: keyID, + MaxGasCost: deployTokenMaxGasCost, + } +} +``` + +## Importance of the `CommandID` for message verification + +The `CommandID` is key for verifying the authenticity and integrity of interchain messages. When a message is received on the destination chain, the `CommandID` allows the system to: + +1. **Verify Message Approval:** + The `isMessageApproved()` function checks if a message has been approved by comparing the stored message hash with the calculated hash using the `CommandID`. + ```solidity + function isMessageApproved( + string calldata sourceChain, + string calldata messageId, + string calldata sourceAddress, + address contractAddress, + bytes32 payloadHash + ) external view override returns (bool) { + bytes32 commandId = messageToCommandId(sourceChain, messageId); + return _isMessageApproved(commandId, sourceChain, sourceAddress, contractAddress, payloadHash); + } + ``` +2. **Prevent Replay Attacks:** + The `validateMessage()` function ensures that a message can only be executed once by marking it as executed after validation. + ```solidity + function validateMessage( + string calldata sourceChain, + string calldata messageId, + string calldata sourceAddress, + bytes32 payloadHash + ) external override returns (bool valid) { + bytes32 commandId = messageToCommandId(sourceChain, messageId); + valid = _validateMessage(commandId, sourceChain, sourceAddress, payloadHash); + } + ``` + +Refer to more detailed information on how Axelar verifies GMP transactions [here](/dev/general-message-passing/verify-gmp-tx/). diff --git a/src/content/docs/resources/axelarscan/axelarscan-add.mdx b/src/content/docs/resources/axelarscan/axelarscan-add.mdx new file mode 100644 index 000000000..f8cd6902e --- /dev/null +++ b/src/content/docs/resources/axelarscan/axelarscan-add.mdx @@ -0,0 +1,49 @@ +# Label Address in Axelarscan + +## Overview + +The ability to add metadata about important on-chain addresses allows users to have a simpler experience seeing on-chain activity for these addresses. + +Rather than seeing a raw address on Axelarscan, users will be able to see a customized photo and name for a given address: + +![Axelar Governance Address](/images/axelar-governance-address.png) + +## How to Add + +To add a new address to the list of tracked addresses in the [accounts directory](https://github.com/axelarnetwork/axelarscan-ui/blob/main/src/data/accounts/index.js), send a [pull request](https://github.com/axelarnetwork/axelarscan-ui/pulls) to the [Axelarscan-UI repository](https://github.com/axelarnetwork/axelarscan-ui/tree/main). + +Include the following parameters: + +- Address: The address you are looking to add. +- Name: The name you want to be displayed for your address. +- Image: The image you want to appear alongside the name. +- Environment: Whether this address is for mainnet or testnet transactions. + +## Example + +The following example adds the Axelar Governance Address referenced in the image above to the accounts directory. + +```javascript +export default [ + { + address: "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + name: "Axelar Governance", + image: "/logos/accounts/axelarnet.svg", + }, +]; +``` + +No `environment` was set, so this address will appear on both [mainnet](https://axelarscan.io/account/axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj) and [testnet](https://testnet.axelarscan.io/account/axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj). + +Add the following to include the address on mainnet only: + +```javascript +export default [ + { + address: "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + name: "Axelar Governance", + image: "/logos/accounts/axelarnet.svg", + environment: "mainnet", + }, +]; +``` diff --git a/src/pages/dev/general-message-passing/monitoring.mdx b/src/content/docs/resources/axelarscan/monitoring.mdx similarity index 75% rename from src/pages/dev/general-message-passing/monitoring.mdx rename to src/content/docs/resources/axelarscan/monitoring.mdx index f82296fe2..0a8efb649 100644 --- a/src/pages/dev/general-message-passing/monitoring.mdx +++ b/src/content/docs/resources/axelarscan/monitoring.mdx @@ -1,15 +1,17 @@ # Monitoring state of GMP transactions -Axelar provides two options to check each GMP transaction status: -1. The Axelarscan UI. +Axelar provides two options to check each GMP transaction status: + +1. The Axelarscan UI. 2. The [AxelarJS SDK](/dev/axelarjs-sdk/tx-status-query-recovery). ## 1. Axelarscan UI + Anyone can view General Message Passing calls in realtime on Axelarscan: [Mainnet](https://axelarscan.io/gmp) | [Testnet](https://testnet.axelarscan.io/gmp). ![gmp-tracker.png](/images/gmp-tracker.png) -You can also search for a particular transfer by a transaction hash or a sender address via the search bar. +You can also search for a particular transfer by a transaction hash or a sender address via the search bar. ![gmp-searchbar.png](/images/gmp-searchbar.png) Each GMP call comprises five statuses, as described below. @@ -21,11 +23,15 @@ Each GMP call comprises five statuses, as described below. - **EXECUTED** informs the executed result whether it is successful or not. If you see an error message in this section, we suggest following this [guide](/dev/general-message-passing/debug/error-debugging) to find the root cause and recover the transfer. - **GAS REFUNDED** provides the refund information (if any), including the amount of gas paid, the amount of gas used, the refund amount, etc. -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; - If the `Insufficient Fee` tag appears, it means that the prepaid gas is not enough to relay the transaction. Please follow the [Increase gas payment to the gas receiver on the source chain](/dev/general-message-passing/recovery#increase-gas-payment-to-the-gas-receiver-on-the-source-chain) section to recover the transfer. - ![error-msg-insufficient-fee.png](/images/error-msg-insufficient-fee.png) + If the `Insufficient Fee` tag appears, it means that the prepaid gas is not + enough to relay the transaction. Please follow the [Increase gas payment to + the gas receiver on the source + chain](/dev/general-message-passing/debug/transaction-recovery/#increase-gas-payment-to-the-gas-receiver-on-the-source-chain) + section to recover the transfer. + ![error-msg-insufficient-fee.png](/images/error-msg-insufficient-fee.png) ## 2. AxelarJS SDK diff --git a/src/pages/bug-bounty.mdx b/src/content/docs/resources/bug-bounty.mdx similarity index 84% rename from src/pages/bug-bounty.mdx rename to src/content/docs/resources/bug-bounty.mdx index 11643d442..9ef86d352 100644 --- a/src/pages/bug-bounty.mdx +++ b/src/content/docs/resources/bug-bounty.mdx @@ -1,11 +1,11 @@ # Bug bounty -There are two ways to disclose security vulnerabilities to the Axelar team: +There are two ways to responsibly disclose security vulnerabilities: 1. Submit a report to our Immunefi bug bounty program. -2. Send email to `security@axelar.network` describing the vulnerability. +2. Send an email to `security@interoplabs.io` describing the vulnerability. -Even if your security vulnerability is not eligible for a bounty from the bug bounty program (option 1) the Axelar team might decide to award a bounty for a security vulnerability submitted by email to `security@axelar.network` (option 2). +Even if your security vulnerability is not eligible for a bounty from the bug bounty program (option 1) the Axelar team might decide to award a bounty for a security vulnerability submitted by email to `security@interoplabs.io` (option 2). ## Vulnerability Criteria diff --git a/src/content/docs/resources/community/community-pool-proposals.mdx b/src/content/docs/resources/community/community-pool-proposals.mdx new file mode 100644 index 000000000..3218e6f42 --- /dev/null +++ b/src/content/docs/resources/community/community-pool-proposals.mdx @@ -0,0 +1,90 @@ +# Community Pool Proposals + +import { Callout } from "/src/components/callout"; + +Axelar has an on-chain, governance-managed [pool of funds](https://www.mintscan.io/axelar/proposals) reserved for community projects that benefit developers and users. Proposals require a 2,000 AXL deposit. Anyone from the Axelar community can submit a proposal for consideration. + +## Prerequisites + +- Access to the [Axelar command-line interface](/learn/cli) +- 2,000 AXL for each proposal, either from a local wallet or through a community member who can fund the proposal within one hour of submission +- A running [RPC endpoint](/resources/rpc/resources) or [Axelar node](/node/config-node) + +## Get funding for a project + +1. Create a project introduction on the [Governance and Grants section](https://community.axelar.network/c/governance2/33) of the [Axelar Governance Forum](https://community.axelar.network/) using the [provided template](https://community.axelar.network/t/community-pool-grants-program/2271#grant-template-3). This introduction helps the community to understand your project. +1. The introduction will be open on the Forum for **7 days**. During this time, community members can ask questions and give feedback, and you will be able to edit the post. Please engage with all responses, and be prepared to amend the proposal where necessary. +1. Once the feedback window has passed, you can submit a proposal for an on-chain governance vote using the [Axelar CLI](/learn/cli/) (`axelard`). Include a brief summary of your proposal, along with a link to the project introduction. +1. After submission, proposals will be voted on by all token holders for **3 days** (**72 hours**). Validators can vote on behalf of the token holders if they abstain from participating, but the token holder’s vote will overwrite their validator’s vote for their amount of stake. +1. If the vote passes, funds will be sent from the community pool to the Axelar wallet associated with the successful proposal ([example](https://www.mintscan.io/axelar/proposals/29)), along with a refund of the 2,000 AXL deposit. The Axelar Network currently requires a 33.4% quorum of staked tokens (query with `axelard q gov params`). + + + **All proposals that reach quorum will have their deposit refunded, even if + the vote fails.** If a proposal does not reach quorum, the deposit will not be + refunded. + + +## Proposal Types + +- `CommunityPoolSpend` — For general community proposals +- `SoftwareUpgrade` — For node software updates +- `ParameterChange` — For changes to the configuration of the Axelar network + +## Create a local wallet + +You will need a local wallet for all transactions associated with the proposal. This wallet will receive the funds and deposit refund if the proposal passes. + +To create a local wallet, run: + +```bash +axelard keys add wallet +``` + +This creates an account named `wallet`. Enter (create) a passphrase. The `address` returned will be your new local wallet address. To display your local wallet address(es), run: + +```bash +axelard keys list +``` + +## Fund your local wallet + +Once you’ve created a local wallet, you’ll need to fund it with 2,000 AXL for the deposit. You can send funds from your Keplr wallet or from a centralized exchange (CEX) and check your wallet’s balance on Axelarscan. You can also [send AXL from another local wallet](https://github.com/axelarnetwork/axelar-core/blob/main/docs/cli/axelard_tx_bank_send.md) with the following command: + +```bash +axelard tx bank send [account_with_fund_address] [wallet_address] 2000000000uaxl # 20000000000uaxl = 20000AXL +``` + +## Submit a proposal + +1. In your terminal, create a variable for the proposal such as GOV_PROPOSAL and set its value to the path of your JSON file:Once the 7-day feedback period has passed, create a JSON file with the proposal and save it to a file, such as `gov-proposal.json`: + + ```bash + { + "title": "[title]", + "description": "This proposal withdraw funds from community pool for as mentioned here:\n[link]", + "amount": "[amount_in_uaxl]", # 20000000000uaxl = 20000AXL + "recipient": "[fund_recipient_address]", + "deposit": "2000000000uaxl" + } + ``` + +1. In your terminal, create a variable for the proposal such as GOV_PROPOSAL and set its value to the path of your JSON file: + + ```bash + export GOV_PROPOSAL="/Users/you/Projects/Axelar/gov-proposal.json" + ``` + +1. [Submit the proposal](https://github.com/axelarnetwork/axelar-core/blob/main/docs/cli/axelard_tx_gov_submit-proposal.md) as a JSON file: + + ```bash + export CHAIN_ID="axelar-testnet-lisbon-3" + export RPC="https://axelartest-rpc.quickapi.com/" + ``` + + ```bash + $ axelard tx gov submit-proposal community-pool-spend $GOV_PROPOSAL \ + --from wallet \ + --chain-id $CHAIN_ID \ + --node $RPC \ + --gas auto --gas-adjustment 1.2 + ``` diff --git a/src/pages/resources/mainnet.mdx b/src/content/docs/resources/contract-addresses/mainnet.mdx similarity index 64% rename from src/pages/resources/mainnet.mdx rename to src/content/docs/resources/contract-addresses/mainnet.mdx index 8e00361d5..613a638be 100644 --- a/src/pages/resources/mainnet.mdx +++ b/src/content/docs/resources/contract-addresses/mainnet.mdx @@ -1,34 +1,48 @@ +--- +title: Axelar Mainnet Contract Addresses +description: Official Axelar mainnet contract addresses, including gateways and tokens across supported blockchains. Use this reference for secure cross-chain integration. +--- + # Mainnet -import { Callout } from '/src/components/callout' +import { Callout } from '/src/components/callout'; -import IBCChannels from '/src/components/ibc/channels' -import TransferFeeCalculator from '/src/components/transfer-fee/calculator' -import EVMChains from '/src/components/evm/chains' -import EVMAssets from '/src/components/evm/assets' -import UpgradePath from '/src/upgrade-path.md' +import IBCChannels from '/src/components/ibc/channels'; +import TransferFeeCalculator from '/src/components/transfer-fee/calculator'; +import EVMChains from '/src/components/evm/chains'; +import EVMAssets from '/src/components/evm/assets'; +import UpgradePath from '/src/upgrade-path.md'; +import { AXELARD, TOFND } from '/src/config/variables'; -| Variable | Value | -| --------------------- | --------- | -| `axelar-core` version | `v0.34.1` | -| `vald` version | `v0.34.1` | -| `tofnd` version | `v0.10.1` | +| Variable | Value | +| --------------------- | --------------- | +| `chain-id` | `axelar-dojo-1` | +| `axelar-core` version | {AXELARD} | +| `vald` version | {AXELARD} | +| `tofnd` version | {TOFND} | -## EVM contract addresses +## Contract addresses -
    +
    +
    `Create3 Address Deployer`: `0x6513Aedb4D1593BA12e50644401D976aebDc90d8` `Create2 Address Deployer`: `0x98b2920d53612483f91f12ed7754e51b4a77919e` +`Interchain Token Service`: [`0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C`](https://etherscan.io/address/0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C) + +`Interchain Token Factory`: [`0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66`](https://etherscan.io/address/0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66) +
    - ### Assets + ### Assets + Learn more about [wrapped assets like axlUSDC](/learn/axlusdc). +
    @@ -82,4 +96,13 @@ The gas relayer fee does not include any transaction fee assessed by the source ## Upgrade Path + + + + + + + + + diff --git a/src/content/docs/resources/contract-addresses/testnet.mdx b/src/content/docs/resources/contract-addresses/testnet.mdx new file mode 100644 index 000000000..de59e8a35 --- /dev/null +++ b/src/content/docs/resources/contract-addresses/testnet.mdx @@ -0,0 +1,106 @@ +--- +title: Axelar Testnet Contract Addresses +description: Official Axelar testnet contract addresses for gateways, tokens, and infrastructure. Ideal for testing cross-chain integrations before mainnet deployment. +--- + +# Testnet + +import { Callout } from "/src/components/callout"; +import IBCChannels from "/src/components/ibc/channels"; +import TransferFeeCalculator from "/src/components/transfer-fee/calculator"; +import EVMChains from "/src/components/evm/chains"; +import EVMAssets from "/src/components/evm/assets"; +import UpgradePathTestnet from "/src/upgrade-path-testnet.md"; +import { AXELARD_TESTNET, TOFND_TESTNET } from "/src/config/variables"; + +| Variable | Value | +| --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| `chain-id` | `axelar-testnet-lisbon-3` | +| `axelar-core` version | v{AXELARD_TESTNET} | +| `vald` version | v{AXELARD_TESTNET} | +| `tofnd` version | v{TOFND_TESTNET} | +| amplifier contracts | see [testnet.json](https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/axelar-chains-config/info/testnet.json) | + +## Contract addresses + +
    + + +`Create3 Address Deployer`: `0x6513Aedb4D1593BA12e50644401D976aebDc90d8` + +`Create2 Address Deployer`: `0x98b2920d53612483f91f12ed7754e51b4a77919e` + +`Interchain Token Service`: [`0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C`](https://sepolia.etherscan.io/address/0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C) + +`Interchain Token Factory`: [`0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66`](https://sepolia.etherscan.io/address/0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66) + +
    + +
    + ## Faucets + +The following faucets can be used to obtain tokens for testing. Note that some of them may require an existing balance in your wallet. + +- [Polygon](https://faucet.quicknode.com/polygon/mumbai) +- [Moonbeam](https://faucet.moonbeam.network/) +- [Fantom](https://faucet.fantom.network/) +- [Paradigm](https://faucet.paradigm.xyz/) +- [Lotus](https://faucet.calibration.fildev.network/) +- [Kava](https://faucet.kava.io/) +- [Celo](https://faucet.celo.org/celo-sepolia) + +
    + +
    + ### Assets Learn more about [wrapped assets like axlUSDC](/learn/axlusdc). + +
    + +
    + ## IBC Channels + +
    + +## Cross-chain relayer gas fee + +The Axelar network charges a _relayer gas fee_ for all cross-chain token transfers in order to pay for network-level transaction ("gas") fees across chains. +The relayer gas fee amount depends only on: + +- the asset +- the source chain +- the destination chain + + + The relayer gas fee does NOT take a percentage from the transfer amount. + + +
    + +
    + +The current gas relayer fee is also available via node query: + +```bash +axelard q nexus transfer-fee [source chain] [destination chain] [amount] +``` + +Example: transfer USDC from Avalanche to Osmosis. (The amount here is arbitrary---gas relayer fees do not depend on the amount. `1 USDC = 10^6 uusdc`). + +```bash +axelard q nexus transfer-fee avalanche osmosis 1000000000uusdc +``` + +The per-chain gas relayer fee info can be queried via + +```bash +axelard q nexus fee-info avalanche uusdc +``` + +If the total amount of a token sent to a deposit address A is NOT greater than the gas relayer fee +then those deposits will wait in the queue until a future deposit to A brings the total above the fee. + +The gas relayer fee does not include any transaction fee assessed by the source chain for transferring tokens into a deposit address. These fees are usually denominated in native tokens on that chain (for e.g. AVAX on Avalanche, ETH on Ethereum). + +## Upgrade Path + + diff --git a/src/pages/resources/keplr.mdx b/src/content/docs/resources/keplr.mdx similarity index 95% rename from src/pages/resources/keplr.mdx rename to src/content/docs/resources/keplr.mdx index 6e381f0f4..eedf23fbd 100644 --- a/src/pages/resources/keplr.mdx +++ b/src/content/docs/resources/keplr.mdx @@ -1,8 +1,8 @@ # Add a custom network to Keplr -import Button from "../../components/keplr/addKeplrWallet"; -import AddKeplr from "../../components/keplr"; -import Form from "../../components/textarea"; +import AddKeplr from "../../../components/keplr"; +import Button from "../../../components/keplr/addKeplrWallet"; +import Form from "../../../components/textarea"; ## Don't have the Keplr Browser extension? Add it here: diff --git a/src/content/docs/resources/mainnet/upgrades/v1.mdx b/src/content/docs/resources/mainnet/upgrades/v1.mdx new file mode 100644 index 000000000..5ebf7664b --- /dev/null +++ b/src/content/docs/resources/mainnet/upgrades/v1.mdx @@ -0,0 +1,83 @@ +# Mainnet upgrade: v{AXELARD} + +import { Callout } from '/src/components/callout'; +import { AXELARD, TOFND } from '/src/config/variables'; + +## About the mainnet v1.0 upgrade + +This release enables mainnet deployment for [Amplifier](/dev/amplifier/introduction). + +This release includes the following version updates: +- `axelard` and `vald` to [1.0.5](https://github.com/axelarnetwork/axelar-core/releases/tag/v1.0.5) +- `tofnd` to [1.0.1](https://github.com/axelarnetwork/tofnd/releases/tag/v1.0.1) + +## Changelog + +Changes since 0.35.x: + +- Various fixes that improve stability +- New queries in the axelarnet module to query the IBC path for a chain and the chain by IBC path +- Added a new message type “BatchRequest”. In contrast to cosmos default behaviour, where the entire tx gets rolled back if there is an error in any of the contained message executions, this batch only rolls back the state for the specific messages that fail and keeps the rest +- Allow refundable messages to be batched +- Correctly pass message IDs between core and the new amplifier +- Add functionality to quickly (de)activate the connection between core and amplifier in case of emergencies + +See all the changes in the [`axelar-core` release notes](https://github.com/axelarnetwork/axelar-core/releases). + +Upgrade height `14231100` at approximately **2:30PM UTC on August 28th, 2024** ([countdown](https://www.mintscan.io/axelar/block/14231100)) + + +As of v{AXELARD}, the `axelard` [binary releases](https://github.com/axelarnetwork/axelar-core/releases) require `GLIBC_2.34`, which is not present on Ubuntu 20.04. + +You will need to compile `axelard` from source, or upgrade to Ubuntu 22.04. + + + + + If using the community node setup scripts, please update to the latest commit + on `main` first. `wasmvm` lib will be auto-downloaded to `$AXELARD_HOME/lib` + but you'll need to add it to `LD_LIBRARY_PATH` before running the script. + + +1. If you're a validator or have delegated to one, you can vote for the upgrade proposal, while it's active, via + +```bash +axelard tx gov vote 221 yes --from validator +``` + +2. Wait for the proposed upgrade block, `14231100`. Your node will panic at that block height with a log: `{"level":"error","module":"consensus","err":"UPGRADE \"v1.0\" NEEDED at height: 14216700", ...}`. Stop your node after chain halt. + +```bash +pkill -f 'axelard start' +# Validators need to also stop vald/tofnd +pkill -f 'vald-start' +pkill -f tofnd +``` + +3. Backup the state: + +```bash +cp -r ~/.axelar/.core/data ~/.axelar-lisbon-3-upgrade-0.35/.core/data +``` + + + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. + + +4. Restart your `axelard` node with the new v{AXELARD} build. +5. If you're a validator also restart `vald` with v{AXELARD} and `tofnd` with v{TOFND}. + +Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): + +```bash +# in axelarate-community repo (https://github.com/axelarnetwork/axelarate-community) +git checkout main +git pull +KEYRING_PASSWORD="pw-1" ./scripts/node.sh -n testnet -a v1.0.5 +# For validators, restart vald/tofnd +KEYRING_PASSWORD="pw-1" TOFND_PASSWORD="pw-2" ./scripts/validator-tools-host.sh -n testnet -a v1.0.5 -q v1.0.1 +``` diff --git a/src/content/docs/resources/mainnet/upgrades/v112.mdx b/src/content/docs/resources/mainnet/upgrades/v112.mdx new file mode 100644 index 000000000..bf2767ed0 --- /dev/null +++ b/src/content/docs/resources/mainnet/upgrades/v112.mdx @@ -0,0 +1,62 @@ +# Mainnet upgrade: v1.1 + +import { Callout } from "/src/components/callout"; + +Instructions for the `2024-Dec-18` mainnet upgrade to axelar-core `v1.1.2`. +Release notes can be found [here](https://github.com/axelarnetwork/axelar-core/releases/tag/v1.1.2) + +Upgrade height `15890800` [countdown](https://www.mintscan.io/axelar/block/15890800) + +## About the v1.1 upgrade +The `v1.1.2` upgrade is a consensus breaking release for Axelar mainnet. It enables the deployment of ITS Hub on mainnet. + +1. If you're a validator or have delegated to one, please vote for the upgrade proposal via + + +```bash +axelard tx gov vote 257 yes --from validator +``` + + + `axelard` must be built with `go-1.23` for this release. + + + +2. Wait for the proposed upgrade block, `15890800`. Your node will panic at that block height with a log: `{"level":"error","module":"consensus","err":"UPGRADE \"v1.1.2\" NEEDED at height: 15890800",`. Stop your node after chain halt. + +```bash +pkill -f 'axelard start' +# Validators need to also stop vald/tofnd +pkill -f 'vald-start' +pkill -f tofnd +``` + +3. Backup the state: + +```bash +cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-1.1.2/.core/data +``` + + + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. + + +4. Restart your node with the new `v1.1.2` build. +5. If you're a validator also restart `vald` with `v1.1.2` and `tofnd` with `v1.0.1`. + +Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): + + + +```bash +# in axelarate-community repo +git checkout main +git pull +KEYRING_PASSWORD="pw-1" ./scripts/node.sh -n mainnet -a v1.1.2 +# For validators, restart vald/tofnd +KEYRING_PASSWORD="pw-1" TOFND_PASSWORD="pw-2" ./scripts/validator-tools-host.sh -n mainnet -a v1.1.2 -q v1.0.1 +``` \ No newline at end of file diff --git a/src/content/docs/resources/mainnet/upgrades/v121.mdx b/src/content/docs/resources/mainnet/upgrades/v121.mdx new file mode 100644 index 000000000..c23869fe7 --- /dev/null +++ b/src/content/docs/resources/mainnet/upgrades/v121.mdx @@ -0,0 +1,64 @@ +# Mainnet upgrade: v1.2 + +import { Callout } from "/src/components/callout"; + +Instructions for the `v1.2` mainnet upgrade to axelar-core `v1.2.1`. +Release can be found [here](https://github.com/axelarnetwork/axelar-core/releases/tag/v1.2.1) + +Upgrade height `16837700` [countdown](https://www.mintscan.io/axelar/block/16837700) + +## About the v1.2 upgrade +The `v1.2` upgrade is a consensus breaking release for Axelar mainnet. + +1. If you're a validator or have delegated to one, please vote for the upgrade proposal via + +```bash +axelard tx gov vote 284 yes --from validator +``` + + + `axelard` must be built with `go-1.23` for this release. + + Node operators using binaries need to update `wasmvm` from `v1.3.1` to `v1.5.8` [libwasmvm.x86_64.so](https://github.com/CosmWasm/wasmvm/releases/tag/v1.5.8), and add the folder containing the library to `LD_LIBRARY_PATH`. + + If using the community node setup scripts, please update to the latest commit on `main` first. + `wasmvm` lib will be auto-downloaded to `$AXELARD_HOME/lib` but you'll need to add it to `LD_LIBRARY_PATH` before running the script. + + + +2. Wait for the proposed upgrade block, `16837700`. Your node will panic at that block height with a log: `{"level":"error","module":"consensus","err":"UPGRADE \"v1.2\" NEEDED at height: 16837700",`. Stop your node after chain halt. + +```bash +pkill -f 'axelard start' +# Validators need to also stop vald/tofnd +pkill -f 'vald-start' +pkill -f tofnd +``` + +3. Backup the state: + +```bash +cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-1.2.1/.core/data +``` + + + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. + + +4. Restart your `axelard` node with the new `v1.2.1` build. +5. If you're a validator also restart `vald` with `v1.2.1` and `tofnd` with `v1.0.1`. + +Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): + +```bash +# in axelarate-community repo +git checkout main +git pull +KEYRING_PASSWORD="pw-1" ./scripts/node.sh -n mainnet -a v1.2.1 +# For validators, restart vald/tofnd +KEYRING_PASSWORD="pw-1" TOFND_PASSWORD="pw-2" ./scripts/validator-tools-host.sh -n mainnet -a v1.2.1 -q v1.0.1 +``` diff --git a/src/pages/resources/mainnet/upgrades/v16.mdx b/src/content/docs/resources/mainnet/upgrades/v16.mdx similarity index 75% rename from src/pages/resources/mainnet/upgrades/v16.mdx rename to src/content/docs/resources/mainnet/upgrades/v16.mdx index 2406a4470..6da26c9d2 100644 --- a/src/pages/resources/mainnet/upgrades/v16.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v16.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.16 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Mar-21` mainnet upgrade to axelar-core `v0.16.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.16/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. 4. Restart your node with the new `v0.16.1` build (`tofnd` still uses `v0.8.2`). @@ -44,4 +48,4 @@ KEYRING_PASSWORD="pw-1" ./scripts/node.sh -n mainnet -a v0.16.1 KEYRING_PASSWORD="pw-1" TOFND_PASSWORD="pw-2" ./scripts/validator-tools-host.sh -a v0.16.1 -n mainnet ``` -The join scripts should automatically pull the new binary from [Mainnet resources](/resources/mainnet). Or you can add the flag `-a v0.16.1` to force a specific version. \ No newline at end of file +The join scripts should automatically pull the new binary from [Mainnet Resources](/resources/contract-addresses/mainnet/). Or you can add the flag `-a v0.16.1` to force a specific version. diff --git a/src/pages/resources/mainnet/upgrades/v17.mdx b/src/content/docs/resources/mainnet/upgrades/v17.mdx similarity index 81% rename from src/pages/resources/mainnet/upgrades/v17.mdx rename to src/content/docs/resources/mainnet/upgrades/v17.mdx index 38ea2c290..f5695d85e 100644 --- a/src/pages/resources/mainnet/upgrades/v17.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v17.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.17 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Apr-28` mainnet upgrade to axelar-core `v0.17.1`, vald `v0.17.0`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.17/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. 4. Restart your node with the new `v0.17.1` build. diff --git a/src/pages/resources/mainnet/upgrades/v18.mdx b/src/content/docs/resources/mainnet/upgrades/v18.mdx similarity index 81% rename from src/pages/resources/mainnet/upgrades/v18.mdx rename to src/content/docs/resources/mainnet/upgrades/v18.mdx index b7a568d61..ac8399ecf 100644 --- a/src/pages/resources/mainnet/upgrades/v18.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v18.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.18 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Jun-8` mainnet upgrade to axelar-core `v0.18.3`, vald `v0.18.3`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.18/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. 4. Restart your node with the new `v0.18.3` build. diff --git a/src/pages/resources/mainnet/upgrades/v19.mdx b/src/content/docs/resources/mainnet/upgrades/v19.mdx similarity index 81% rename from src/pages/resources/mainnet/upgrades/v19.mdx rename to src/content/docs/resources/mainnet/upgrades/v19.mdx index cad96dab2..517d116c0 100644 --- a/src/pages/resources/mainnet/upgrades/v19.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v19.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.19 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Jun-8` mainnet upgrade to axelar-core `v0.19.2`, vald `v0.19.2`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.19/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. 4. Restart your node with the new `v0.19.2` build. diff --git a/src/pages/resources/mainnet/upgrades/v20.mdx b/src/content/docs/resources/mainnet/upgrades/v20.mdx similarity index 81% rename from src/pages/resources/mainnet/upgrades/v20.mdx rename to src/content/docs/resources/mainnet/upgrades/v20.mdx index 61f192d30..ff9472d26 100644 --- a/src/pages/resources/mainnet/upgrades/v20.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v20.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.20 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Aug-8` mainnet upgrade to axelar-core `v0.20.0`, vald `v0.20.0`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.20/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. 4. Restart your `axelard` node with the new `v0.20.0` build. @@ -43,4 +47,4 @@ git pull KEYRING_PASSWORD="pw-1" ./scripts/node.sh -n mainnet -a v0.20.0 # For validators, restart vald/tofnd KEYRING_PASSWORD="pw-1" TOFND_PASSWORD="pw-2" ./scripts/validator-tools-host.sh -a v0.20.0 -q v0.10.1 -n mainnet -``` \ No newline at end of file +``` diff --git a/src/pages/resources/mainnet/upgrades/v21.mdx b/src/content/docs/resources/mainnet/upgrades/v21.mdx similarity index 75% rename from src/pages/resources/mainnet/upgrades/v21.mdx rename to src/content/docs/resources/mainnet/upgrades/v21.mdx index 852370be3..d7e44debb 100644 --- a/src/pages/resources/mainnet/upgrades/v21.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v21.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.21 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Aug-29` mainnet upgrade to axelar-core `v0.21.1`, vald `v0.21.1`, and tofnd `v0.10.1`. @@ -28,11 +28,15 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.21/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. -1. Restart your node with the new `v0.21.1` build. -2. If you're a validator also restart `vald` with `v0.21.1` and `tofnd` with `v0.10.1`. +4. Restart your node with the new `v0.21.1` build. +5. If you're a validator also restart `vald` with `v0.21.1` and `tofnd` with `v0.10.1`. Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): diff --git a/src/pages/resources/mainnet/upgrades/v24.mdx b/src/content/docs/resources/mainnet/upgrades/v24.mdx similarity index 75% rename from src/pages/resources/mainnet/upgrades/v24.mdx rename to src/content/docs/resources/mainnet/upgrades/v24.mdx index 5d1d18064..56e27f3a3 100644 --- a/src/pages/resources/mainnet/upgrades/v24.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v24.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.24 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Aug-29` mainnet upgrade to axelar-core `v0.24.0`, vald `v0.24.0`, and tofnd `v0.10.1`. @@ -28,11 +28,15 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.24/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. -1. Restart your node with the new `v0.24.0` build. -2. If you're a validator also restart `vald` with `v0.24.0` and `tofnd` with `v0.10.1`. +4. Restart your node with the new `v0.24.0` build. +5. If you're a validator also restart `vald` with `v0.24.0` and `tofnd` with `v0.10.1`. Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): diff --git a/src/pages/resources/mainnet/upgrades/v26.mdx b/src/content/docs/resources/mainnet/upgrades/v26.mdx similarity index 75% rename from src/pages/resources/mainnet/upgrades/v26.mdx rename to src/content/docs/resources/mainnet/upgrades/v26.mdx index 7a11b21d1..520a588b9 100644 --- a/src/pages/resources/mainnet/upgrades/v26.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v26.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.26 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Sep-12` mainnet upgrade to axelar-core `v0.26.5`, vald `v0.26.5`, and tofnd `v0.10.1`. @@ -28,11 +28,15 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.26/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. -1. Restart your node with the new `v0.26.5` build. -2. If you're a validator also restart `vald` with `v0.26.5` and `tofnd` with `v0.10.1`. +4. Restart your node with the new `v0.26.5` build. +5. If you're a validator also restart `vald` with `v0.26.5` and `tofnd` with `v0.10.1`. Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): diff --git a/src/pages/resources/mainnet/upgrades/v28.mdx b/src/content/docs/resources/mainnet/upgrades/v28.mdx similarity index 76% rename from src/pages/resources/mainnet/upgrades/v28.mdx rename to src/content/docs/resources/mainnet/upgrades/v28.mdx index 7a834384f..136ed2d11 100644 --- a/src/pages/resources/mainnet/upgrades/v28.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v28.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.28 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Nov-29` mainnet upgrade to axelar-core `v0.28.0`, vald `v0.28.0`, and tofnd `v0.10.1`. @@ -30,11 +30,15 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.28/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. -1. Restart your node with the new `v0.28.0` build. -2. If you're a validator also restart `vald` with `v0.28.0` and `tofnd` with `v0.10.1`. +4. Restart your node with the new `v0.28.0` build. +5. If you're a validator also restart `vald` with `v0.28.0` and `tofnd` with `v0.10.1`. Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): diff --git a/src/pages/resources/mainnet/upgrades/v29.mdx b/src/content/docs/resources/mainnet/upgrades/v29.mdx similarity index 75% rename from src/pages/resources/mainnet/upgrades/v29.mdx rename to src/content/docs/resources/mainnet/upgrades/v29.mdx index 6b087e6c9..9fb92e1e8 100644 --- a/src/pages/resources/mainnet/upgrades/v29.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v29.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.29 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Nov-29` mainnet upgrade to axelar-core `v0.29.1`, vald `v0.29.1`, and tofnd `v0.10.1`. @@ -28,11 +28,15 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.29/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. -1. Restart your node with the new `v0.29.1` build. -2. If you're a validator also restart `vald` with `v0.29.1` and `tofnd` with `v0.10.1`. +4. Restart your node with the new `v0.29.1` build. +5. If you're a validator also restart `vald` with `v0.29.1` and `tofnd` with `v0.10.1`. Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): diff --git a/src/pages/resources/mainnet/upgrades/v31.mdx b/src/content/docs/resources/mainnet/upgrades/v31.mdx similarity index 75% rename from src/pages/resources/mainnet/upgrades/v31.mdx rename to src/content/docs/resources/mainnet/upgrades/v31.mdx index b68c56367..c18b24dcc 100644 --- a/src/pages/resources/mainnet/upgrades/v31.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v31.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.31 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2023-Jan-30` mainnet upgrade to axelar-core `v0.31.2`, vald `v0.31.2`, and tofnd `v0.10.1`. @@ -28,11 +28,15 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.31/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. -1. Restart your node with the new `v0.31.2` build. -2. If you're a validator also restart `vald` with `v0.31.2` and `tofnd` with `v0.10.1`. +4. Restart your node with the new `v0.31.2` build. +5. If you're a validator also restart `vald` with `v0.31.2` and `tofnd` with `v0.10.1`. Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): diff --git a/src/pages/resources/mainnet/upgrades/v33.mdx b/src/content/docs/resources/mainnet/upgrades/v33.mdx similarity index 75% rename from src/pages/resources/mainnet/upgrades/v33.mdx rename to src/content/docs/resources/mainnet/upgrades/v33.mdx index 40d619d26..110785c50 100644 --- a/src/pages/resources/mainnet/upgrades/v33.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v33.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.33 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2023-April-11` mainnet upgrade to axelar-core `v0.33.2`, vald `v0.33.2`, and tofnd `v0.10.1`. @@ -28,11 +28,15 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.33/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. -1. Restart your node with the new `v0.33.2` build. -2. If you're a validator also restart `vald` with `v0.33.2` and `tofnd` with `v0.10.1`. +4. Restart your node with the new `v0.33.2` build. +5. If you're a validator also restart `vald` with `v0.33.2` and `tofnd` with `v0.10.1`. Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): diff --git a/src/pages/resources/mainnet/upgrades/v34.mdx b/src/content/docs/resources/mainnet/upgrades/v34.mdx similarity index 96% rename from src/pages/resources/mainnet/upgrades/v34.mdx rename to src/content/docs/resources/mainnet/upgrades/v34.mdx index 163db8e39..7eb2c1d02 100644 --- a/src/pages/resources/mainnet/upgrades/v34.mdx +++ b/src/content/docs/resources/mainnet/upgrades/v34.mdx @@ -1,6 +1,6 @@ # Mainnet upgrade: v0.34 -import { Callout } from '/src/components/callout' +import { Callout } from "/src/components/callout"; ## About the v0.34 upgrade @@ -62,8 +62,8 @@ cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.34/.core/data them from any data backups. -1. Restart your node with the new `v0.34.1` build. -2. If you're a validator also restart `vald` with `v0.34.1` and `tofnd` with `v0.10.1`. +4. Restart your node with the new `v0.34.1` build. +5. If you're a validator also restart `vald` with `v0.34.1` and `tofnd` with `v0.10.1`. Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): diff --git a/src/content/docs/resources/mainnet/upgrades/v35.mdx b/src/content/docs/resources/mainnet/upgrades/v35.mdx new file mode 100644 index 000000000..f00f5954c --- /dev/null +++ b/src/content/docs/resources/mainnet/upgrades/v35.mdx @@ -0,0 +1,73 @@ +# Mainnet upgrade: v0.35 + +import { Callout } from "/src/components/callout"; + +## About the v0.35 upgrade + +This release adds the Axelar Virtual Machine to the network and adds support for CosmWasm contract creation. + + + This release enables CosmWasm. Contracts created with CosmWasm will require + [governance proposals](/dev/amplifier/chain-integration/governance-proposals/) + to be deployed for the indefinite future. + + +Instructions for `2024-March-14` mainnet upgrade to axelar-core `v0.35.5`, vald `v0.35.5`, and tofnd `v0.10.1`. +Release can be found [on GitHub](https://github.com/axelarnetwork/axelar-core/releases/tag/v0.35.5). + +Upgrade height `11795700` [countdown](https://www.mintscan.io/axelar/block/11795700) + + + [Go v1.21](https://tip.golang.org/doc/go1.21) will be needed to build `axelard`. + +Node operators using binaries need to download `wasmvm v1.3.1` [libwasmvm.x86_64.so](https://github.com/CosmWasm/wasmvm/releases/tag/v1.3.1) and add the parent folder to `LD_LIBRARY_PATH`. + +Node operators will need to use the updated [`cosmsprund`](https://github.com/binaryholdings/cosmprund/pull/26) to prune their nodes. + +If using the community node setup scripts, please update to the latest commit on `main` first. +`wasmvm` lib will be auto-downloaded to `$AXELARD_HOME/lib` but you'll need to add it to `LD_LIBRARY_PATH` before running the script. + + + +1. If you're a validator or have delegated to one, please vote for the upgrade proposal via + +```bash +axelard tx gov vote 195 [yes|no] --from validator +``` + +2. Wait for the proposed upgrade block, `11795700`. Your node will panic at that block height with a log: `{"level":"error","module":"consensus","err":"UPGRADE \"v0.35\" NEEDED at height: 11795700", ...}`. Stop your node after chain halt. + +```bash +pkill -f 'axelard start' +# Validators need to also stop vald/tofnd +pkill -f 'vald-start' +pkill -f tofnd +``` + +3. Backup the state: + +```bash +cp -r ~/.axelar/.core/data ~/.axelar-dojo-1-upgrade-0.34/.core/data +``` + + + Caution: If you backup the entire folder, `~/.axelar/.core`, that'll also + include your private keys (inside `config` and `keyring-file` subfolders). + That can be dangerous if anyone gets access to your backups. We recommend + backing up keys separately when you first create your node, and then excluding + them from any data backups. + + +4. Restart your `axelard` node with the new `v0.35.5` build. +5. If you're a validator also restart `vald` with `v0.35.5` and `tofnd` with `v0.10.1`. + +Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): + +```bash +# in axelarate-community repo +git checkout main +git pull +KEYRING_PASSWORD="pw-1" ./scripts/node.sh -n mainnet -a v0.35.5 +# For validators, restart vald/tofnd +KEYRING_PASSWORD="pw-1" TOFND_PASSWORD="pw-2" ./scripts/validator-tools-host.sh -n mainnet -a v0.35.5 -q v0.10.1 +``` diff --git a/src/pages/resources/metamask.mdx b/src/content/docs/resources/metamask.mdx similarity index 55% rename from src/pages/resources/metamask.mdx rename to src/content/docs/resources/metamask.mdx index 9f31d1921..441658dc4 100644 --- a/src/pages/resources/metamask.mdx +++ b/src/content/docs/resources/metamask.mdx @@ -1,10 +1,10 @@ # Set up MetaMask -import AddToWeb3 from '../../components/web3' +import AddToWeb3 from "../../../components/web3"; 1. Connect MetaMask to other EVM chains 2. Get testnet tokens for other EVM chains to pay for gas -3. Import Axelar ERC20 tokens on other EVM chains +3. Import Axelar ERC-20 tokens on other EVM chains 4. Enable hex data in transactions ## Connect MetaMask to other EVM chains @@ -15,23 +15,25 @@ Open MetaMask. In the "Networks" dropdown list choose "Add Network". Enter the d ### Mainnet -| EVM chain | Chain Name | Chain ID | Native Token | RPC URL | Explorer URL | Add Chain | -| --------- | ---------- | -------- | -------------| -------------------------------------------- | ------------------------------ | ----------------------------------------------------- | +| EVM chain | Chain Name | Chain ID | Native Token | RPC URL | Explorer URL | Add Chain | +| --------- | ---------- | -------- | ------------ | -------------------------------------------- | ------------------------------ | ----------------------------------------------------------------- | | Ethereum | Ethereum | 1 | ETH | [URL](https://rpc.ankr.com/eth) | [URL](https://etherscan.io) | | | Avalanche | Avalanche | 43114 | AVAX | [URL](https://api.avax.network/ext/bc/C/rpc) | [URL](https://snowtrace.io) | | | Fantom | Fantom | 250 | FTM | [URL](https://rpc.ftm.tools) | [URL](https://ftmscan.com/) | | | Polygon | Polygon | 137 | MATIC | [URL](https://polygon-rpc.com) | [URL](https://polygonscan.com) | | -| Moonbeam | Moonbeam | 1284 | GLMR | [URL](https://rpc.api.moonbeam.network) | [URL](https://moonscan.io) | | +| Moonbeam | Moonbeam | 1284 | GLMR | [URL](https://rpc.api.moonbeam.network) | [URL](https://moonscan.io) | | ### Testnet -| EVM chain | Chain Name | Chain ID | Native Token | RPC URL | Explorer URL | Add Chain | -| --------- | ---------------- | -------- | -------------| -------------------------------------------------------------------- | ------------------------------------- | ----------------------------------------------------- | -| Ethereum | Ethereum Goerli | 5 | ETH | [URL](https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161) | [URL](https://goerli.etherscan.io) | | -| Avalanche | Avalanche Fuji | 43113 | AVAX | [URL](https://api.avax-test.network/ext/bc/C/rpc) | [URL](https://testnet.snowtrace.io) | | -| Fantom | Fantom Testnet | 4002 | FTM | [URL](https://rpc.testnet.fantom.network) | [URL](https://testnet.ftmscan.com/) | | -| Polygon | Polygon Mumbai | 80001 | MATIC | [URL](https://matic-mumbai.chainstacklabs.com) | [URL](https://mumbai.polygonscan.com) | | -| Moonbeam | Moonbase Alpha | 1287 | DEV | [URL](https://rpc.api.moonbase.moonbeam.network) | [URL](https://moonbase.moonscan.io) | | + + +| EVM chain | Chain Name | Chain ID | Native Token | RPC URL | Explorer URL | Add Chain | +| --------- | --------------- | -------- | ------------ | ------------------------------------------------------------------- | ------------------------------------- | ----------------------------------------------------------------- | +| Ethereum | Ethereum Goerli | 5 | ETH | [URL](https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161) | [URL](https://goerli.etherscan.io) | | +| Avalanche | Avalanche Fuji | 43113 | AVAX | [URL](https://api.avax-test.network/ext/bc/C/rpc) | [URL](https://testnet.snowtrace.io) | | +| Fantom | Fantom Testnet | 4002 | FTM | [URL](https://rpc.testnet.fantom.network) | [URL](https://testnet.ftmscan.com/) | | +| Polygon | Polygon Mumbai | 80001 | MATIC | [URL](https://matic-mumbai.chainstacklabs.com) | [URL](https://mumbai.polygonscan.com) | | +| Moonbeam | Moonbase Alpha | 1287 | DEV | [URL](https://rpc.api.moonbase.moonbeam.network) | [URL](https://moonbase.moonscan.io) | | ## Get testnet tokens for EVM chains @@ -45,15 +47,15 @@ You can get native tokens from a faucet. Search the internet for "`[chain]` test - [Moonbeam](https://docs.moonbeam.network/builders/get-started/moonbase/#get-tokens) -- No known web faucet; need to join the [Moonbeam discord](https://discord.gg/PfpUATX). - [Polygon](https://faucet.polygon.technology/) -## Import Axelar ERC20 tokens +## Import Axelar ERC-20 tokens Tokens transferred to an EVM chain using Axelar are not visible in MetaMask until you import them. 1. Use the "Networks" dropdown list, select your desired `[chain]`. 2. View "Assets" and select "Import Tokens". -3. Paste into "Token Contract Address" the ERC20 address for the token. ("Token symbol" and "token decimal" should be fetched automatically.) +3. Paste into "Token Contract Address" the ERC-20 address for the token. ("Token symbol" and "token decimal" should be fetched automatically.) -Axelar token contract addresses for each `[chain]` can be found at [Testnet resources](/resources/testnet). +Axelar token contract addresses for each `[chain]` can be found at [Testnet Resources](/resources/contract-addresses/testnet/). ## Enable hex data in transactions diff --git a/src/pages/resources/lava-iprpc.mdx b/src/content/docs/resources/rpc/lava-iprpc.mdx similarity index 53% rename from src/pages/resources/lava-iprpc.mdx rename to src/content/docs/resources/rpc/lava-iprpc.mdx index 8631386ca..cec1b311b 100644 --- a/src/pages/resources/lava-iprpc.mdx +++ b/src/content/docs/resources/rpc/lava-iprpc.mdx @@ -1,82 +1,85 @@ # Using Axelar ipRPC -## Overview 📋 +## Overview 📋 -In order to provide decentralized, reliable and public RPC to all developers in the ecosystem, Axelar uses [Lava](https://www.lavanet.xyz/?utm_source=axelar-iprpc-dev-tutorial&utm_medium=axelar-docs&utm_campaign=axelar-iprpc-dev) to serve RPC to its developer community. Lava aggregates and routes RPC requests to a peer-to-peer network of top-performing node providers, with built-in fraud detection, conflict resolution, and quality of service guarantees for all requests. All relays are conducted securely with no man-in-the-middle. For more details on Lava's protocol, take a look at [the Lava litepaper](https://litepaper.lavanet.xyz/?utm_source=axelar-iprpc-dev-tutorial&utm_medium=axelar-docs&utm_campaign=axelar-iprc-dev). +In order to provide decentralized, reliable and public RPC to all developers in the ecosystem, Axelar uses [Lava](https://www.lavanet.xyz/?utm_source=axelar-iprpc-dev-tutorial&utm_medium=axelar-docs&utm_campaign=axelar-iprpc-dev) to serve RPC to its developer community. Lava aggregates and routes RPC requests to a peer-to-peer network of top-performing node providers, with built-in fraud detection, conflict resolution, and quality of service guarantees for all requests. All relays are conducted securely with no man-in-the-middle. For more details on Lava's protocol, take a look at [the Lava litepaper](https://cdn.prod.website-files.com/642c9c8327126062770bfdd0/66fd507cdd54cabe7496d478_LavaNetwork-AccessingBlockchains.pdf). Lava ipRPC aggregates RPC providers and provides a unified endpoint for Axelar's entire ecosystem. Regardless of whether you're using LCD - `REST` or Full Nodes - `TendermintRPC`, you can interact with Axelar blockchain. You can also use websockets to establish a continuous connection instead of conducting a discrete handshake for each relay. - ## Endpoints 🔗 -A complete list of endpoints available are available [here](https://docs.lavanet.xyz/). For ipRPC, please attend only to addresses on the list which have `Lava Network` as a maintainer. A list is provided below for your convenience, as well! +A complete list of endpoints available are available [here](https://docs.lavanet.xyz/endpoints-overview). For ipRPC, please attend only to addresses that are under the ipRPC (or Public Endpoints) section. A list is provided below for your convenience, as well! ### Mainnet 🌐 -- **Tendermint-RPC** - `https://tm.axelar.lava.build` -- **Tendermint-RPC Websocket** - `wss://tm.axelar.lava.build/websocket` -- **REST** - `https://rest.axelar.lava.build` -- **gRPC** - `grpc.axelar.lava.build:443` +- **Tendermint-RPC** - `https://axelar.tendermintrpc.lava.build` +- **Tendermint-RPC Websocket** - `wss://axelar.tendermintrpc.lava.build/websocket` +- **REST** - `https://axelar.lava.build` +- **gRPC** - `axelar.grpc.lava.build:443` ### Testnet 🧪 -- **Tendermint-RPC** - `https://tm.axelar-testnet.lava.build` -- **Tendermint-RPC Websocket** - `wss://tm.axelar-testnet.lava.build/websocket` -- **REST** - `https://rest.axelar-testnet.lava.build/` -- **gRPC** - `grpc.axelar-testnet.lava.build:443` +- **Tendermint-RPC** - `https://axelart.tendermintrpc.lava.build` +- **Tendermint-RPC Websocket** - `wss://axelart.tendermintrpc.lava.build/websocket` +- **REST** - `https://axelart.lava.build` +- **gRPC** - `axelart.grpc.lava.build:443` ## Using `axelard` with ipRPC ⚡ You can use your `axelard` installation with ipRPC for all calls and requests. To do so, you need to use the Tendermint-RPC URL. For `mainnet` use: + ```bash -./axelard -n https://tm.axelar.lava.build:443 +./axelard -n https://axelar.tendermintrpc.lava.build:443 ``` For `testnet` use: + ```bash -./axelard -n https://tm.axelar-testnet.lava.build:443 +./axelard -n https://axelart.tendermintrpc.lava.build:443 ``` Using this schema, all `axelard` commands which communicate with the blockchain will be carried out securely and efficiently over Lava ipRPC. - ## Test Commands 🖥️ You can send requests to each endpoint directly from the command line without intervention from `axelard`. This can be done with the use of different tools such as `curl` for HTTP-responsive protocols, `wscat` for web sockets, and `grpcurl` for gRPC. You can also use any of the endpoints programmatically. Some examples are below: - ### 🟢 REST + Send get requests to the appropriate cosmos endpoints! ```bash -curl -X GET -H "Content-Type: application/json" https://rest.axelar.lava.build/cosmos/base/tendermint/v1beta1/blocks/latest -curl -X GET -H "Content-Type: application/json" https://rest.axelar-testnet.lava.build/cosmos/base/tendermint/v1beta1/blocks/latest +curl -X GET -H "Content-Type: application/json" https://axelar.lava.build/cosmos/base/tendermint/v1beta1/blocks/latest +curl -X GET -H "Content-Type: application/json" https://axelart.lava.build/cosmos/base/tendermint/v1beta1/blocks/latest ``` ### 🟢 Tendermint + Send post requests to the Tendermint-RPC endpoint! ```bash -curl -X POST -H "Content-Type: application/json" https://tm.axelar.lava.build --data '{"jsonrpc": "2.0", "id": 1, "method": "status", "params": []}' -curl -X POST -H "Content-Type: application/json" https://tm.axelar-testnet.lava.build --data '{"jsonrpc": "2.0", "id": 1, "method": "status", "params": []}' +curl -X POST -H "Content-Type: application/json" https://axelar.tendermintrpc.lava.build --data '{"jsonrpc": "2.0", "id": 1, "method": "status", "params": []}' +curl -X POST -H "Content-Type: application/json" https://axelart.tendermintrpc.lava.build --data '{"jsonrpc": "2.0", "id": 1, "method": "status", "params": []}' ``` ### 🟢 Tendermint/Websocket + Connect using websockets over Tendermint-RPC. ```bash -wscat -c wss://tm.axelar.lava.build/websocket -x '{"jsonrpc": "2.0", "id": 1, "method": "status", "params": []}' -wscat -c wss://tm.axelar-testnet.lava.build/websocket -x '{"jsonrpc": "2.0", "id": 1, "method": "status", "params": []}' +wscat -c wss://axelar.tendermintrpc.lava.build/websocket -x '{"jsonrpc": "2.0", "id": 1, "method": "status", "params": []}' +wscat -c wss://axelart.tendermintrpc.lava.build/websocket -x '{"jsonrpc": "2.0", "id": 1, "method": "status", "params": []}' ``` ### 🟢 gRPC + Use gRPC calls directly with the Cosmos API. ```bash -grpcurl grpc.axelar.lava.build:443 cosmos.base.tendermint.v1beta1.Service/GetLatestBlock -grpcurl grpc.axelar-testnet.lava.build:443 cosmos.base.tendermint.v1beta1.Service/GetLatestBlock +grpcurl axelar.grpc.lava.build:443 cosmos.base.tendermint.v1beta1.Service/GetLatestBlock +grpcurl axelart.grpc.lava.build:443 cosmos.base.tendermint.v1beta1.Service/GetLatestBlock ``` -✅ The rest is up to you! The possibilities are literally endless! \ No newline at end of file +✅ The rest is up to you! The possibilities are literally endless! diff --git a/src/content/docs/resources/rpc/resources.mdx b/src/content/docs/resources/rpc/resources.mdx new file mode 100644 index 000000000..96b340429 --- /dev/null +++ b/src/content/docs/resources/rpc/resources.mdx @@ -0,0 +1,22 @@ +--- +description: Access public Axelar RPC endpoints and resources for mainnet and testnet. Use these to interact with Axelar's network and build cross-chain applications. +--- + +import { Callout } from "/src/components/callout"; + +import Resources from "/src/components/resources/index.jsx"; + +# Resources + + + + + + + + + + +## Looking for help? + +Join the [Axelar discord](https://discord.gg/aRZ3Ra6f7D) and visit channels: [developers](https://discord.com/channels/770814806105128977/955655587260170272) | [testnet](https://discord.com/channels/770814806105128977/799299951078408242) | [general](https://discord.com/channels/770814806105128977/770814806105128980) diff --git a/src/pages/resources/satellite.mdx b/src/content/docs/resources/satellite.mdx similarity index 63% rename from src/pages/resources/satellite.mdx rename to src/content/docs/resources/satellite.mdx index 4672b12d2..04118175c 100644 --- a/src/pages/resources/satellite.mdx +++ b/src/content/docs/resources/satellite.mdx @@ -1,6 +1,6 @@ # Satellite -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; ## What is Satellite? @@ -9,7 +9,9 @@ Satellite is a web application built on top of the Axelar Network. It provides a ## Getting Started - Caution: Satellite is used to transfer real assets across main networks. When using it for the first time, try transferring small amounts initially. If you need assistance, use the `FAQ` and `Support` buttons in Satellite for help. + Caution: Satellite is used to transfer real assets across main networks. When + using it for the first time, try transferring small amounts initially. If you + need assistance, use the `FAQ` and `Support` buttons in Satellite for help. Satellite can be found at [https://satellite.money/](https://satellite.money/). @@ -20,4 +22,4 @@ For a step-by-step walkthrough on how to use Satellite, check out the following - [Instructional Medium Post](https://medium.com/axelar/transfer-terra-assets-to-evm-chains-using-satellite-f6480c7ff20c) -See [Mainnet resources](/resources/mainnet) for a reference list of Axelar's cross chain contract addresses, minimum asset transfer amounts, and cross-chain transaction processing fees. +See [Mainnet Resources](/resources/contract-addresses/mainnet/) for a reference list of Axelar's cross chain contract addresses, minimum asset transfer amounts, and cross-chain transaction processing fees. diff --git a/src/content/docs/resources/static-configs/static-configs.mdx b/src/content/docs/resources/static-configs/static-configs.mdx new file mode 100644 index 000000000..d76e4b233 --- /dev/null +++ b/src/content/docs/resources/static-configs/static-configs.mdx @@ -0,0 +1,47 @@ +# Static configs + +## Introduction + +All of the static constants that are relevant for the chain have been aggregated into a single file. + +This includes, but is not limited to: + +- Chain info and its relevant configs +- All supported assets on each chain + +The configuration documents are versioned so you will know if the object changes. + +You can access the configs in one of two ways: + +## Point the json files directly + +- Testnet: https://axelar-testnet.s3.us-east-2.amazonaws.com/configs/testnet-config-1.x.json +- Mainnet: https://axelar-mainnet.s3.us-east-2.amazonaws.com/configs/mainnet-config-1.x.json + +## Typescript API + +Alternatively, you can use the hooks, i.e. + +The package can be installed into your dApp as a project dependency with: + +```bash +npm i @axelarjs/api +``` + +Then run + +```typescript +import { createAxelarConfigClient } from "@axelarjs/api"; +import { ENVIRONMENTS } from "@axelarjs/core"; + +const test = async () => { + const api = createAxelarConfigClient(ENVIRONMENTS.testnet); + const configs = await api.getAxelarConfigs(ENVIRONMENTS.testnet); + Object.entries(configs.chains).forEach((v) => + console.log(`config for chain ${v[0]}: ${v[1]}`), + ); +}; +test(); +``` + +Each of the relevant properties in the schema are typed out in the following Typescript interfaces: https://github.com/axelarnetwork/axelarjs/blob/main/packages/api/src/axelar-config/types.ts diff --git a/src/content/docs/resources/testnet/upgrades/v1.mdx b/src/content/docs/resources/testnet/upgrades/v1.mdx new file mode 100644 index 000000000..200b35bfa --- /dev/null +++ b/src/content/docs/resources/testnet/upgrades/v1.mdx @@ -0,0 +1,81 @@ +# Testnet upgrade: v1.0 + +import { Callout } from '/src/components/callout'; +import { AXELARD_TESTNET } from '/src/config/variables'; + +## About the v1.0 upgrade + +This release finalizes initial support for [Amplifier](/dev/amplifier/introduction). + +Changes since 0.35.x: + +- Various fixes that improve stability +- New queries in the axelarnet module to query the IBC path for a chain and the chain by IBC path +- Added a new message type “BatchRequest”. In contrast to cosmos default behaviour, where the entire tx gets rolled back if there is an error in any of the contained message executions, this batch only rolls back the state for the specific messages that fail and keeps the rest +- Allow refundable messages to be batched +- Correctly pass message IDs between core and the new amplifier +- Add functionality to quickly (de)activate the connection between core and amplifier in case of emergencies + +See all the changes in the [`axelar-core` release notes](https://github.com/axelarnetwork/axelar-core/releases). + +Upgrade height `14625900` at approximately **11AM Eastern Time (15:00 UTC) on August 1st, 2024** ([countdown](https://www.mintscan.io/axelar-testnet/block/14625900)) + + +As of v1.0.0, the `axelard` [binary releases](https://github.com/axelarnetwork/axelar-core/releases) require `GLIBC_2.34`, which is not present on Ubuntu 20.04. + +You will need to compile `axelard` from source, or upgrade to Ubuntu 22.04. + + + + + If using the community node setup scripts, please update to the latest commit + on `main` first. `wasmvm` lib will be auto-downloaded to `$AXELARD_HOME/lib` + but you'll need to add it to `LD_LIBRARY_PATH` before running the script. + + +1. If you're a validator or have delegated to one, you can vote for the upgrade proposal, while it's active, via + +```bash +axelard tx gov vote 99 yes --from validator +``` + +2. Wait for the proposed upgrade block, `14625900`. Your node will panic at that block height with a log: `{"level":"error","module":"consensus","err":"UPGRADE \"v1.0\" NEEDED at height: 14625900", ...}`. Stop your node after chain halt. + +```bash +pkill -f 'axelard start' +# Validators need to also stop vald/tofnd +pkill -f 'vald-start' +pkill -f tofnd +``` + +3. Backup the state: + +```bash +cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.35/.core/data +``` + + + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. + + +4. Restart your `axelard` node with the new v{AXELARD_TESTNET} build. +5. If you're a validator also restart `vald` with v{AXELARD_TESTNET} and `tofnd` with `v1.0.1`. + + + [`tofnd` 1.0.1 has been released](https://github.com/axelarnetwork/tofnd/releases), and we recommend adopting `v1.0.1` of `tofnd` independently from the upgrade. + + +Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): + +```bash +# in axelarate-community repo (https://github.com/axelarnetwork/axelarate-community) +git checkout main +git pull +KEYRING_PASSWORD="pw-1" ./scripts/node.sh -n testnet -a v1.0.5 +# For validators, restart vald/tofnd +KEYRING_PASSWORD="pw-1" TOFND_PASSWORD="pw-2" ./scripts/validator-tools-host.sh -n testnet -a v1.0.5 -q v0.10.1 +``` diff --git a/src/content/docs/resources/testnet/upgrades/v112.mdx b/src/content/docs/resources/testnet/upgrades/v112.mdx new file mode 100644 index 000000000..34ed31c7c --- /dev/null +++ b/src/content/docs/resources/testnet/upgrades/v112.mdx @@ -0,0 +1,64 @@ +# Testnet upgrade: v1.1 + +import { Callout } from "/src/components/callout"; + +Instructions for the `2024-Dec-12` testnet upgrade to axelar-core `v1.1.2`. +Release can be found [here](https://github.com/axelarnetwork/axelar-core/releases/tag/v1.1.2) + +Upgrade height `16665600` [countdown](https://www.mintscan.io/axelar-testnet/block/16665600) + +## About the v1.1 upgrade +The `v1.1.2` upgrade is a consensus breaking release for Axelar testnet. Once live, it will enable the deployment of ITS Hub on testnet. + +1. If you're a validator or have delegated to one, please vote for the upgrade proposal via + + +```bash +axelard tx gov vote 164 yes --from validator +``` + + + `axelard` must be built with `go-1.23` for this release. + + + +2. Wait for the proposed upgrade block, `16665600`. Your node will panic at that block height with a log: `{"level":"error","module":"consensus","err":"UPGRADE \"v1.1.2\" NEEDED at height: 16665600",`. Stop your node after chain halt. + +```bash +pkill -f 'axelard start' +# Validators need to also stop vald/tofnd +pkill -f 'vald-start' +pkill -f tofnd +``` + +3. Backup the state: + +```bash +cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-1.1.2/.core/data +``` + + + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. + + + +4. Restart your `axelard` node with the new `v1.1.2` build. +5. If you're a validator also restart `vald` with `v1.1.2` and `tofnd` with `v1.0.1`. + +Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): + + + +```bash +# in axelarate-community repo +git checkout main +git pull +KEYRING_PASSWORD="pw-1" ./scripts/node.sh -n testnet -a v1.1.2 +# For validators, restart vald/tofnd +KEYRING_PASSWORD="pw-1" TOFND_PASSWORD="pw-2" ./scripts/validator-tools-host.sh -n testnet -a v1.1.2 -q v1.0.1 +``` + diff --git a/src/content/docs/resources/testnet/upgrades/v121.mdx b/src/content/docs/resources/testnet/upgrades/v121.mdx new file mode 100644 index 000000000..e4e456b9e --- /dev/null +++ b/src/content/docs/resources/testnet/upgrades/v121.mdx @@ -0,0 +1,66 @@ +# Testnet upgrade: v1.2 + +import { Callout } from "/src/components/callout"; + +Instructions for the `v1.2` testnet upgrade to axelar-core `v1.2.1`. +Release can be found [here](https://github.com/axelarnetwork/axelar-core/releases/tag/v1.2.1) + +Upgrade height `17629900` [countdown](https://www.mintscan.io/axelar-testnet/block/17629900) + +## About the v1.2 upgrade +The `v1.2` upgrade is a consensus breaking release for Axelar testnet. + +1. If you're a validator or have delegated to one, please vote for the upgrade proposal via + +```bash +axelard tx gov vote 201 yes --from validator +``` + + + `axelard` must be built with `go-1.23` for this release. + + Node operators using binaries need to update `wasmvm` from `v1.3.1` to `v1.5.8` [libwasmvm.x86_64.so](https://github.com/CosmWasm/wasmvm/releases/tag/v1.5.8), and add the folder containing the library to `LD_LIBRARY_PATH`. + + If using the community node setup scripts, please update to the latest commit on `main` first. + `wasmvm` lib will be auto-downloaded to `$AXELARD_HOME/lib` but you'll need to add it to `LD_LIBRARY_PATH` before running the script. + + + +2. Wait for the proposed upgrade block, `17629900`. Your node will panic at that block height with a log: `{"level":"error","module":"consensus","err":"UPGRADE \"v1.2\" NEEDED at height: 17629900",`. Stop your node after chain halt. + +```bash +pkill -f 'axelard start' +# Validators need to also stop vald/tofnd +pkill -f 'vald-start' +pkill -f tofnd +``` + +3. Backup the state: + +```bash +cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-1.2.1/.core/data +``` + + + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. + + + +4. Restart your `axelard` node with the new `v1.2.1` build. +5. If you're a validator also restart `vald` with `v1.2.1` and `tofnd` with `v1.0.1`. + +Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): + +```bash +# in axelarate-community repo +git checkout main +git pull +KEYRING_PASSWORD="pw-1" ./scripts/node.sh -n testnet -a v1.2.1 +# For validators, restart vald/tofnd +KEYRING_PASSWORD="pw-1" TOFND_PASSWORD="pw-2" ./scripts/validator-tools-host.sh -n testnet -a v1.2.1 -q v1.0.1 +``` + diff --git a/src/pages/resources/testnet/upgrades/v17.mdx b/src/content/docs/resources/testnet/upgrades/v17.mdx similarity index 80% rename from src/pages/resources/testnet/upgrades/v17.mdx rename to src/content/docs/resources/testnet/upgrades/v17.mdx index 4588075fe..5a7fff306 100644 --- a/src/pages/resources/testnet/upgrades/v17.mdx +++ b/src/content/docs/resources/testnet/upgrades/v17.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.17 +# Testnet upgrade: v0.17 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Apr-12` testnet upgrade to axelar-core `v0.17.3`, vald `v0.17.3`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.17/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.17.3` build. diff --git a/src/pages/resources/testnet/upgrades/v18.mdx b/src/content/docs/resources/testnet/upgrades/v18.mdx similarity index 80% rename from src/pages/resources/testnet/upgrades/v18.mdx rename to src/content/docs/resources/testnet/upgrades/v18.mdx index 83fea2b73..a44515dd8 100644 --- a/src/pages/resources/testnet/upgrades/v18.mdx +++ b/src/content/docs/resources/testnet/upgrades/v18.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.18 +# Testnet upgrade: v0.18 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-May-20` testnet upgrade to axelar-core `v0.18.2`, vald `v0.18.2`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.18/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.18.2` build. diff --git a/src/pages/resources/testnet/upgrades/v19.mdx b/src/content/docs/resources/testnet/upgrades/v19.mdx similarity index 80% rename from src/pages/resources/testnet/upgrades/v19.mdx rename to src/content/docs/resources/testnet/upgrades/v19.mdx index 84adb7dbe..378423500 100644 --- a/src/pages/resources/testnet/upgrades/v19.mdx +++ b/src/content/docs/resources/testnet/upgrades/v19.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.19 +# Testnet upgrade: v0.19 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-May-25` testnet upgrade to axelar-core `v0.19.4`, vald `v0.19.4`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.19/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.19.4` build. diff --git a/src/pages/resources/testnet/upgrades/v20.mdx b/src/content/docs/resources/testnet/upgrades/v20.mdx similarity index 80% rename from src/pages/resources/testnet/upgrades/v20.mdx rename to src/content/docs/resources/testnet/upgrades/v20.mdx index 99fdd9490..3b7563361 100644 --- a/src/pages/resources/testnet/upgrades/v20.mdx +++ b/src/content/docs/resources/testnet/upgrades/v20.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.20 +# Testnet upgrade: v0.20 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Aug-6` testnet upgrade to axelar-core `v0.20.0`, vald `v0.20.0`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.20/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.20.0` build. diff --git a/src/pages/resources/testnet/upgrades/v21.mdx b/src/content/docs/resources/testnet/upgrades/v21.mdx similarity index 80% rename from src/pages/resources/testnet/upgrades/v21.mdx rename to src/content/docs/resources/testnet/upgrades/v21.mdx index 11dd7cd7c..5df37cc6b 100644 --- a/src/pages/resources/testnet/upgrades/v21.mdx +++ b/src/content/docs/resources/testnet/upgrades/v21.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.21 +# Testnet upgrade: v0.21 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Aug-11` testnet upgrade to axelar-core `v0.21.1`, vald `v0.21.1`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.21/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.21.1` build. diff --git a/src/pages/resources/testnet/upgrades/v22.mdx b/src/content/docs/resources/testnet/upgrades/v22.mdx similarity index 80% rename from src/pages/resources/testnet/upgrades/v22.mdx rename to src/content/docs/resources/testnet/upgrades/v22.mdx index a229604e4..af60dc0d8 100644 --- a/src/pages/resources/testnet/upgrades/v22.mdx +++ b/src/content/docs/resources/testnet/upgrades/v22.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.22 +# Testnet upgrade: v0.22 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Aug-12` testnet upgrade to axelar-core `v0.22.1`, vald `v0.22.1`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.22/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.22.1` build. diff --git a/src/pages/resources/testnet/upgrades/v23.mdx b/src/content/docs/resources/testnet/upgrades/v23.mdx similarity index 80% rename from src/pages/resources/testnet/upgrades/v23.mdx rename to src/content/docs/resources/testnet/upgrades/v23.mdx index 8d457aab8..7dbef3943 100644 --- a/src/pages/resources/testnet/upgrades/v23.mdx +++ b/src/content/docs/resources/testnet/upgrades/v23.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.23 +# Testnet upgrade: v0.23 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Aug-18` testnet upgrade to axelar-core `v0.23.0`, vald `v0.23.0`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.23/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.23.0` build. diff --git a/src/pages/resources/testnet/upgrades/v24.mdx b/src/content/docs/resources/testnet/upgrades/v24.mdx similarity index 80% rename from src/pages/resources/testnet/upgrades/v24.mdx rename to src/content/docs/resources/testnet/upgrades/v24.mdx index 3f42b5723..643187247 100644 --- a/src/pages/resources/testnet/upgrades/v24.mdx +++ b/src/content/docs/resources/testnet/upgrades/v24.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.24 +# Testnet upgrade: v0.24 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Aug-24` testnet upgrade to axelar-core `v0.24.0`, vald `v0.24.0`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.24/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.24.0` build. diff --git a/src/pages/resources/testnet/upgrades/v25.mdx b/src/content/docs/resources/testnet/upgrades/v25.mdx similarity index 80% rename from src/pages/resources/testnet/upgrades/v25.mdx rename to src/content/docs/resources/testnet/upgrades/v25.mdx index 6d2a82b0e..0d919efc5 100644 --- a/src/pages/resources/testnet/upgrades/v25.mdx +++ b/src/content/docs/resources/testnet/upgrades/v25.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.25 +# Testnet upgrade: v0.25 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Sep-07` testnet upgrade to axelar-core `v0.25.0`, vald `v0.25.0`, and tofnd `v0.10.1`. @@ -28,7 +28,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.25/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.25.0` build. diff --git a/src/pages/resources/testnet/upgrades/v26.mdx b/src/content/docs/resources/testnet/upgrades/v26.mdx similarity index 81% rename from src/pages/resources/testnet/upgrades/v26.mdx rename to src/content/docs/resources/testnet/upgrades/v26.mdx index 6733082c4..b7d23282b 100644 --- a/src/pages/resources/testnet/upgrades/v26.mdx +++ b/src/content/docs/resources/testnet/upgrades/v26.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.26 +# Testnet upgrade: v0.26 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Sep-07` testnet upgrade to axelar-core `v0.26.5`, vald `v0.26.5`, and tofnd `v0.10.1`. Release can be found [here](https://github.com/axelarnetwork/axelar-core/releases/tag/v0.26.0). @@ -29,7 +29,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.26/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.26.5` build. diff --git a/src/pages/resources/testnet/upgrades/v27.mdx b/src/content/docs/resources/testnet/upgrades/v27.mdx similarity index 81% rename from src/pages/resources/testnet/upgrades/v27.mdx rename to src/content/docs/resources/testnet/upgrades/v27.mdx index 5fc944463..64d70952c 100644 --- a/src/pages/resources/testnet/upgrades/v27.mdx +++ b/src/content/docs/resources/testnet/upgrades/v27.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.27 +# Testnet upgrade: v0.27 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Nov-16` testnet upgrade to axelar-core `v0.27.0`, vald `v0.27.0`, and tofnd `v0.10.1`. Release can be found [here](https://github.com/axelarnetwork/axelar-core/releases/tag/v0.27.0). @@ -29,7 +29,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.27/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.27.0` build. diff --git a/src/pages/resources/testnet/upgrades/v28.mdx b/src/content/docs/resources/testnet/upgrades/v28.mdx similarity index 81% rename from src/pages/resources/testnet/upgrades/v28.mdx rename to src/content/docs/resources/testnet/upgrades/v28.mdx index 659a6ddad..997df63a1 100644 --- a/src/pages/resources/testnet/upgrades/v28.mdx +++ b/src/content/docs/resources/testnet/upgrades/v28.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.28 +# Testnet upgrade: v0.28 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Nov-16` testnet upgrade to axelar-core `v0.28.0`, vald `v0.28.0`, and tofnd `v0.10.1`. Release can be found [here](https://github.com/axelarnetwork/axelar-core/releases/tag/v0.28.0). @@ -29,7 +29,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.28/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.28.0` build. diff --git a/src/pages/resources/testnet/upgrades/v29.mdx b/src/content/docs/resources/testnet/upgrades/v29.mdx similarity index 81% rename from src/pages/resources/testnet/upgrades/v29.mdx rename to src/content/docs/resources/testnet/upgrades/v29.mdx index fb2471d31..a51f0c99f 100644 --- a/src/pages/resources/testnet/upgrades/v29.mdx +++ b/src/content/docs/resources/testnet/upgrades/v29.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.29 +# Testnet upgrade: v0.29 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2022-Dec-01` testnet upgrade to axelar-core `v0.29.1`, vald `v0.29.1`, and tofnd `v0.10.1`. Release can be found [here](https://github.com/axelarnetwork/axelar-core/releases/tag/v0.29.1). @@ -29,7 +29,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.29/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.29.1` build. diff --git a/src/pages/resources/testnet/upgrades/v31.mdx b/src/content/docs/resources/testnet/upgrades/v31.mdx similarity index 81% rename from src/pages/resources/testnet/upgrades/v31.mdx rename to src/content/docs/resources/testnet/upgrades/v31.mdx index e74639b2d..7641abf7b 100644 --- a/src/pages/resources/testnet/upgrades/v31.mdx +++ b/src/content/docs/resources/testnet/upgrades/v31.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.31 +# Testnet upgrade: v0.31 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2023-Jan-24` testnet upgrade to axelar-core `v0.31.2`, vald `v0.31.2`, and tofnd `v0.10.1`. Release can be found [here](https://github.com/axelarnetwork/axelar-core/releases/tag/v0.31.2). @@ -29,7 +29,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.31/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.31.2` build. diff --git a/src/pages/resources/testnet/upgrades/v32.mdx b/src/content/docs/resources/testnet/upgrades/v32.mdx similarity index 81% rename from src/pages/resources/testnet/upgrades/v32.mdx rename to src/content/docs/resources/testnet/upgrades/v32.mdx index 438c75894..58115fb8a 100644 --- a/src/pages/resources/testnet/upgrades/v32.mdx +++ b/src/content/docs/resources/testnet/upgrades/v32.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.32 +# Testnet upgrade: v0.32 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2023-Feb-21` testnet upgrade to axelar-core `v0.32.2`, vald `v0.32.2`, and tofnd `v0.10.1`. Release can be found [here](https://github.com/axelarnetwork/axelar-core/releases/tag/v0.32.2). @@ -29,7 +29,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.31/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.32.2` build. diff --git a/src/pages/resources/testnet/upgrades/v33.mdx b/src/content/docs/resources/testnet/upgrades/v33.mdx similarity index 81% rename from src/pages/resources/testnet/upgrades/v33.mdx rename to src/content/docs/resources/testnet/upgrades/v33.mdx index 297f500d2..a82b3520a 100644 --- a/src/pages/resources/testnet/upgrades/v33.mdx +++ b/src/content/docs/resources/testnet/upgrades/v33.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.33 +# Testnet upgrade: v0.33 -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions for `2023-April-3` testnet upgrade to axelar-core `v0.33.2`, vald `v0.33.2`, and tofnd `v0.10.1`. Release can be found [here](https://github.com/axelarnetwork/axelar-core/releases/tag/v0.33.2). @@ -29,7 +29,11 @@ cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.32/.core/data ``` - Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll also include your private keys (inside `config` and `keyring-file` subfolders). That can be dangerous if anyone gets access to your backups. We recommend backing up keys separately when you first create your node, and then excluding them from any data backups. + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. 4. Restart your `axelard` node with the new `v0.33.2` build. diff --git a/src/pages/resources/testnet/upgrades/v34.mdx b/src/content/docs/resources/testnet/upgrades/v34.mdx similarity index 98% rename from src/pages/resources/testnet/upgrades/v34.mdx rename to src/content/docs/resources/testnet/upgrades/v34.mdx index 1e5e9c5a2..5f6211864 100644 --- a/src/pages/resources/testnet/upgrades/v34.mdx +++ b/src/content/docs/resources/testnet/upgrades/v34.mdx @@ -1,6 +1,6 @@ -# Testnet-1 upgrade: v0.34 +# Testnet upgrade: v0.34 -import { Callout } from '/src/components/callout' +import { Callout } from "/src/components/callout"; ## About the v0.34 upgrade diff --git a/src/content/docs/resources/testnet/upgrades/v35.mdx b/src/content/docs/resources/testnet/upgrades/v35.mdx new file mode 100644 index 000000000..c1328c216 --- /dev/null +++ b/src/content/docs/resources/testnet/upgrades/v35.mdx @@ -0,0 +1,73 @@ +# Testnet upgrade: v0.35 + +import { Callout } from "/src/components/callout"; + +## About the v0.35 upgrade + +This release adds the Axelar Virtual Machine to the network and adds support for CosmWasm contract creation. + + + This release enables CosmWasm. Contracts created with CosmWasm will require + [governance proposals](/dev/amplifier/chain-integration/governance-proposals/) + to be deployed for the indefinite future. + + +Instructions for `2024-February-13` testnet upgrade to axelar-core `v0.35.3`, vald `v0.35.3`, and tofnd `v0.10.1`. +Release can be found [here](https://github.com/axelarnetwork/axelar-core/releases/tag/v0.35.3). + +Upgrade height `12017025` [countdown](https://testnet.mintscan.io/axelar-testnet/blocks/12017025) + + + [Go v1.21](https://tip.golang.org/doc/go1.21) will be needed to build `axelard`. + +Node operators using binaries need to download `wasmvm v1.3.1` [libwasmvm.x86_64.so](https://github.com/CosmWasm/wasmvm/releases/tag/v1.3.1) and add the parent folder to `LD_LIBRARY_PATH`. + +Node operators will need to use the updated [`cosmsprund`](https://github.com/binaryholdings/cosmprund/pull/26) to prune their nodes. + +If using the community node setup scripts, please update to the latest commit on `main` first. +`wasmvm` lib will be auto-downloaded to `$AXELARD_HOME/lib` but you'll need to add it to `LD_LIBRARY_PATH` before running the script. + + + +1. If you're a validator or have delegated to one, please vote for the upgrade proposal via + +```bash +axelard tx gov vote 70 yes --from validator +``` + +2. Wait for the proposed upgrade block, `12017025`. Your node will panic at that block height with a log: `{"level":"error","module":"consensus","err":"UPGRADE \"v0.35\" NEEDED at height: 12017025", ...}`. Stop your node after chain halt. + +```bash +pkill -f 'axelard start' +# Validators need to also stop vald/tofnd +pkill -f 'vald-start' +pkill -f tofnd +``` + +3. Backup the state: + +```bash +cp -r ~/.axelar_testnet/.core/data ~/.axelar-lisbon-3-upgrade-0.34/.core/data +``` + + + Caution: If you backup the entire folder, `~/.axelar_testnet/.core`, that'll + also include your private keys (inside `config` and `keyring-file` + subfolders). That can be dangerous if anyone gets access to your backups. We + recommend backing up keys separately when you first create your node, and then + excluding them from any data backups. + + +4. Restart your `axelard` node with the new `v0.35.3` build. +5. If you're a validator also restart `vald` with `v0.35.3` and `tofnd` with `v0.10.1`. + +Example using join scripts in [axelarate-community git repo](https://github.com/axelarnetwork/axelarate-community): + +```bash +# in axelarate-community repo +git checkout main +git pull +KEYRING_PASSWORD="pw-1" ./scripts/node.sh -n testnet -a v0.35.3 +# For validators, restart vald/tofnd +KEYRING_PASSWORD="pw-1" TOFND_PASSWORD="pw-2" ./scripts/validator-tools-host.sh -n testnet -a v0.35.3 -q v0.10.1 +``` diff --git a/src/pages/validator/setup/stake-axl.mdx b/src/content/docs/resources/tokens/stake-axl.mdx similarity index 100% rename from src/pages/validator/setup/stake-axl.mdx rename to src/content/docs/resources/tokens/stake-axl.mdx diff --git a/src/pages/resources/wrapped-tokens.mdx b/src/content/docs/resources/tokens/wrapped-tokens.mdx similarity index 97% rename from src/pages/resources/wrapped-tokens.mdx rename to src/content/docs/resources/tokens/wrapped-tokens.mdx index 8fec44c21..dc743b6e5 100644 --- a/src/pages/resources/wrapped-tokens.mdx +++ b/src/content/docs/resources/tokens/wrapped-tokens.mdx @@ -1,6 +1,6 @@ # Convert between native and wrapped tokens -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Axelar supports cross-chain transfer of the following native tokens via their wrapped ERC-20 versions: @@ -42,7 +42,7 @@ Mainnets: - [Moonbeam](https://moonbeam.moonscan.io/token/0xacc15dc74880c9944775448304b263d191c6077f#writeContract) - [Polygon](https://polygonscan.com/token/0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270#writeContract) -If you haven't already, import the wrapped ERC-20 token to your MetaMask account in the appropriate network as described in [Set up MetaMask](metamask). +If you haven't already, import the wrapped ERC-20 token to your MetaMask account in the appropriate network as described in [Set up MetaMask](/resources/metamask/). Click the "contract" tab, then click "write contract". (The above links should take you directly to "write contract".) diff --git a/src/content/docs/validator/amplifier/change-verifier-address.mdx b/src/content/docs/validator/amplifier/change-verifier-address.mdx new file mode 100644 index 000000000..4cd28e352 --- /dev/null +++ b/src/content/docs/validator/amplifier/change-verifier-address.mdx @@ -0,0 +1,57 @@ +# Change Your Verifier Address + +If you ever need to change the address of your verifier, you'll have to unbond and unauthorize your current verifier, then claim and transfer the bond. Finally, bond and authorize your new verifier. + +## Moving bonded funds +Move funds by starting with your current verifier and `ampd`/`tofnd`. + +1. `ampd unbond-verifier amplifier` +1. Wait until unbonding completes after the unbonding period +1. `ampd claim-stake amplifier` +1. `ampd send-tokens uaxl` +1. Then setup your new verifier (make sure you run these commands as the new ampd/tofnd) +1. `ampd bond-verifier amplifier 50000000000 uaxl` +1. `ampd register-public-key ecdsa` +1. `ampd register-chain-support amplifier flow` + +## Unauthorize and authorize your verifiers +Before making a governance proposal, You should [make a community forum post](https://community.axelar.network/) explaining what you are doing and link it in your governance proposals. Then make an on-chain proposal for the removal of authorization of your old verifier. + +```bash +axelard tx gov submit-proposal execute-contract axelar1rpj2jjrv3vpugx9ake9kgk3s2kgwt0y60wtkmcgfml5m3et0mrls6nct9m \ + '{ +"unauthorize_verifiers":{ +"verifiers":[ +"axelar1ejv5td70estc7ed4avnxnqqv4tpef2zafdkgms" +], +"service_name":"amplifier" +} +}' \ + --title="Remove verifier addresses for " \ + --description="Remove old address as part of verifier migrating to new address. See " \ + --run-as axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj \ + --deposit=10000000000uaxl \ + --from wallet \ + --gas auto --gas-adjustment 1.5 --gas-prices 0.007uaxl \ + --chain-id axelar-dojo-1 --node https://tm.axelar.lava.build:443 + ``` + + Then authorize your new verifier. + + ```bash + axelard tx gov submit-proposal execute-contract axelar1rpj2jjrv3vpugx9ake9kgk3s2kgwt0y60wtkmcgfml5m3et0mrls6nct9m \ + '{ +"authorize_verifiers":{ +"verifiers":[ +"axelar1g92hckcernmgm60tm527njl6j2cxysm7zg6ulk" +], +"service_name":"amplifier" +} +}' \ + --title="Add replacement verifier addresses for " \ + --description="Add new address as part of verifier migrating to new address. See " \ + --run-as axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj \ + --deposit=10000000000uaxl \ + --from mainnet-interoplabs-hotwallet \ + --gas auto --gas-adjustment 1.5 --gas-prices 0.007uaxl \ + --chain-id axelar-dojo-1 --node https://tm.axelar.lava.build:443 \ No newline at end of file diff --git a/src/content/docs/validator/amplifier/error-messages.mdx b/src/content/docs/validator/amplifier/error-messages.mdx new file mode 100644 index 000000000..d7a50a77c --- /dev/null +++ b/src/content/docs/validator/amplifier/error-messages.mdx @@ -0,0 +1,30 @@ +# Common Amplifier Error Messages + +import { Callout } from "/src/components/callout"; + +The following are some common error messages encountered when working with verifiers and relayers on the Amplifier. + + + These errors may be caused by other issues. The reasons given are based off of + known causes only. + + +## Verifiers + +- `command not found: axelard` — The symlink or alias to `axelard` is not working. Use full binary name instead for commands, such as `./axelard` version instead of `axelard version`. Alternatively you can fix your alias, `PATH`, or symlink. + +- `command not found: tofnd` — The symlink or alias to `tofnd` is not working. Use full binary name instead for commands, such as `tofnd-darwin-[version] --help` instead of `tofnd --help`. Alternatively you can fix your alias, `PATH`, or symlink. + +- `connection failed: transport error` — `ampd` can't connect to `tofnd`. Make sure that you have tofnd running in the background and that the port and hots `tofnd` is listening on match the information in your `ampd` config file. + +- **axelard cannot be opened because the developer cannot be verified** (Mac) — Disable the gatekeeper for a single binary with `sudo xattr -d com.apple.quarantine ~/Downloads/ampd-darwin-arm64-v1.2.0`, or disable gatekeeper globally with `sudo spctl --master-disable`. + +- `error trying to connect: received corrupt message` — Your RPC server may not support HTTPS. Try HTTP instead. + +- `error trying to connect: invalid dnsname` — Your IP-addressed server may not support HTTPS. Use `http://` instead. + +## Message relayers + +- `Generic error: Querier contract error: codespace` — The message that was supposed to be routed can’t be found. Search for `unfit_for_routing` in your terminal output to see if the message was actually routed. The transaction will succeed even with unsuccessful routing. + +- `message index: 0` — There are no new messages to confirm. diff --git a/src/content/docs/validator/amplifier/governance-proposals.mdx b/src/content/docs/validator/amplifier/governance-proposals.mdx new file mode 100644 index 000000000..ce1d0454a --- /dev/null +++ b/src/content/docs/validator/amplifier/governance-proposals.mdx @@ -0,0 +1,60 @@ +# Verifier Governance Proposals + +Changes are made to existing Amplifier settings through [community governance](/resources/community/community-pool-proposals). You will need to submit a governance proposal to modify these settings. + +## Prerequisites + +- Access to the [Axelar command-line interface](/learn/cli) +- 2,000 AXL for each proposal, either from your [own wallet](/resources/community/community-pool-proposals#create-a-local-wallet) or through a community member who can fund the proposal within one hour of posting +- A running [RPC endpoint](/resources/rpc/resources) or [Axelar node](/node/config-node) + +## Community Forum introduction + +You will need to introduce your verifier to the community in order for Axelar token holders to vote for your proposals. This should be done on the governance section of the [Axelar Community Forum](https://community.axelar.network/c/governance2/33). Make a community introduction post that precedes and can be referenced by any on-chain proposals. It should include the following information: + +- Team information +- Team background +- Relevant experience + +All of your on-chain proposals will refer back to this post, so make sure to be thorough. You should stay present and engage with any questions or comments during the seven-day feedback period, which can include public comments as well as a security council review. When the feedback period is over, submit your on-chain governance proposal to finish the approval as a verifier. + +## Authorize verifiers with the service registry + +Once the 7 day feedback period has passed, submit the proposal on-chain via the command line: + + + + ```bash export + SERVICE_REGISTRY_ADDRESS="axelar1rpj2jjrv3vpugx9ake9kgk3s2kgwt0y60wtkmcgfml5m3et0mrls6nct9m" + export + VERIFIER_AXELAR_ADDRESS="axelar16dxsfhyegy40e4eqfxee5jw5gyy2xxtcw4t2na" + export NETWORK_GOV_ADDRESS="axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj" + export RPC="https://tm.axelar-testnet.lava.build/" export + SERVICE_NAME="amplifier" export GAS_PRICE="0.007uaxl" export NAME="My + Verifier Name" # Your verifier name export + PROPOSAL_URL="https://community.axelar.network/..." # Your proposal URL +``` + + + + +```bash +axelard tx gov submit-proposal execute-contract $SERVICE_REGISTRY_ADDRESS \ + '{ + "authorize_verifiers":{ + "verifiers":[ + "'"$VERIFIER_AXELAR_ADDRESS"'" + ], + "service_name":"'"$SERVICE_NAME"'" + } + }' \ + + --title="Add $NAME to approved verifier set" \ + --description="Add $NAME to approved verifier set. Proposal Link: $PROPOSAL_URL" \ + --run-as $NETWORK_GOV_ADDRESS \ + --deposit=100000000uverifiers \ + --keyring-backend test \ + --from wallet \ + --gas auto --gas-adjustment 1.5 --gas-prices $GAS_PRICE \ + --node $RPC +``` diff --git a/src/content/docs/validator/amplifier/verifier-onboarding.mdx b/src/content/docs/validator/amplifier/verifier-onboarding.mdx new file mode 100644 index 000000000..13089a574 --- /dev/null +++ b/src/content/docs/validator/amplifier/verifier-onboarding.mdx @@ -0,0 +1,613 @@ +# Become an Amplifier Verifier + +import { Callout } from "/src/components/callout"; +import { AMPD } from '/src/config/variables'; + + + The Axelar Virtual Machine (AVM) and Amplifier are currently under active + development, so these instructions are likely to change. Please check back + frequently for updates. + + +By running a **verifier** for a chain integration with Axelar's Amplifier, you will be responsible for voting on the validity of transactions on the Axelar network and signing command batches for a given chain. + +## `tofnd` and `ampd` + +A verifier uses `ampd`, an off-chain daemon responsible for voting and signing with the Amplifier protocol, and `tofnd`, a threshold cryptography library that `ampd` depends on. + +There are three ways to set up and run a verifier: + +- **Option 1: Source** -- Clone and build directly from the GitHub source code. +- **Option 2: Binaries** -- This method requires you to install and run the `tofnd` and `ampd` binaries on your local machine. +- **Option 3: Docker** -- Use [Docker](https://docs.docker.com/engine/install/) to set up `tofnd` and `ampd`. + +## Set up `tofnd` + +`ampd` needs access to a locally running `tofnd` instance in order to onboard as a verifier or run the daemon. See the [tofnd repository](https://github.com/axelarnetwork/tofnd) for more information. + + + + +Install `tofnd` from source by cloning and building the [`tofnd` repository](https://github.com/axelarnetwork/tofnd). + +```bash +git clone git@github.com:axelarnetwork/tofnd.git --recursive +cd tofnd +cargo build --release --locked +``` + +This will create a binary in the `target/release` directory. You can move this binary to a location in your `PATH` or run it directly from the `target/release` directory. + +Create a default mnemonic and configuration in `~/.tofnd/`, then back it up and delete it. + +```bash +tofnd -m create +mv ~/.tofnd/export ~/.tofnd/export-new-location +``` + +Create an alias or symlink to the `tofnd` binary in your `.bashrc`. Be sure to specify the correct file name which may be a different architecture or later version than `v1.0.1`. + +```bash +echo "alias tofnd=~/Downloads/tofnd-linux-amd64-v1.0.1" >> ~/.bashrc +source ~/.bashrc +``` + +Now run tofnd. + +```bash +tofnd +``` + + + + +Download the [`tofnd` binary](https://github.com/axelarnetwork/tofnd/releases) depending on the type of machine you have: + - Linux: [`tofnd-linux-amd64-v1.0.1`](https://github.com/axelarnetwork/tofnd/releases/download/v1.0.1/tofnd-linux-amd64-v1.0.1) + - Apple Mac (AMD64 or ARM): [`tofnd-darwin-amd64-v1.0.1`](https://github.com/axelarnetwork/tofnd/releases/download/v1.0.1/tofnd-darwin-amd64-v1.0.1) + +Create a default mnemonic and configuration in `~/.tofnd/`, then back it up and delete it. + +```bash +~/Downloads/tofnd*-v1.0.1 -m create +mv ~/.tofnd/export ~/.tofnd/export-new-location +``` + +Now run tofnd. + +```bash +tofnd +``` + + + + + +Pull and run the latest version of `tofnd` from Docker: + +```bash +docker pull axelarnet/tofnd:v1.0.1 +docker run -p 50051:50051 --env MNEMONIC_CMD=auto --env NOPASSWORD=true --env ADDRESS=0.0.0.0 -v tofnd:/.tofnd axelarnet/tofnd:v1.0.1 +``` + + + + + +Leave this process running in the background, and perform additional commands in a new terminal window or shell. + + +Note: If you are running a validator as well, you should use a different node for your verifier (the Axelar node that ampd connects to) on both testnet and mainnet than the one being run for your validator node to prevent loss of rewards in case the verifier fails. This node can use the `everything` pruning config to reduce resource use. + + + +Note: You also must run different `tofnd` instances for `vald` (for your validator) and `ampd` (for your verifier). You cannot use the same `tofnd` instance for both. + + +## Set up `ampd` + + + + + Install `ampd` from source by cloning and building the [`axelar-amplifier` + repository](https://github.com/axelarnetwork/axelar-amplifier). + + + + Download the [`ampd` + binary](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/ampd-v1.2.0) + depending on the type of machine you have: + - Linux: + [`ampd-linux-amd64-v1.2.0`](https://github.com/axelarnetwork/axelar-amplifier/releases/download/ampd-v1.2.0/ampd-linux-amd64-v1.2.0) + - Apple Silicon Mac: + [`ampd-darwin-arm64-v1.2.0`](https://github.com/axelarnetwork/axelar-amplifier/releases/download/ampd-v1.2.0/ampd-darwin-arm64-v1.2.0) + - Intel Mac: + [`ampd-darwin-amd64-v1.2.0`](https://github.com/axelarnetwork/axelar-amplifier/releases/download/ampd-v1.2.0/ampd-darwin-amd64-v1.2.0) + + + +From [Docker](https://hub.docker.com/r/axelarnet/axelar-ampd), pull and run the `1.2.0` version of `ampd`: + + + +```bash +docker pull axelarnet/axelar-ampd:v1.2.0 +docker run axelarnet/axelar-ampd:v1.2.0 verifier-address +``` + + + + + +The address for your verifier node will also be the address that rewards are sent to (this will change in the future). You should make sure to claim and move any available rewards regularly to mitigate any associated risks. + + +## Add `ampd` to your `PATH` + +This will allow you to begin commands with `ampd`. If you set up `ampd` through source or Docker, you can skip this step. + + + + +1. Add a symbolic link named `ampd` in your binaries folder.: + + ```bash + sudo ln -s ~/Downloads/ampd-*-v1.2.0 /usr/local/bin/ampd + ``` + +1. Make the binary executable: + + ```bash + chmod a+x ~/Downloads/ampd-*-v* + ``` + +1. Restart your terminal. + +1. Run `ampd --version` to make sure that the right version of `ampd` is being used. It should be {AMPD}. + + + + + +`ampd` releases can be found [here](https://github.com/axelarnetwork/axelar-amplifier/releases) + + + + + Replace `ampd-darwin-arm64-v1.2.0` with the [`ampd` binary you downloaded](/validator/amplifier/verifier-onboarding#set-up-ampd). + + +1. Add an alias to `ampd` at the end of the `.bashrc` file on your machine: + + ```bash + echo "alias ampd=~/Downloads/ampd-darwin-arm64-v1.2.0" >> ~/.bashrc + ``` + +1. Reload the file to apply all changes: + + ```bash + source ~/.bashrc + ``` + +1. Restart your terminal. + +1. Run `ampd --version` to make sure that the right version of `ampd` was installed on your machine. It should be {AMPD}. + + + + + + Replace `ampd-darwin-arm64-v1.2.0` with the [`ampd` binary you downloaded](/validator/amplifier/verifier-onboarding#set-up-ampd). + +1. Add an alias to `ampd` at the end of the `.zshrc` file on your machine: + + ```bash + echo "ampd=~/Downloads/ampd-darwin-arm64-v1.2.0" >> ~/.zshrc + ``` + +1. Save and close the file. + +1. Reload the file to apply all changes: + + ```bash + source ~/.zshrc + ``` + +1. Restart your terminal. + +1. Run `ampd --version` to make sure that the right version of `ampd` was installed on your machine. It should be {AMPD}. + + + + + +## Configure the verifier + +Create an `ampd` configuration file at `~/.ampd/config.toml`. + +This configuration file tells `ampd` how to connect to your local `tofnd`, how to talk to the devnet and the Amplifier smart contracts, and includes a default configuration for verifying transactions on the Avalanche testnet. + +The following are an example `config.toml` files: + + + + ```toml + tm_jsonrpc="http://devnet-amplifier.axelar.dev:26657/" + tm_grpc="tcp://devnet-amplifier.axelar.dev:9090" + event_buffer_cap=10000 + + [service_registry] + cosmwasm_contract="axelar1c9fkszt5lq34vvvlat3fxj6yv7ejtqapz04e97vtc9m5z9cwnamq8zjlhz" + + [broadcast] + batch_gas_limit="20000000" + broadcast_interval="1s" + chain_id="devnet-amplifier" + gas_adjustment="2" + gas_price="0.00005uamplifier" + queue_cap="1000" + tx_fetch_interval="1000ms" + tx_fetch_max_retries="15" + + [tofnd_config] + batch_gas_limit="10000000" + key_uid="axelar" + party_uid="ampd" + url="http://127.0.0.1:50051/" + + [grpc] + ip_addr = '127.0.0.1' + port = 9090 + global_concurrency_limit = 1024 + concurrency_limit_per_connection = 32 + request_timeout = '30s' + + [tm_grpc_timeout] + nanos="0" + secs="5" + + [tofnd_config.timeout] + nanos="0" + secs="3" + + + [[handlers]] + chain_name="ethereum-sepolia" + chain_rpc_url="https://rpc.ankr.com/eth_sepolia" + cosmwasm_contract="axelar1e6jnuljng6aljk0tjct6f0hl9tye6l0n9p067pwx2374h82dmr0s9qcqy9" + type="EvmMsgVerifier" + chain_finalization="RPCFinalizedBlock" + + [[handlers]] + chain_name="ethereum-sepolia" + chain_rpc_url="https://rpc.ankr.com/eth_sepolia" + cosmwasm_contract="axelar1e6jnuljng6aljk0tjct6f0hl9tye6l0n9p067pwx2374h82dmr0s9qcqy9" + type="EvmVerifierSetVerifier" + + [[handlers]] + chain_name="ethereum-sepolia" + type="MultisigSigner" + cosmwasm_contract="axelar19jxy26z0qnnspa45y5nru0l5rmy9d637z5km2ndjxthfxf5qaswst9290r" + + [[handlers]] + chain_name="avalanche" + chain_rpc_url="https://avalanche-fuji-c-chain-rpc.publicnode.com/" + cosmwasm_contract="axelar1ty7mx0cllgz8xuvhn2j7e3qy8999ssgmjtktyqetl335em0g88lq6rjhl2" + type="EvmMsgVerifier" + chain_finalization="RPCFinalizedBlock" + + [[handlers]] + chain_name="avalanche" + chain_rpc_url="https://avalanche-fuji-c-chain-rpc.publicnode.com/" + cosmwasm_contract="axelar1ty7mx0cllgz8xuvhn2j7e3qy8999ssgmjtktyqetl335em0g88lq6rjhl2" + type="EvmVerifierSetVerifier" + + [[handlers]] + chain_name="avalanche" + type="MultisigSigner" + cosmwasm_contract="axelar19jxy26z0qnnspa45y5nru0l5rmy9d637z5km2ndjxthfxf5qaswst9290r" + ``` + + + ```toml + # replace with your Axelar testnet node + tm_jsonrpc="http://127.0.0.1:26657/" + tm_grpc="tcp://127.0.0.1:9090" + event_buffer_cap=100000 + + [service_registry] + cosmwasm_contract="axelar1rpj2jjrv3vpugx9ake9kgk3s2kgwt0y60wtkmcgfml5m3et0mrls6nct9m" + + [broadcast] + batch_gas_limit="20000000" + broadcast_interval="1s" + chain_id="axelar-testnet-lisbon-3" + gas_adjustment="2" + gas_price="0.007uaxl" + queue_cap="1000" + tx_fetch_interval="1000ms" + tx_fetch_max_retries="15" + + [tofnd_config] + batch_gas_limit="10000000" + key_uid="axelar" + party_uid="ampd" + url="http://127.0.0.1:50051/" + + [tm_grpc_timeout] + nanos="0" + secs="5" + + [tofnd_config.timeout] + nanos="0" + secs="3" + + [grpc] + ip_addr = '127.0.0.1' + port = 9090 + global_concurrency_limit = 1024 + concurrency_limit_per_connection = 32 + request_timeout = '30s' + + [[handlers]] + chain_name="test-sepolia" + chain_rpc_url="https://rpc.ankr.com/eth_sepolia" + cosmwasm_contract="axelar1r4rmvn83vrfj4evy5l8cv2nat2v0whm36ds3crn2mhlq8ufmhvts9467zz" + chain_finalization="RPCFinalizedBlock" + type="EvmMsgVerifier" + + [[handlers]] + chain_name="test-sepolia" + chain_rpc_url="https://rpc.ankr.com/eth_sepolia" + cosmwasm_contract="axelar1r4rmvn83vrfj4evy5l8cv2nat2v0whm36ds3crn2mhlq8ufmhvts9467zz" + chain_finalization="RPCFinalizedBlock" + type="EvmVerifierSetVerifier" + + [[handlers]] + chain_name="test-sepolia" + type="MultisigSigner" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + + [[handlers]] + chain_name="test-avalanche" + chain_rpc_url="https://api.avax-test.network/ext/bc/C/rpc" + cosmwasm_contract="axelar1hupk5du59cgu4ps5s637rhakwsq0060ycdp57j2ccevna7wqqzrqnfrr0p" + chain_finalization="ConfirmationHeight" + type="EvmMsgVerifier" + + [[handlers]] + chain_name="test-avalanche" + chain_rpc_url="https://api.avax-test.network/ext/bc/C/rpc" + cosmwasm_contract="axelar1hupk5du59cgu4ps5s637rhakwsq0060ycdp57j2ccevna7wqqzrqnfrr0p" + chain_finalization="ConfirmationHeight" + type="EvmVerifierSetVerifier" + + [[handlers]] + chain_name="test-avalanche" + type="MultisigSigner" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + + [[handlers]] + chain_name="flow" + chain_rpc_url="[flow gateway rpc url]" + cosmwasm_contract="axelar1kkqdsqvwq9a7p9fj0w89wpx2m2t0vrxl782aslhq0kdw2xxd2aesv3un04" + chain_finalization="RPCFinalizedBlock" + type="EvmMsgVerifier" + + [[handlers]] + chain_name="flow" + chain_rpc_url="[flow gateway rpc url]" + cosmwasm_contract="axelar1kkqdsqvwq9a7p9fj0w89wpx2m2t0vrxl782aslhq0kdw2xxd2aesv3un04" + chain_finalization="RPCFinalizedBlock" + type="EvmVerifierSetVerifier" + + [[handlers]] + chain_name="flow" + type="MultisigSigner" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + + + # For each supported chain + #[[handlers]] + #chain_name="[chain name]" + #chain_rpc_url="[node rpc url]" + #cosmwasm_contract="[voting verifier address]" + #chain_finalization="[RPCFinalizedBlock or ConfirmationHeight]" + #type="EvmMsgVerifier" + + #[[handlers]] + #chain_name="[chain name]" + #chain_rpc_url="[node rpc url]" + #cosmwasm_contract="[voting verifier address]" + #chain_finalization=["RPCFinalizedBlock" or "ConfirmationHeight"] + #type="EvmVerifierSetVerifier" + ``` + + + ```toml + # replace with your Axelar mainnet node + tm_jsonrpc="http://127.0.0.1:26657/" + tm_grpc="tcp://127.0.0.1:9090" + event_buffer_cap=100000 + + [service_registry] + cosmwasm_contract="axelar1rpj2jjrv3vpugx9ake9kgk3s2kgwt0y60wtkmcgfml5m3et0mrls6nct9m" + + [broadcast] + batch_gas_limit="20000000" + broadcast_interval="1s" + chain_id="axelar-dojo-1" + gas_adjustment="2" + gas_price="0.007uaxl" + queue_cap="1000" + tx_fetch_interval="1000ms" + tx_fetch_max_retries="15" + + [tofnd_config] + batch_gas_limit="10000000" + key_uid="axelar" + party_uid="ampd" + url="http://127.0.0.1:50051/" + + [tm_grpc_timeout] + nanos="0" + secs="5" + + [tofnd_config.timeout] + nanos="0" + secs="3" + + [grpc] + ip_addr = '127.0.0.1' + port = 9090 + global_concurrency_limit = 1024 + concurrency_limit_per_connection = 32 + request_timeout = '30s' + + [[handlers]] + chain_name="flow" + chain_rpc_url="[flow gateway rpc url]" + cosmwasm_contract="axelar1kkqdsqvwq9a7p9fj0w89wpx2m2t0vrxl782aslhq0kdw2xxd2aesv3un04" + chain_finalization="RPCFinalizedBlock" + type="EvmMsgVerifier" + + [[handlers]] + chain_name="flow" + chain_rpc_url="[flow gateway rpc url]" + cosmwasm_contract="axelar1kkqdsqvwq9a7p9fj0w89wpx2m2t0vrxl782aslhq0kdw2xxd2aesv3un04" + chain_finalization="RPCFinalizedBlock" + type="EvmVerifierSetVerifier" + + [[handlers]] + chain_name="flow" + type="MultisigSigner" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + + + # For each supported chain + #[[handlers]] + #chain_name="[chain name]" + #chain_rpc_url="[node rpc url]" + #cosmwasm_contract="[voting verifier address]" + #chain_finalization="[RPCFinalizedBlock or ConfirmationHeight]" + #type="EvmMsgVerifier" + + #[[handlers]] + #chain_name="[chain name]" + #chain_rpc_url="[node rpc url]" + #cosmwasm_contract="[voting verifier address]" + #chain_finalization=["RPCFinalizedBlock" or "ConfirmationHeight"] + #type="EvmVerifierSetVerifier" + ``` + + + +See the [`ampd` README](https://github.com/axelarnetwork/axelar-amplifier/blob/main/ampd/README.md) on GitHub for instructions on formatting a `config` file for your own projects. For `chain_finalization`, if the chain supports the `finalized` tag via the RPC API, choose `RPCFinalizedBlock`, otherwise choose `ConfirmationHeight`. + + + If you get a transport error with an `ampd` command, make sure that you have + `tofnd` running in the background. + + +## Fund your wallet + +Prior to running the `ampd` daemon, you will need to set up your wallet with devnet funds. + +1. Determine your verifier address: + + ```bash + ampd verifier-address + ``` + + + If you get a security warning while trying to run `ampd` on an Apple + Silicon Mac, you can disable the + [gatekeeper](https://support.apple.com/guide/security/gatekeeper-and-runtime-protection-sec5599b66df/web) + for a single binary with `sudo xattr -d com.apple.quarantine + ~/Downloads/ampd-darwin-arm64-v1.2.0` or disable gatekeeper globally with + `sudo spctl --master-disable`. + + +1. Fund your verifier address. + + 1. Fill out the [Amplifier Verifier Onboarding Form](https://docs.google.com/forms/d/e/1FAIpQLSfQQhk292yT9j8sJF5ARRIE8PpI3LjuFc8rr7xZW7posSLtJA/viewform) for your address to be whitelisted or to receive funds. + +## Activate and run the verifier + +1. Bond your verifier: + + + + ```bash + ampd bond-verifier validators 100 uamplifier + ``` + + + ```bash + ampd bond-verifier amplifier 100000000000 uaxl + ``` + + + ```bash + ampd bond-verifier amplifier 50000000000 uaxl + ``` + + + + Bonded verifiers will stay bonded until they unbond or are removed by governance. The bond for testnet is 100000000000uamplifier (100k AXL). The bond for mainnet is 50000000000uamplifier (50k AXL). + +1. Register your public key with `ecdsa` and `ed25519`: + + + + ```bash + ampd register-public-key ecdsa + ``` + + + ```bash + ampd register-public-key ed25519 + ``` + + + + +1. Register support for desired chains, enabling `ampd` to participate in voting and signing for your supported chains. + + + + ```bash + ampd register-chain-support validators flow + ``` + + + ```bash + ampd register-chain-support amplifier flow + ``` + + + + Multiple chain names can be passed, separated by a space (`ampd register-chain-support [service name] [chains]...`). Note that any chain you want to support here must be configured in your ampd `config.toml` file. + +1. Authorize your verifier. + + This is dependent on the environment, and can be done via governance, or by the network operators. + +1. Run the `ampd` daemon. + + Running `ampd` without any command will run the daemon. + +## Productionizing + +As you move towards testnet and mainnet, you should switch to running your own full Axelar node and your own full node or light client for any chains you are voting on. + +## Help + +For more info about the available commands and options, run: + +```bash +ampd --help +``` + +## Feedback + +If you have any feedback or would like to report a bug, please file an issue in the [Axelar Developer Support repository](https://github.com/axelarnetwork/support/issues). diff --git a/src/content/docs/validator/amplifier/verifier-rewards.mdx b/src/content/docs/validator/amplifier/verifier-rewards.mdx new file mode 100644 index 000000000..dbac44c00 --- /dev/null +++ b/src/content/docs/validator/amplifier/verifier-rewards.mdx @@ -0,0 +1,192 @@ +# Verifier Rewards + +import { Callout } from "/src/components/callout"; + +Verifiers are responsible for securing transactions with chains connected to the Axelar Network via the [Axelar Amplifier](/dev/amplifier/introduction). Verifiers vote on the truthfulness of transactions posted to the network and create signatures for outgoing messages. In compensation for these activities and the associated decentralized node running costs, verifiers earn rewards provided by each chain integrator. + +Rewards are calculated based on counted contributions. A contribution is counted whenever a poll ends based on the verifiers who voted, and when a verifier signs an event. Contributions are tracked in the [verifier rewards contract](https://github.com/axelarnetwork/axelar-amplifier/tree/main/contracts/rewards). + +Contributions are assessed per epoch (a length of time configured by governance). At the conclusion of an epoch, a message can be sent to the rewards contract to process rewards for the most recent window. Rewards are calculated based on a percentage of all traffic for a given chain and paid in AXL. + + + + Your browser does not support SVG + + + + The `EndBlocker` is code that executes at the end of each block so that + rewards are distributed automatically. It has not yet been implemented in the + Axelar Amplifier. + + +## Voting flow + + + + + Your browser does not support SVG + + +1. The relayer picks up a `callContract()` event and calls `verify_messages()` on the Axelar gateway. +1. The Axelar gateway calls `verify_messages()` on the voting verifier, which begins the voting process with the verifier set. +1. Once enough votes have been cast for the message, a `record_participation()` event is emitted to the rewards contract. +1. The rewards contract keeps a tally of how many events each verifier correctly participated in. + +## Signing flow + +

    + +

    + +The destination chain uses the prover rather than the voting verifier to pass the message. + +1. The multisig prover gets the messages and their contents from the gateway and calls `start_signing_session()` on the multisig contract, which begins the signing process with the verifier set. +1. Registered chains, who have their own sets of verifiers, become aware that there is a signing session for the chain they support with their public keys and start signing. +1. Once enough signatures have been gathered, a signed batch will be created and eventually relayed back to the source chain. +1. If a verifier signed during a certain grace period, the multisig contract emits a `record_participation()` event to the rewards contract. +1. The rewards contract keeps a tally of how many events each verifier correctly participated in. + +## Reward pools + +Each integrated chain has two pools that must be funded independently. There is one rewards pool for signing and one pool for voting. + +Reward pools are not tied to an epoch. If earned rewards are not claimed, they will continue to grow. If rewards are being earned but the pool has not been sufficiently funded, these rewards can be funded and claimed at a later date. Integrators should ensure that pools always have enough funds so that verifiers can get their rewards quickly. + +## Rewards calculation + +Rewards are calculated through the following parameters, which are first configured during [contract instantiation](https://github.com/axelarnetwork/axelar-amplifier/blob/6fd3612716fc6cf3b421ebe53939a71341731047/contracts/voting-verifier/src/msg.rs#L13). These parameters can be modified through governance: + +- [`epoch_duration`](https://github.com/axelarnetwork/axelar-amplifier/blob/6d6b974e1a911b17b2d019cb14c5ceb748cc244a/contracts/rewards/src/msg.rs#L21) — How often rewards are calculated, specified in number of blocks. For example, an `epoch_duration` of 500 blocks will reward verifiers for their participation in each 500-block window. +- [`rewards_per_epoch`](https://github.com/axelarnetwork/axelar-amplifier/blob/6d6b974e1a911b17b2d019cb14c5ceb748cc244a/contracts/rewards/src/msg.rs#L24) — The total number of tokens distributed as rewards per epoch, split equally amongst all participating verifiers for a given epoch. The same for both signing and voting. +- [`participation_threshold`](https://github.com/axelarnetwork/axelar-amplifier/blob/6d6b974e1a911b17b2d019cb14c5ceb748cc244a/contracts/rewards/src/msg.rs#L30C9-L30C32) — The participation threshold that verifiers must meet to receive given rewards in a given epoch, specified as a fraction between 0 (exclusive) and 1 (exclusive). Verifiers must participate in at least this fraction of all events in a given epoch to receive rewards. Participation is reset at the beginning of each epoch, so participation in previous epochs does not affect rewards for future epochs. + +## Check the funds in a pool + +Use `rewards_pool()` to check the funds in a pool: + + + + ```bash export + REWARDS_CONTRACT_ADDRESS="axelar1vaj9sfzc3z0gpel90wu4ljutncutv0wuhvvwfsh30rqxq422z89qnd989l" + export CHAIN_NAME="fantom" export + VOTING_VERIFIER_OR_MULTISIG_CONTRACT_ADDRESS="axelar1ty7mx0cllgz8xuvhn2j7e3qy8999ssgmjtktyqetl335em0g88lq6rjhl2" + # or "axelar1g6520uhs8u37el40wqngf60z06mjgk6z7nezytd2mxrmh7yesnmsyc0zjw" + export RPC="http://devnet-amplifier.axelar.dev:26657/" +``` + + + ```bash export + REWARDS_CONTRACT_ADDRESS="axelar1harq5xe68lzl2kx4e5ch4k8840cgqnry567g0fgw7vt2atcuugrqfa7j5z" + export CHAIN_NAME="test-avalanche" export + VOTING_VERIFIER_OR_MULTISIG_CONTRACT_ADDRESS="axelar1hupk5du59cgu4ps5s637rhakwsq0060ycdp57j2ccevna7wqqzrqnfrr0p"# + or "axelar1l5k8wlzmkmtnvjvs9x77wdcfweucwgums9e8fh0d8cy76ymqc5aqzguqnn" + export RPC="https://tm.axelar-testnet.lava.build/" +``` + + + + + You can get the addresses of the rewards, voting verifier, and multisig + contracts through + [`devnet-amplifier.json`](https://github.com/axelarnetwork/axelar-contract-deployments/blob/019d41f81b506d35fa89ffd9ebb3a02719563e09/axelar-chains-config/info/devnet-amplifier.json). + + +```bash +axelard q wasm contract-state smart $REWARDS_CONTRACT_ADDRESS \ + '{ + "rewards_pool": + { + "pool_id": + { + "chain_name":"'"$CHAIN_NAME"'", + "contract":"'"$VOTING_VERIFIER_OR_MULTISIG_CONTRACT_ADDRESS"'" + } + } + }' \ + --node $RPC +``` + +## Distribute rewards + +Use `distribute_rewards()` to distribute rewards from a pool: + + + + ```bash + export REWARDS_CONTRACT_ADDRESS="axelar1vaj9sfzc3z0gpel90wu4ljutncutv0wuhvvwfsh30rqxq422z89qnd989l" + export CHAIN_NAME="avalanche" + export VOTING_VERIFIER_OR_MULTISIG_CONTRACT_ADDRESS="axelar1elaymnd2epmfr498h2x9p2nezc4eklv95uv92u9csfs8wl75w7yqdc0h67" || "0x7eeE33A59Db27d762AA1Fa31b26efeE0dABa1132" + export RPC="http://devnet-amplifier.axelar.dev:26657/" + ``` + + + ```bash + export REWARDS_CONTRACT_ADDRESS="axelar1harq5xe68lzl2kx4e5ch4k8840cgqnry567g0fgw7vt2atcuugrqfa7j5z" + export CHAIN_NAME="test-avalanche" + export VOTING_VERIFIER_OR_MULTISIG_CONTRACT_ADDRESS="axelar1hupk5du59cgu4ps5s637rhakwsq0060ycdp57j2ccevna7wqqzrqnfrr0p" || "0x7eeE33A59Db27d762AA1Fa31b26efeE0dABa1132" + export RPC="https://tm.axelar-testnet.lava.build/" + ``` + + + + + + You can get the addresses of the rewards, voting verifier, and multisig + contracts through + [`devnet-amplifier.json`](https://github.com/axelarnetwork/axelar-contract-deployments/blob/019d41f81b506d35fa89ffd9ebb3a02719563e09/axelar-chains-config/info/devnet-amplifier.json). + + +```bash +axelard tx wasm execute $REWARDS_CONTRACT_ADDRESS \ + '{ + "distribute_rewards": + { + "pool_id": + { + "chain_name":"'"$CHAIN_NAME"'", + "contract":"'"$VOTING_VERIFIER_OR_MULTISIG_CONTRACT_ADDRESS"'" + }, + "epoch_count":10 + } + }' \ + --keyring-backend test \ + --from wallet \ + --gas auto --gas-adjustment 1.5 --gas-prices 0.007uamplifier \ + --node $RPC +``` + +Rewards are distributed to verifiers with a participation rate greater than the threshold as the epoch closes. Rewards are calculated based on the time passed since the last event and the total number of verifiers, and split equally amongst all participating verifiers in the epoch. + +`epoch_count` is the maximum number of historical epochs for which to distribute rewards, starting with the oldest. If not specified, rewards will be distributed for the last 10 epochs. + + +## Withdrawing rewards +By default your verifier rewards will be sent to the address of your verifier (change this with `ampd set-rewards-proxy`). To withdraw your rewards, use `ampd`'s `send-tokens` feature. + +```bash +ampd send-tokens uaxl +``` \ No newline at end of file diff --git a/src/content/docs/validator/amplifier/verifier-rotations.mdx b/src/content/docs/validator/amplifier/verifier-rotations.mdx new file mode 100644 index 000000000..1e0f2a08b --- /dev/null +++ b/src/content/docs/validator/amplifier/verifier-rotations.mdx @@ -0,0 +1,63 @@ +# Verifier Rotations + +One type of message the network can sign and prove to a destination chain is a message containing an update to the verifier set. To make an update to the verifier set for a chain, the previous verifier set must sign a message communicating the changes. + +## Check if a verifier is in an active set + +Use `current_verifier_set` to get the active verifier set for an integrated chain. This is the same as the signer set unless there is a verifier set update in progress, since the prover requires a few extra steps before active verifier sets can be confirmed as signers. + +```bash +export CHAIN_MULTISIG_PROVER_ADDRESS="axelar1xz4cya4qm2ws6nzperhvc40wdjcq4872fl6d3j2s4cytyx8j80eqenv87g" +export RPC="https://tm.axelar-testnet.lava.build/" +``` + +```bash +axelard q wasm contract-state smart $CHAIN_MULTISIG_PROVER_ADDRESS \ + '"current_verifier_set"' \ + --node $RPC +``` + +## Get proof of a verifier set change + +[`get_proof`](https://github.com/axelarnetwork/axelar-amplifier/blob/f76dc8a775b8bb529cf50147bab9259d1ec7f784/contracts/multisig-prover/src/msg.rs#L81) communicates with a destination chain that a [verifier set has been changed](https://github.com/axelarnetwork/axelar-amplifier/blob/main/doc/src/contracts/multisig_prover.md#update-and-confirm-verifierset-sequence-diagram), and tells the destination chain that it must accept signatures from these new verifiers. + +```bash +export MULTISIG_SESSION_ID="3457" +``` + +```bash +axelard q wasm contract-state smart $CHAIN_MULTISIG_PROVER_ADDRESS \ + '{ + "get_proof":{ + "multisig_session_id":"'"$MULTISIG_SESSION_ID"'" + } + }' \ + --node $RPC +``` + +## Update the verifier set for a given chain + +When a verifier set is rotated for a given chain, the existing signers verify the new signers via the `update_verifier_set` command. This is temporarily permissioned to the admin contract established by the network. + +```bash +axelard tx wasm execute $CHAIN_MULTISIG_PROVER_ADDRESS \ + '"update_verifier_set"' \ + --from wallet + --gas auto --gas-adjustment 1.5 --gas-prices 0.007uverifiers \ + --chain-id axelar-testnet-lisbon-3 \ + --node $RPC +``` + +## Confirm the verifier set after a vote + +Use `confirm_verifier_set` to confirm a verifier set update. + +```bash +axelard tx wasm execute $CHAIN_MULTISIG_PROVER_ADDRESS \ + '"confirm_verifier_set"' \ + --keyring-backend test + --from wallet + --gas auto --gas-adjustment 1.5 --gas-prices 0.007uverifiers \ + --chain-id axelar-testnet-lisbon-3 \ + --node $RPC +``` diff --git a/src/content/docs/validator/amplifier/verifier-security-expectations.mdx b/src/content/docs/validator/amplifier/verifier-security-expectations.mdx new file mode 100644 index 000000000..c0c482593 --- /dev/null +++ b/src/content/docs/validator/amplifier/verifier-security-expectations.mdx @@ -0,0 +1,13 @@ +# Verifier Security Expectations + +To maintain the security of the Axelar network, every verifier must: + +- Run a full [Axelar node](/node/config-node/). +- Maintain independent chain nodes. +- Monitor ampd uptime to maintain a continuous operational availability for voting. +- Rotate keys on a regular basis. +- Pull rewards regularly. +- Only support chains that are fully trustworthy. +- Be responsive to calls for escalation. +- Participate in regular security drills. +- Adhere to the [color-coded messaging scheme](https://bright-ambert-2bd.notion.site/Partners-Messaging-Scheme-Public-Page-0e5021d084eb4824bdf3216e59d3c39a) between partners and the Interop Labs team. diff --git a/src/pages/validator/external-chains/arbitrum.mdx b/src/content/docs/validator/external-chains/arbitrum.mdx similarity index 56% rename from src/pages/validator/external-chains/arbitrum.mdx rename to src/content/docs/validator/external-chains/arbitrum.mdx index 57f35bb46..ac943ccf7 100644 --- a/src/pages/validator/external-chains/arbitrum.mdx +++ b/src/content/docs/validator/external-chains/arbitrum.mdx @@ -1,18 +1,19 @@ # Arbitrum -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; -Set up your Arbitrum Mainnet & Goerli Testnet RPC node +Set up your Arbitrum Mainnet & Sepolia Testnet RPC node ## Prerequisites -- [Setup your Axelar validator](/validator/setup) -- [Setup your Ethereum node](ethereum) +- [Setup your Axelar validator](/validator/setup/overview/) +- [Setup your Ethereum node](/validator/external-chains/ethereum/) - Minimum hardware requirements: CPU with 2+ cores, 4GB RAM, 600GB+ free storage space. - MacOS or Ubuntu 20.04+ - [Official Documentation](https://developer.offchainlabs.com/node-running/running-a-node) ## Steps + 1. Install Docker 2. Install Arbitrum image 3. Configure vald @@ -34,22 +35,25 @@ chmod -fR 777 $HOME/data/arbitrum ``` Now, you will see this flag in the command below `--l1.url ` this means that your arbitrum node needs a synced Ethereum node. -Please provide the RPC URL of your synced [Ethereum node](ethereum) with this flag. +Please provide the RPC URL of your synced [Ethereum node](/validator/external-chains/ethereum/) with this flag. - Please use your own Ethereum node instead of using 3rd party providers like alchemy, infura etc. for decentralization/security. Third-party providers also have a specific request limit, and your node can throw 100s of thousands of requests while trying to sync. + Please use your own Ethereum node instead of using 3rd party providers like + alchemy, infura etc. for decentralization/security. Third-party providers also + have a specific request limit, and your node can throw 100s of thousands of + requests while trying to sync. ```bash - docker run --rm -it -d -v /path/to/data/arbitrum:/home/user/.arbitrum -p 0.0.0.0:8547:8547 -p 0.0.0.0:8548:8548 --l1.url --l2.chain-id=42161 --http.api=net,web3,eth,debug --http.corsdomain=* --http.addr=0.0.0.0 --http.vhosts=* --init.url="https://snapshot.arbitrum.io/mainnet/nitro.tar" - ``` + docker run --rm -it -v /some/local/dir/arbitrum:/home/user/.arbitrum -p 0.0.0.0:8547:8547 -p 0.0.0.0:8548:8548 --parent-chain.connection.url --chain.id=42161 --http.api=net,web3,eth,debug --http.corsdomain=* --http.addr=0.0.0.0 --http.vhosts=* --init.url="https://snapshot.arbitrum.foundation/arb1/nitro-archive.tar" +``` - + ```bash - docker run --rm -it -d -v /path/to/data/arbitrum:/home/user/.arbitrum -p 0.0.0.0:8547:8547 -p 0.0.0.0:8548:8548 --l1.url --l2.chain-id=421613 --http.api=net,web3,eth,debug --http.corsdomain=* --http.addr=0.0.0.0 --http.vhosts=* - ``` + docker run --rm -it -v /some/local/dir/arbitrum:/home/user/.arbitrum -p 0.0.0.0:8547:8547 -p 0.0.0.0:8548:8548 --parent-chain.connection.url --chain.id=421613 --http.api=net,web3,eth,debug --http.corsdomain=* --http.addr=0.0.0.0 --http.vhosts=* --init.url="https://snapshot.arbitrum.foundation/sepolia/nitro-archive.tar" +``` @@ -59,7 +63,7 @@ To verify if your node is in sync you can check the latest block from the explor Compare it with what you have in `docker ps -q | xargs -L 1 docker logs --tail 10 -f` - [Mainnet Explorer](https://arbiscan.io) -- [Testnet Explorer](https://goerli.arbiscan.io) +- [Testnet Explorer](https://sepolia.arbiscan.io) #### Test RPC connection @@ -78,22 +82,16 @@ If you are testing it remotely, please replace `localhost` with the IP or URL of In order for `vald` to connect to your Arbitrum node, your `rpc_addr` should be exposed in vald's `config.toml` - - ```bash - [[axelar_bridge_evm]] - name = "arbitrum" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` + ```bash [[axelar_bridge_evm]] name = "arbitrum" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` - - ```bash - [[axelar_bridge_evm]] - name = "arbitrum" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` + + ```bash [[axelar_bridge_evm]] name = "arbitrum" rpc_addr = "http://IP:PORT" + start-with-bridge = true + +``` diff --git a/src/pages/validator/external-chains/aurora.mdx b/src/content/docs/validator/external-chains/aurora.mdx similarity index 98% rename from src/pages/validator/external-chains/aurora.mdx rename to src/content/docs/validator/external-chains/aurora.mdx index 667f8f08a..446d4d6b9 100644 --- a/src/pages/validator/external-chains/aurora.mdx +++ b/src/content/docs/validator/external-chains/aurora.mdx @@ -1,6 +1,7 @@ --- templateEngineOverride: md --- + # Aurora # You need a server with following requirements @@ -8,85 +9,117 @@ templateEngineOverride: md 8-Core (16-Thread) / 8GBRAM DDR4 / 500GB SSD ## 1. Upgrade your server + ``` sudo apt update && sudo apt upgrade -y ``` + ``` sudo apt install make clang pkg-config libssl-dev libclang-dev build-essential git curl ntp jq llvm tmux htop screen unzip -y ``` + ## 2. Install docker and docker-compose Check the latest version of [docker-compose](https://github.com/docker/compose) and follow the guide + ``` sudo apt install docker.io -y ``` + ``` git clone https://github.com/docker/compose ``` + ``` cd compose git checkout v2.6.1 make ``` + ``` cd mv compose/bin/docker-compose /usr/bin docker-compose version ``` + ## 3. Install and synch Aurora node Download installation from [official documentation](https://github.com/aurora-is-near/partner-relayer-deploy) + ``` git clone https://github.com/aurora-is-near/partner-relayer-deploy cd partner-relayer-deploy ``` -For testnet purpose run + +For testnet purpose run + ``` ./setup.sh testnet ``` + For mainet purpose run + ``` ./setup.sh ``` + ### 4. Run Aurora node through docker-compose + To run docker, you must be in the folder `partner-relayer-deploy` -``` + +``` docker-compose up -d ``` + To see logs use command + ``` docker-compose logs -f ``` + ## 5. Create SSH keys on the Aurora Node + Please run the following command on the Aurora server (just press "Enter" for each question): + ``` cd ``` + ``` ssh-keygen -t ed25519 ``` ### 6. Add public key on the Axelar Node + Once the key pair has been generated you need to create it on the Axelar Node `/root/.ssh/authorized_keys` file and copy content from the `/root/.ssh/id_ed25519.pub` file which was created on the Aurora Node: + ``` mkdir .ssh nano /root/.ssh/authorized_keys ``` + After this we need to set the following permissions: + ``` chmod 600 /root/.ssh/authorized_keys ``` + When you perform these actions you should be able to connect from Aurora Node to Axelar Node without password ### 7. Create SSH tunnel between Aurora Node and Axelar Main Node + On the Aurora server please run the following command to create a tunnel to forwarding ports: + ``` ssh -f -N root@X.X.X.X -R 10080:`docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}:10080{{end}}' endpoint` ``` + Please note `X.X.X.X` this is IP address of your Axelar Main Node ### 8. Check that necessary port is listening on the AxelarNode + On the Axelar Node please run the following command to make sure that port is listening: + ``` netstat -atnp | grep 8545 tcp 0 0 127.0.0.1:10080 0.0.0.0:* LISTEN 2306635/sshd: root @@ -94,22 +127,29 @@ tcp6 0 0 ::1:10080 :::* LIST ``` ### 9. Create a script to run it automatically after reboot + Create directory + ``` mkdir /root/work ``` Create tunnel.ssh file: + ``` nano /root/work/tunnel.ssh ``` + and add the following line into it: + ``` ssh -f -N root@X.X.X.X -R 10080:`docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}:10080{{end}}' endpoint` ``` + Please note `X.X.X.X` this is IP address of your Axelar Main Node Then open crontab file and choose option 1: + ``` crontab -e ``` @@ -123,7 +163,7 @@ and add this line to the end of it: so when the Aurora server will be rebooted the SSH tunnel will be created automatically ### 10. Connect your Aurora to Axelar + In order for Axelar Network to connect to your Aurora node, your rpc_addr should be exposed in this format: `"http://127.0.0.1:10080/"` - diff --git a/src/pages/validator/external-chains/avalanche.mdx b/src/content/docs/validator/external-chains/avalanche.mdx similarity index 93% rename from src/pages/validator/external-chains/avalanche.mdx rename to src/content/docs/validator/external-chains/avalanche.mdx index 450f3cb30..df521281d 100644 --- a/src/pages/validator/external-chains/avalanche.mdx +++ b/src/content/docs/validator/external-chains/avalanche.mdx @@ -4,19 +4,17 @@ Instructions to set up your Avalanche node. ## Requirements -- [Setup your Axelar validator](/validator/setup) +- [Setup your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: 8 AWS vCPU+, 16GB RAM, 500GB+ free storage space. - MacOS or Ubuntu 20.04 (tested on 20.04) - [Official Documentation](https://docs.avax.network/build/tutorials/nodes-and-staking/run-avalanche-node) - ## Prerequisites + ```bash sudo apt-get install wget jq -y ``` - - ## Get Binaries Check the appropriate version for the network accordingly [in their docs](https://docs.avax.network/build/tutorials/nodes-and-staking/run-avalanche-node) or choose the [latest release](https://github.com/ava-labs/avalanchego/releases) @@ -37,7 +35,6 @@ AVALANCHEGO=v1.9.3 - ```bash # verify correct versions echo $AVALANCHEGO @@ -136,7 +133,9 @@ sudo systemctl restart systemd-journald journalctl -u avalanchego.service -f -n 100 -o cat ``` + Logs should appear like this + ```bash [11-28|07:50:59.280] INFO

    bootstrap/bootstrapper.go:481 fetching blocks {"numFetchedBlocks": 85000, "numTotalBlocks": 3241631, "eta": "1h52m8s"} [11-28|07:51:13.370] INFO

    bootstrap/bootstrapper.go:481 fetching blocks {"numFetchedBlocks": 90000, "numTotalBlocks": 3241631, "eta": "1h53m58s"} @@ -168,6 +167,7 @@ curl -X POST --data '{ If you get something like this in response of the above rpc call, your node is setup correctly Wait for `isBootstrapped` to become true before using it in vald config + ```bash { "jsonrpc": "2.0", @@ -189,22 +189,15 @@ echo "${YOUR_IP}:9650/ext/bc/C/rpc" In order for `vald` to connect to your Avalanche node, your `rpc_addr` should be exposed in vald's `config.toml` - - - ```bash - [[axelar_bridge_evm]] - name = "Avalanche" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` - - - ```bash - [[axelar_bridge_evm]] - name = "Avalanche" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` - - \ No newline at end of file + + ```bash [[axelar_bridge_evm]] name = "Avalanche" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + + + ```bash [[axelar_bridge_evm]] name = "Avalanche" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + + diff --git a/src/content/docs/validator/external-chains/base.mdx b/src/content/docs/validator/external-chains/base.mdx new file mode 100644 index 000000000..9599cacba --- /dev/null +++ b/src/content/docs/validator/external-chains/base.mdx @@ -0,0 +1,215 @@ +# Base + +Instructions to set up your base node. + +## Requirements + +- [Setup your Axelar validator](/validator/setup/overview/) +- Minimum hardware requirements: 8 AWS vCPU+, 8GB RAM, 512GB of SSD free storage space. +- MacOS or Ubuntu 22.04 (tested on 22.04) +- [Official Documentation](https://github.com/base-org/node) + +## Prerequisites + +- [Common Docker Compose Commands](/validator/external-chains/optimism/#common-node-operations/) + +```bash +sudo apt-get install jq -y +snap install docker +``` + +## Clone Repo + +```bash +git clone https://github.com/base-org/node base-node +cd base-node +``` + +## Set node config + +In docker-compose.yml, uncomment the right .env file according to the network you want to run it on + + + + ```bash + env_file: + # select your network here: + # - .env.sepolia + - .env.mainnet + ``` + + + + ```bash + env_file: + # select your network here: + - .env.sepolia + # - .env.mainnet + ``` + + + + +Set the following config options in `base-node/.env.sepolia` or `base-node/.env`: + +```bash +# [recommended] replace with your preferred L1 (Ethereum, not Base) node RPC URL: +OP_NODE_L1_ETH_RPC=https://rpc.sepolia.org + +# [required] replace with your preferred L1 CL beacon endpoint: +OP_NODE_L1_BEACON=https://your.sepolia.beacon.node/endpoint-here +``` + +You can setup a beacon endpoint using the instructions [here](/validator/external-chains/ethereum/#install-a-consensus-layer-client/), make sure to expose the endpoint to public +In lighthouse this needs passing of `--http-address 0.0.0.0` while starting the service + +## Start the node + +```bash +docker compose up -d +``` + +This should show an output like this: + +```bash +[+] Running 3/3 + ✔ Network base-node_default Created 0.1s + ✔ Container base-node-geth-1 Started 0.4s + ✔ Container base-node-node-1 Started 0.8s 11.2s +``` + +After it is done, verify by listing the services and their status + +```bash +docker compose ps +``` + +You should see these 2 services running + +```bash +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +base-node-geth-1 base-node-geth "bash ./geth-entrypo…" geth 16 seconds ago Up 15 seconds 0.0.0.0:7308->6060/tcp, :::7308->6060/tcp, 0.0.0.0:8525->8545/tcp, :::8525->8545/tcp, 0.0.0.0:8526->8546/tcp, :::8526->8546/tcp, 0.0.0.0:30308->30303/tcp, 0.0.0.0:30308->30303/udp, :::30308->30303/tcp, :::30308->30303/udp +base-node-node-1 base-node-node "bash ./op-node-entr…" node 16 seconds ago Up 15 seconds 0.0.0.0:6062->6060/tcp, :::6062->6060/tcp, 0.0.0.0:7320->7300/tcp, :::7320->7300/tcp, 0.0.0.0:7445->8545/tcp, :::7445->8545/tcp, 0.0.0.0:9242->9222/tcp, 0.0.0.0:9242->9222/udp, :::9242->9222/tcp, :::9242->9222/udp +``` + +## Check logs + +#### Verify OP geth logs + +```bash +docker compose logs geth --since 20m -f +``` + +```bash +base-node-geth-1 | INFO [03-18|07:28:01.409] HTTP server started endpoint=[::]:8545 auth=false prefix= cors=* vhosts=* +base-node-geth-1 | INFO [03-18|07:28:01.409] WebSocket enabled url=ws://[::]:8546 +base-node-geth-1 | INFO [03-18|07:28:01.409] WebSocket enabled url=ws://[::]:8551 +base-node-geth-1 | INFO [03-18|07:28:01.409] HTTP server started endpoint=[::]:8551 auth=true prefix= cors=localhost vhosts=* +base-node-geth-1 | INFO [03-18|07:28:11.610] Looking for peers peercount=0 tried=156 static=0 +base-node-geth-1 | INFO [03-18|07:28:21.725] Looking for peers peercount=0 tried=122 static=0 +base-node-geth-1 | INFO [03-18|11:32:45.773] Forkchoice requested sync to new head number=11,986,109 hash=085c5c..61c7ca +base-node-geth-1 | INFO [03-18|11:32:47.466] Forkchoice requested sync to new head number=11,986,110 hash=2f176f..8f3656 +base-node-geth-1 | INFO [03-18|11:32:49.476] Forkchoice requested sync to new head number=11,986,111 hash=e247cf..08c3fb +base-node-geth-1 | INFO [03-18|11:32:51.280] Forkchoice requested sync to new head number=11,986,112 hash=b6c25a..b7a064 +``` + +#### Verify OP node logs + +```bash +docker compose logs node --since 20m -f +``` + +You should see logs like + +```bash +base-node-node-1 | t=2024-03-18T11:32:40+0000 lvl=info msg="Starting JSON-RPC server" +base-node-node-1 | t=2024-03-18T11:32:40+0000 lvl=info msg="started metrics server" addr=[::]:7300 +base-node-node-1 | t=2024-03-18T11:32:40+0000 lvl=info msg="Starting execution engine driver" +base-node-node-1 | t=2024-03-18T11:32:40+0000 lvl=info msg="Starting driver" sequencerEnabled=false sequencerStopped=false +base-node-node-1 | t=2024-03-18T11:32:40+0000 lvl=info msg="Rollup node started" +base-node-node-1 | t=2024-03-18T11:32:40+0000 lvl=info msg="State loop started" +base-node-node-1 | t=2024-03-18T11:50:47+0000 lvl=info msg="Sync progress" reason="unsafe payload from sequencer while in EL sync" l2_finalized=0x0000000000000000000000000000000000000000000000000000000000000000:0 l2_safe=0x0000000000000000000000000000000000000000000000000000000000000000:0 l2_pending_safe=0x0000000000000000000000000000000000000000000000000000000000000000:0 l2_unsafe=0x6e8ea627774bbe62255b23938ea2639c251e5199cadc7eaee58412193423acfc:11986117 l2_time=1710761581 l1_derived=0x0000000000000000000000000000000000000000000000000000000000000000:0 +base-node-node-1 | t=2024-03-18T11:50:49+0000 lvl=info msg="Received signed execution payload from p2p" id=0x17e27490a5845c45d656d2a464a0c9aa1c764cc286d96bc2d17a108e2cbe2737:11986651 peer=16Uiu2HAm5zCUPtJdtbGF7XLQ8fsmsgWP9656wmMTSnnp5FoDdxDD +base-node-node-1 | t=2024-03-18T11:50:49+0000 lvl=info msg="Optimistically inserting unsafe L2 execution payload to drive EL sync" id=0x17e27490a5845c45d656d2a464a0c9aa1c764cc286d96bc2d17a108e2cbe2737:11986651 +``` + +## Verify node sync status + +### RPC Endpoint + +```bash +echo "$(curl -4 ifconfig.co):8545" +``` + +#### Method: + +Check your op node status at port 7545 by + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"optimism_syncStatus","params":[],"id":1}' [rpc] | jq +``` + +If you get something like this in response to the above rpc call, your node is setup correctly + +```bash +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "current_l1": { + "hash": "0x24f7d66e8c80d0c6a598e9206ba1abc81264c1cc68afc14d8eca3f04fa81f921", + "number": 323360, + "parentHash": "0x99ce84a2d455425f0c3a68b2b83a74301810fc8c726cba384b08d9a79d9381d1", + "timestamp": 1700059308 + }, +.......... +.......... + "engine_sync_target": { + "hash": "0x7b7ed381aac9cec2a43b37c30779832cb8a82e044e38b4ada0f1c90719bd3d50", + "number": 30955, + "parentHash": "0x882503037e902b2476e1d4c308a895cc3b936c5ee19b45361dc26c9631d29ae0", + "timestamp": 1700059286, + "l1origin": { + "hash": "0x49ee7a7398bc5010b48de111fc0ebc99d63d38ac8233202c913646d901e15213", + "number": 323353 + }, + "sequenceNumber": 2 + } + } +} +``` + +You can compare the block height on your node with explorer ([mainnet](https://basescan.org/) or [testnet](https://goerli.basescan.org/)), +use your RPC node only when it has caught up with the latest block height. + +#### Sync Status of Base optimism Execution Node + +You can check your status by connecting to geth console + +```bash +docker exec -it base-node-geth-1 geth attach http://localhost:8545 +> eth.blockNumber +94078 # it will show you the latest block - number here is just an example + +> eth.syncing +true +``` + +## Configure vald + +In order for `vald` to connect to your Base node, your `rpc_addr` should be exposed in +vald's `config.toml` + + + + ```bash [[axelar_bridge_evm]] name = "base" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + + + ```bash [[axelar_bridge_evm]] name = "base" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + + diff --git a/src/content/docs/validator/external-chains/berachain.mdx b/src/content/docs/validator/external-chains/berachain.mdx new file mode 100644 index 000000000..c5aec3eea --- /dev/null +++ b/src/content/docs/validator/external-chains/berachain.mdx @@ -0,0 +1,277 @@ +# Berachain + +import { Callout } from "/src/components/callout"; + +Set up your Berachain Mainnet or Testnet node + +## Prerequisites + +- [Setup your Axelar validator](/validator/setup/overview/) +- [Minimum hardware requirements](https://docs.berachain.com/nodes/quickstart#hardware-requirements-%F0%9F%92%BB): + - Memory: 48 GB RAM + - CPU: 8 Physical Cores + - Disk: 4TB of SSD storage +- [Official Documentation](https://docs.berachain.com/nodes/quickstart) + +## Download clients + +Download berachain consensus client from [here](https://github.com/berachain/beacon-kit/releases). + +```bash +wget https://github.com/berachain/beacon-kit/releases/download/v1.2.0/beacond-v1.2.0-linux-amd64.tar.gz +tar -xzvf beacond-v1.2.0-linux-amd64.tar.gz +mv beacond-v1.2.0-linux-amd64 beacond +``` + +Download any execution client recommended from [here](https://docs.berachain.com/nodes/evm-execution). + +```bash +wget https://github.com/NethermindEth/nethermind/releases/download/1.31.11/nethermind-1.31.11-2be1890e-linux-x64.zip +unzip nethermind-1.31.11-2be1890e-linux-x64.zip +``` + +## Fetch Scripts + +```bash +mkdir beranode +cd beranode +git clone https://github.com/berachain/guides +mv guides/apps/node-scripts/* ./ +rm -r guides +``` + +## Configure env variables + +```bash +nano env.sh +``` + +The file env.sh contains environment variables used in the other scripts. + + + + + ```bash + #!/bin/bash + + # CHANGE THESE VALUES + export CHAIN_SPEC=mainnet + export MONIKER_NAME=camembera # name of your choice + export WALLET_ADDRESS_FEE_RECIPIENT=0x9BcaA41DC32627776b1A4D714Eef627E640b3EF5 + export EL_ARCHIVE_NODE=false # set to true if you want to run an archive node on CL and EL + export MY_IP=`curl -s canhazip.com`. # your node ip address + + # VALUES YOU MIGHT WANT TO CHANGE + export LOG_DIR=$(pwd)/logs + export JWT_PATH=$BEACOND_CONFIG/jwt.hex + export BEACOND_BIN=$(command -v beacond || echo $(pwd)/beacond) # set path to beacond binary + export BEACOND_DATA=$(pwd)/var/beacond + export RETH_BIN=$(command -v reth || echo $(pwd)/reth) # set path to the reth binary + export GETH_BIN=$(command -v geth || echo $(pwd)/geth) # set path to the geth binary + export NETHERMIND_BIN=$(command -v Nethermind.Runner || echo $(pwd)/Nethermind.Runner) # set path to nethermind binary + export ERIGON_BIN=$(command -v erigon || echo $(pwd)/erigon) # set path to erigon binary +``` + + + ```bash + #!/bin/bash + + # CHANGE THESE VALUES + export CHAIN_SPEC=testnet + export MONIKER_NAME=camembera # name of your choice + export WALLET_ADDRESS_FEE_RECIPIENT=0x9BcaA41DC32627776b1A4D714Eef627E640b3EF5 + export EL_ARCHIVE_NODE=false # set to true if you want to run an archive node on CL and EL + export MY_IP=`curl -s canhazip.com` # your node ip address + + # VALUES YOU MIGHT WANT TO CHANGE + export LOG_DIR=$(pwd)/logs + export JWT_PATH=$BEACOND_CONFIG/jwt.hex + export BEACOND_BIN=$(command -v beacond || echo $(pwd)/beacond) # set path to beacond binary + export BEACOND_DATA=$(pwd)/var/beacond + export RETH_BIN=$(command -v reth || echo $(pwd)/reth) # set path to the reth binary + export GETH_BIN=$(command -v geth || echo $(pwd)/geth) # set path to the geth binary + export NETHERMIND_BIN=$(command -v Nethermind.Runner || echo $(pwd)/Nethermind.Runner) # set path to nethermind binary + export ERIGON_BIN=$(command -v erigon || echo $(pwd)/erigon) # set path to erigon binary +``` + + + + +## Fetch Parameters + +The `fetch-berachain-params.sh` script downloads the key network parameters for Berachain. + +```bash +./fetch-berachain-params.sh +``` + +## Set up the Consensus Client + +The script `setup-beacond.sh` invokes `beacond init` and `beacond jwt generate`. + +```bash +./setup-beacond.sh +``` + +## Set up the Execution Client + +The `setup-reth`, `setup-geth`, and `setup-nether` scripts create a runtime directory and configuration for their respective chain clients. + +```bash +./setup-nether.sh +``` + +## Run Both Clients + +Create systemd service file for nethermind: + +```bash +sudo tee </dev/null /etc/systemd/system/nethermind.service +[Unit] +Description=Nethermind Client +After=network.target + +[Service] +User=$USER +Type=simple +ExecStart=/path/to/the/$NETHERMIND_BINARY --config $NETHERMIND_CONFIG_DIR/nethermind.cfg +Restart=on-failure +LimitNOFILE=65535 + +[Install] +WantedBy=multi-user.target +EOF +``` + +Create systemd service file for beacond: + +```bash +sudo tee </dev/null /etc/systemd/system/beacond.service +[Unit] +Description=Beacond Client +After=network.target + +[Service] +User=$USER +Type=simple +ExecStart=/path/to/the/$BEACOND_BINARY start --home $BEACOND_DATA +Restart=on-failure +LimitNOFILE=65535 + +[Install] +WantedBy=multi-user.target +EOF +``` + +### Start Clients + +You can start the clients using snapshots by following the [guide](https://docs.berachain.com/nodes/quickstart#fetch-snapshots-optional). + +```bash +# Reload systemd +sudo systemctl daemon-reload + +# Enable Nethermind and Beacon Chain services to start on b +sudo systemctl enable nethermind +sudo systemctl enable beacond + +# Start the services +sudo systemctl start nethermind +sudo systemctl start beacond +``` + +If everything was set-up correctly, your Clients should now be starting the process of synchronization. This will take several hours, depending on your hardware. To check the status of the running service or to follow the logs, you can use: + +Check Status: + +```bash +sudo systemctl status nethermind +sudo systemctl status beacond +``` + +Check Logs: + +```bash +sudo journalctl -u nethermind -f +sudo journalctl -u beacond -f +``` + +## Verify sync status + +Get current execution block number: + +```bash +curl --location 'http://localhost:8545/' \ +--header 'Content-Type: application/json' \ +--data '{ + "jsonrpc":"2.0", + "method":"eth_blockNumber", + "params":[], + "id":420 +}' +``` + +Get current Consensus Block Number: + +```bash +curl -s http://localhost:26657/status | jq '.result.sync_info.latest_block_height' +``` + +## Ampd Configuration + +Once your node is up and running, you need to add the `Berachain` chain to your [ampd daemon's](https://github.com/axelarnetwork/axelar-amplifier/tree/main/ampd) `config.toml`file. This can be done by adding in the following configuration: + + + + ```toml + [[handlers]] + type="MultisigSigner" + chain_name="berachain" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + + [[handlers]] + type="EvmMsgVerifier" + chain_finalization="RPCFinalizedBlock" + chain_name="berachain" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1xx6xdw6mwmfl6u2jygq0zfx2q6uyc8emtt29j9wg78l2l4p739nqmwsgal" + + [[handlers]] + type="EvmVerifierSetVerifier" + chain_finalization="RPCFinalizedBlock" + chain_name="berachain" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1xx6xdw6mwmfl6u2jygq0zfx2q6uyc8emtt29j9wg78l2l4p739nqmwsgal" + ``` + + + ```toml + [[handlers]] + type="MultisigSigner" + chain_name="berachain" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + + [[handlers]] + type="EvmMsgVerifier" + chain_finalization="RPCFinalizedBlock" + chain_name="berachain" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1xx6xdw6mwmfl6u2jygq0zfx2q6uyc8emtt29j9wg78l2l4p739nqmwsgal" + + [[handlers]] + type="EvmVerifierSetVerifier" + chain_finalization="RPCFinalizedBlock" + chain_name="berachain" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1xx6xdw6mwmfl6u2jygq0zfx2q6uyc8emtt29j9wg78l2l4p739nqmwsgal" + ``` + + + +## Chain Registration + +For your node to be recognized by the Axelar Network, you need to register your verifier's support for the chain with the `ampd` daemon. This can be done by running: + +```bash +ampd register-chain-support amplifier berachain +``` diff --git a/src/pages/validator/external-chains/binance.mdx b/src/content/docs/validator/external-chains/binance.mdx similarity index 89% rename from src/pages/validator/external-chains/binance.mdx rename to src/content/docs/validator/external-chains/binance.mdx index 1aa1d9a55..59c118a8a 100644 --- a/src/pages/validator/external-chains/binance.mdx +++ b/src/content/docs/validator/external-chains/binance.mdx @@ -4,13 +4,13 @@ Instructions to set up your Binance node. ## Requirements -- [Setup your Axelar validator](/validator/setup) +- [Setup your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: 16 AWS vCPU+, 64GB RAM, 2TB+ free storage space. - MacOS or Ubuntu 20.04 (tested on 20.04) - [Official Documentation](https://docs.bnbchain.org/docs/validator/fullnode/) - ## Prerequisites + ```bash sudo apt-get install wget jq unzip aria2 lz4 -y ``` @@ -23,6 +23,7 @@ Check the appropriate version for the network accordingly [in their docs](https: # This is an example - check their docs and release page to opt for the right version BSC_GETH_RELEASE=vx.y.z ``` + ```bash # verify correct version echo $BSC_GETH_RELEASE @@ -41,8 +42,6 @@ geth version cd $HOME ``` - - ```bash @@ -63,27 +62,27 @@ unzip testnet.zip rm testnet.zip ``` - - - - ## Initialize the node or sync from snapshot #### 1. If you want to sync from genesis + ```bash cd $HOME geth --datadir $HOME/.bsc init genesis.json ``` + #### 2. If you want to sync from snapshot - Mainnet Only -You find the snapshot links [here](https://github.com/bnb-chain/bsc-snapshots) or [here](https://github.com/48Club/bsc-snapshots#download) to sync from snapshot + +You find the snapshot links [here](https://github.com/bnb-chain/bsc-snapshots) or [here](https://github.com/48Club/bsc-snapshots#download) to sync from snapshot ```bash # change the url to latest snapshot available: you can find it in the links shared above GETH_SNAPSHOT_URL=https://snapshots.48.club/geth.24761776.tar.lz4 ``` + ```bash cd $HOME/.bsc/ aria2c -s14 -x14 -k100M $GETH_SNAPSHOT_URL -o geth.tar.lz4 @@ -118,6 +117,7 @@ EOF ``` By default it will log the logs in `$HOME/.bsc/bsc.log` if you want to use journalctl to view logs, comment out the log setting in config + ```bash sed -i '/Node.LogConfig/s/^/#/' $HOME/.bsc/config/config.toml sed -i '/FilePath/s/^/#/' $HOME/.bsc/config/config.toml @@ -125,12 +125,15 @@ sed -i '/MaxBytesSize/s/^/#/' $HOME/.bsc/config/config.toml sed -i '/Level/s/^/#/' $HOME/.bsc/config/config.toml sed -i '/FileRoot/s/^/#/' $HOME/.bsc/config/config.toml ``` + # Start the service + ```bash sudo systemctl daemon-reload sudo systemctl enable geth sudo systemctl restart geth ``` + ## Check logs ```bash @@ -143,6 +146,7 @@ journalctl -u geth.service -f -n 100 -o cat Logs should appear like this #### If you are syncing from genesis + ```bash INFO [01-12|07:22:26.423] Downloader queue stats receiptTasks=118 blockTasks=34418 itemSize=658.90B throttle=8192 INFO [01-12|07:22:26.464] Imported new block receipts count=91 elapsed=39.135ms number=80616 hash=f2b5af..d57e5c age=2y4mo3w size=39.74KiB @@ -155,6 +159,7 @@ INFO [01-12|07:23:04.983] State sync in progress synced=0.56% ``` #### If you are syncing from snapshot + ```bash INFO [01-14|05:21:12.351] Initialising Ethereum protocol network=56 dbversion=8 INFO [01-14|05:21:12.353] Loaded most recent local header number=24,761,776 hash=794f37..9792a8 td=49,216,905 age=7h20m3s @@ -165,11 +170,14 @@ INFO [01-14|05:21:12.353] Loaded most recent local fast block number=24,761 ## Verify #### Method 1: + ```bash YOUR_IP=$(curl -4 ifconfig.co) curl -X POST $YOUR_IP:8545 -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' | jq ``` + If you get something like this in response of the above rpc call, your node is setup correctly + ```json { "jsonrpc": "2.0", @@ -193,37 +201,41 @@ If you get something like this in response of the above rpc call, your node is s } } ``` + Wait for `"result"` to become `false` before using it in vald config ```json -{"jsonrpc":"2.0","id":1,"result":false} +{ "jsonrpc": "2.0", "id": 1, "result": false } ``` #### Method 2: + You can also check your status by connect to geth console + ```bash geth attach http://localhost:8545 eth.syncing ``` If you get something like this in response, your node is setup correctly + ```json { - currentBlock: 24000, - healedBytecodeBytes: 0, - healedBytecodes: 0, - healedTrienodeBytes: 0, - healedTrienodes: 0, - healingBytecode: 0, - healingTrienodes: 0, - highestBlock: 23846000, - startingBlock: 0, - syncedAccountBytes: 0, - syncedAccounts: 0, - syncedBytecodeBytes: 0, - syncedBytecodes: 0, - syncedStorage: 0, - syncedStorageBytes: 0 + "currentBlock": 24000, + "healedBytecodeBytes": 0, + "healedBytecodes": 0, + "healedTrienodeBytes": 0, + "healedTrienodes": 0, + "healingBytecode": 0, + "healingTrienodes": 0, + "highestBlock": 23846000, + "startingBlock": 0, + "syncedAccountBytes": 0, + "syncedAccounts": 0, + "syncedBytecodeBytes": 0, + "syncedBytecodes": 0, + "syncedStorage": 0, + "syncedStorageBytes": 0 } ``` @@ -247,19 +259,13 @@ vald's `config.toml` - ```bash - [[axelar_bridge_evm]] - name = "binance" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` + ```bash [[axelar_bridge_evm]] name = "binance" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` - ```bash - [[axelar_bridge_evm]] - name = "binance" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` + ```bash [[axelar_bridge_evm]] name = "binance" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` diff --git a/src/content/docs/validator/external-chains/blast.mdx b/src/content/docs/validator/external-chains/blast.mdx new file mode 100644 index 000000000..d61367732 --- /dev/null +++ b/src/content/docs/validator/external-chains/blast.mdx @@ -0,0 +1,198 @@ +# Blast + +Instructions to set up your blast node. + +## Requirements + +- [Setup your Axelar validator](/validator/setup/overview/) +- Minimum hardware requirements: 8 AWS vCPU+, 8GB RAM, 512GB of SSD free storage space. +- MacOS or Ubuntu 22.04 (tested on 22.04) +- [Official Github Documentation](https://github.com/blast-io/deployment) +- [Official Documentation for Node Providers](https://docs.blast.io/tools/node-providers) + +## Prerequisites + +- [Common Docker Compose Commands](/validator/external-chains/optimism/#common-node-operations) + +```bash +sudo apt-get install jq -y +snap install docker +``` + +## Clone Repo + +```bash +git clone https://github.com/blast-io/deployment.git blast-node +cd blast-node +``` + +## Set Node Config Environment Variables + +```bash +cp .env.example .env +``` + +Set the following config options in `blast-node/.env`: + + + + ```bash # NETWORK should be mainnet or sepolia NETWORK=mainnet # Relative + path to the directory that will store chain data + GETH_DATA_DIR=blast-geth-data # Your Ethereum L1 RPC endpoint + L1_RPC_URL="your_l1_rpc_url" # The type of RPC provider, valid options are + alchemy, quicknode, infura, parity, nethermind, debug_geth, erigon, basic, + any # Axelar Team recommends you to run your own L1_RPC_KIND="any" +``` + + + ```bash # NETWORK should be mainnet or sepolia NETWORK=sepolia # Relative + path to the directory that will store chain data + GETH_DATA_DIR=blast-geth-data # Your Sepolia L1 RPC endpoint + L1_RPC_URL="your_l1_rpc_url" # The type of RPC provider, valid options are + alchemy, quicknode, infura, parity, nethermind, debug_geth, erigon, basic, + any # Axelar Team recommends you to run your own L1_RPC_KIND="any" +``` + + + +## Start the node + +```bash +docker compose up -d +``` + +This should show an output like this: + +```bash +[+] Running 6/6 + ✔ Network blast-node_blast-net Created 0.1s + ✔ Network blast-node_default Created 0.1s + ✔ Container blast-node-generate-jwt-1 Exited 1.0s + ✔ Container blast-node-geth-init-1 Exited 1.8s + ✔ Container blast-node-blast-geth-1 Started 2.0s + ✔ Container blast-node-op-node-1 Started 2.3s 11.2s +``` + +After it is done, verify by listing the services and their status + +```bash +docker compose ps +``` + +You should see these 2 services running + +```bash +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +blast-node-blast-geth-1 blastio/blast-geth:sepolia "geth --datadir=/bla…" blast-geth 4 hours ago Up 4 hours 8545-8546/tcp, 30303/tcp, 0.0.0.0:9545-9546->9545-9546/tcp, :::9545-9546->9545-9546/tcp, 30303/udp +blast-node-op-node-1 blastio/blast-optimism:sepolia "op-node --l1=https:…" op-node 4 hours ago Up 4 hours 0.0.0.0:9003->9003/tcp, :::9003->9003/tcp +``` + +## Check logs + +#### Verify blast geth logs + +```bash +docker compose logs blast-geth --since 2m -f +``` + +```bash +blast-node-blast-geth-1 | INFO [02-27|07:43:45.734] Started P2P networking self="enode://54139a54494808b5f9703b3858fc8fe0aaffa5902d41b1fc61f6c92bc003743d87c81e115120a2d5061bb1852fd04fb2851bb235e660462d0c107b7bed640302@127.0.0.1:30303?discport=0" +blast-node-blast-geth-1 | INFO [02-27|07:43:45.735] HTTP server started endpoint=[::]:9545 auth=false prefix= cors=* vhosts=* +blast-node-blast-geth-1 | INFO [02-27|07:43:45.735] WebSocket enabled url=ws://[::]:9546 +blast-node-blast-geth-1 | INFO [02-27|07:43:45.735] WebSocket enabled url=ws://[::]:8551 +blast-node-blast-geth-1 | INFO [02-27|07:43:45.735] HTTP server started endpoint=[::]:8551 auth=true prefix= cors=localhost vhosts=* +blast-node-blast-geth-1 | INFO [02-04|07:42:29.722] Chain head was updated number=39537 hash=26c5c6..e67efa root=14a631..1e99bf elapsed=5.40331ms age=2mo2w6d +blast-node-blast-geth-1 | INFO [02-04|07:42:29.734] Starting work on payload id=0x95a98a726f1398ee +blast-node-blast-geth-1 | INFO [02-04|07:42:29.751] Imported new potential chain segment number=39538 hash=219454..97cd30 blocks=1 txs=1 mgas=0.051 elapsed=16.713ms mgasps=3.022 age=2mo2w6d triedirty=0.00B +``` + +It will not import new headers until your op-node is synced, once your op-node is synced, your blast-geth logs should look like this + +```bash +blast-node-blast-geth-1 | INFO [02-29|08:08:15.219] Starting work on payload id=0x48323feb74b0d35a +blast-node-blast-geth-1 | INFO [02-29|08:08:15.237] Imported new potential chain segment number=3083 hash=96c535..584bd5 blocks=1 txs=1 mgas=0.047 elapsed=16.962ms mgasps=2.768 age=1mo3w1d snapdiffs=606.60KiB triedirty=0.00B +blast-node-blast-geth-1 | INFO [02-29|08:08:15.243] Chain head was updated number=3083 hash=96c535..584bd5 root=52730a..6a9c02 elapsed=5.42431ms age=1mo3w1d +blast-node-blast-geth-1 | INFO [02-29|08:08:15.256] Starting work on payload id=0x180234ae531457a1 +blast-node-blast-geth-1 | INFO [02-29|08:08:15.274] Imported new potential chain segment number=3084 hash=9687bc..de7e94 blocks=1 txs=1 mgas=0.047 elapsed=16.911ms mgasps=2.776 age=1mo3w1d snapdiffs=606.78KiB triedirty=0.00B +blast-node-blast-geth-1 | INFO [02-29|08:08:15.285] Chain head was updated number=3084 hash=9687bc..de7e94 root=8081fb..43e327 elapsed=10.075637ms age=1mo3w1d +blast-node-blast-geth-1 | INFO [02-29|08:08:15.307] Starting work on payload id=0x44c95802c3652dbd +``` + +#### Verify OP node logs + +```bash +docker compose logs op-node --since 2m -f +``` + +You should see logs like + +```bash +blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Starting JSON-RPC server" +blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="metrics disabled" +blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Starting execution engine driver" +blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Starting driver" sequencerEnabled=false sequencerStopped=false +blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Rollup node started" +blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="State loop started" +blast-node-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Loaded current L2 heads" unsafe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 safe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 finalized=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 unsafe_origin=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 safe_origin=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 +blast-node-op-node-1 | t=2024-02-27T07:43:47+0000 lvl=info msg="Walking back L1Block by number" curr=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 next=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 l2block=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 +blast-node-op-node-1 | t=2024-02-27T07:43:47+0000 lvl=info msg="Hit finalized L2 head, returning immediately" unsafe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 safe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 finalized=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 unsafe_origin=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 safe_origin=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 +blast-node-op-node-1 | t=2024-02-27T07:43:47+0000 lvl=info msg="Sync progress" reason="reset derivation work" l2_finalized=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 l2_safe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 l2_unsafe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 l2_engineSyncTarget=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 l2_time=1,704,686,688 l1_derived=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 +``` + +## Verify node sync status + +### RPC Endpoint + +```bash +echo "$(curl -4 ifconfig.co):9545" +``` + +#### Method: + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' [rpc] | jq +``` + +If you get something like this in response to the above rpc call, your node is setup correctly + +```bash +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x09A" +} +``` + +#### Sync Status of Blast optimism Execution Node + +You can check your status by connecting to geth console + +```bash +docker exec -it blast-node-blast-geth-1 geth attach http://localhost:9545 +> eth.blockNumber +94078 # it will show you the latest block - number here is just an example + +> eth.syncing +false +``` + +You can compare the block height on your node with explorer ([mainnet](https://blastscan.io/) or [testnet](https://testnet.blastscan.io)), +use your RPC node only when it has caught up with the latest block height. + +## Configure vald + +In order for `vald` to connect to your Blast node, your `rpc_addr` should be exposed in +vald's `config.toml` + + + + ```bash [[axelar_bridge_evm]] name = "blast" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + + + ```bash [[axelar_bridge_evm]] name = "blast" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + + diff --git a/src/content/docs/validator/external-chains/celo.mdx b/src/content/docs/validator/external-chains/celo.mdx new file mode 100644 index 000000000..ac4604c69 --- /dev/null +++ b/src/content/docs/validator/external-chains/celo.mdx @@ -0,0 +1,101 @@ +# Celo + +import { Callout } from "/src/components/callout"; + +Set up your CELO Mainnet or Celo Sepolia Testnet RPC node + +## Prerequisites + +- [Setup your Axelar validator](/validator/setup/overview/) +- [Minimum hardware requirements](https://docs.celo.org/validator/run/mainnet#hardware-requirements): + - Memory: 16 GB RAM + - CPU: Quad core 3GHz (64-bit) + - Disk: 512 GB of SSD storage, plus a secondary HDD desirable + - Network: At least 1 GB input/output Ethernet with a fiber Internet connection, ideally redundant connections and HA switches +- MacOS or Ubuntu 18.04+ +- [Official Documentation](https://docs.celo.org/cel2/operators/run-node) +- [Install Docker and docker-compose](https://docs.docker.com/engine/install/) + +## Steps + +1. Clone the Repository +2. Configuring the node +3. Start the node +4. Estimate remaining sync time +5. Configure vald + +### Clone the Repository + +```bash +git clone https://github.com/celo-org/celo-l2-node-docker-compose.git +cd celo-l2-node-docker-compose +``` + +### Configuring the node + +Example configs is provided for Celo Sepolia, Baklava and Mainnet(will be available once the L2 version is launched). + +Copy the desired network environment file to .env (.env is used by docker-compose to load environment variables). + +E.g. To run a node on Celo Sepolia: + +```bash +cp celo-sepolia.env .env +``` + +Open ```.env``` and optionally configure any setting you may wish to change. For more details, refer to the documentation: [Celo L2 Node Configurations](https://github.com/celo-org/celo-l2-node-docker-compose?tab=readme-ov-file#node-configurations). + +### Start the node + +```bash +docker compose up -d --build +``` + +To see logs after starting the container, do the following. + +```bash +docker compose logs -f --tail 10 +``` + +You'll start seeing some output. After a few minutes, you should see lines that look like this. This means your node has started syncing with the network and is receiving blocks. + +```bash +op-node-1 | t=2025-03-10T13:10:05+0000 lvl=info msg="successfully processed payload" ref=0xf4f3329a393c63a3049dd6ccf373b84a8010575959a9b08b5322816c277185dc:40656885 txs=1 +op-node-1 | t=2025-03-10T13:10:06+0000 lvl=info msg="Received signed execution payload from p2p" id=0xaed84ef24c4accfac8597083e86b2187b10594ef4d8cf6a1de8794d8d2eb6f54:40656886 peer=16Uiu2HAmGJAiUX6HLSo4nLh8T984qxzokwL23cVsYuNZy2SrK7C6 txs=1 +op-node-1 | t=2025-03-10T13:10:06+0000 lvl=info msg="Optimistically queueing unsafe L2 execution payload" id=0xaed84ef24c4accfac8597083e86b2187b10594ef4d8cf6a1de8794d8d2eb6f54:40656886 +op-geth-1 | INFO [03-10|13:10:06.890] Imported new potential chain segment number=40,656,886 hash=aed84e..eb6f54 blocks=1 txs=1 mgas=0.044 elapsed=15.280ms mgasps=2.865 snapdiffs=1.07MiB triediffs=1.68MiB triedirty=170.80KiB +op-geth-1 | INFO [03-10|13:10:06.892] Chain head was updated number=40,656,886 hash=aed84e..eb6f54 root=d8d7a6..3d26d7 elapsed="149.411µs" +op-node-1 | t=2025-03-10T13:10:06+0000 lvl=info msg="Inserted new L2 unsafe block (synchronous)" hash=0xaed84ef24c4accfac8597083e86b2187b10594ef4d8cf6a1de8794d8d2eb6f54 number=40656886 newpayload_time=19.937ms fcu2_time=2.276ms total_time=22.216ms mgas=0.043782 mgasps=1.9707239775153276 +op-node-1 | t=2025-03-10T13:10:06+0000 lvl=info msg="Sync progress" reason="new chain head block" l2_finalized=0x1d307d6750afe9164b8b5ce86a76afd94331db3e88aed28be17da33f0ce5f05f:40652313 l2_safe=0xf9186d586e797b9cdb5b08de180c27f2e58c04de15fdb28eb6afb2b5a4e1d55a:40656494 l2_pending_safe=0xf9186d586e797b9cdb5b08de180c27f2e58c04de15fdb28eb6afb2b5a4e1d55a:40656494 l2_unsafe=0xaed84ef24c4accfac8597083e86b2187b10594ef4d8cf6a1de8794d8d2eb6f54:40656886 l2_backup_unsafe=0x0000000000000000000000000000000000000000000000000000000000000000:0 l2_time=1741612206 +op-node-1 | t=2025-03-10T13:10:06+0000 lvl=info msg="successfully processed payload" ref=0xaed84ef24c4accfac8597083e86b2187b10594ef4d8cf6a1de8794d8d2eb6f54:40656886 txs=1 +op-node-1 | t=2025-03-10T13:10:07+0000 lvl=info msg="Received signed execution payload from p2p" id=0xb6911f4eff94a958702fba8def55dbb552323054c3aaeaa82f8a4866e685dee8:40656887 peer=16Uiu2HAm1SZBDSugT5MMu7vBY8auDgfZFNhoDeXPLc9Me5FsAxwT txs=2 +``` + +### Estimate remaining sync time + +[Install foundry](https://book.getfoundry.sh/getting-started/installation) and then run progress.sh to estimate remaining sync time and speed. + +```bash +./progress.sh +``` + +This will show the sync speed in blocks per minute and the time until sync is completed. + +```bash +Chain ID: 44787 +Sampling, please wait +Blocks per minute: ... +Hours until sync completed: ... +``` + +### Configure vald + +In order for `vald` to connect to your Ethereum node, your `rpc_addr` should be exposed in +vald's `config.toml` + +```bash +[[axelar_bridge_evm]] +name = "celo" +rpc_addr = "" +start-with-bridge = true +``` diff --git a/src/pages/validator/external-chains/centrifuge.mdx b/src/content/docs/validator/external-chains/centrifuge.mdx similarity index 81% rename from src/pages/validator/external-chains/centrifuge.mdx rename to src/content/docs/validator/external-chains/centrifuge.mdx index 1cc57f64c..a6d6cc265 100644 --- a/src/pages/validator/external-chains/centrifuge.mdx +++ b/src/content/docs/validator/external-chains/centrifuge.mdx @@ -1,38 +1,50 @@ # Centrifuge -import { Callout } from "../../../components/callout" +import { Callout } from "../../../../components/callout"; Set up your Centrifuge Mainnet or Testnet node. ## Prerequisites -- [Set up your Axelar validator](/validator/setup) +- [Set up your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: 2+ cores CPU, 4GB+ RAM, 200GB+ free storage space. - Recommended hardware: 4+ CPU cores, 16GB RAM, 1TB SSD or faster storage. - Check out [Centrifuge Releases](https://github.com/centrifuge/centrifuge-chain/releases) to identify the one for mainnet. - Docker OR [`rustup` is installed](https://rustup.rs/) ## Options + 1. Run with Docker 2. Run with binaries + + The CLI options in this doc are a reference that works for the Centrifuge + team, but feel free to play with the settings for your own setup using the + official docs: + https://docs.substrate.io/reference/command-line-tools/node-template/ The info + here has been derived from the official documentation, where you can find more + info and also all the options for logging and debugging: + https://docs.substrate.io/deploy/deployment-options/ + + ## 1. Run with Docker You can use the container published by Centrifuge on their [DockerHub repo](https://hub.docker.com/repository/docker/centrifugeio/centrifuge-chain/tags?page=1&ordering=last_updated) or be fully trustless by cloning the [cent-chain repository](https://github.com/centrifuge/centrifuge-chain/) -and using the [Dockerfile](https://github.com/centrifuge/centrifuge-chain/blob/main/Dockerfile) (2-4h build time on an average machine), +and using the [Dockerfile](https://github.com/centrifuge/centrifuge-chain/blob/main/docker/centrifuge-chain/Dockerfile) (2-4h build time on an average machine), in the latter make sure to checkout the specific commit for the latest release before building. -To find the latest release go to the [Centrifuge repository](https://github.com/centrifuge/centrifuge-chain/releases), +To find the latest release go to the [Centrifuge repository](https://github.com/centrifuge/centrifuge-chain/releases/latest), and look for the listed Docker Image. More images in the official [Docker Hub repository](https://hub.docker.com/repository/docker/centrifugeio/centrifuge-chain/tags?page=1&ordering=last_updated). -### Latest Image Info -Find below information on the latest and previous images that can be used with docker. - -* `v0.10.34`: `main-20231006174657-160318c7` -* `latest (November 22, 2023)`: `main-20231006174657-160318c7` + + Note: using the tag `latest` is always going to point to the latest release, + make sure that your system always pulls the image though or you'll end up with + your local cached version. For docker-compose this is achieved using the `pull + --policy always` option + ### Create docker compose file @@ -40,9 +52,26 @@ Create a `docker-compose.yml` file with the following contents. Change the `ports` based on your network setup. Replace `/mnt/my_volume/data` with the volume and/or data folder you want to use. + + From version 0.10.35 onwards, the Docker container uses an unprivileged user + to run the centrifuge-chain and thus it is possible it won't be able to access + the `/data` folder, to be sure either: - Make sure your data folder is owned + by the centrifuge user: `` ```bash chown -R 1000:1000 /mnt/my_volume/data ``` + - Run the container as root adding `user: root` to your service definition in + the docker-compose below (not recommended) + + + + From version 0.10.35 the relay chain DB folder has changed names from + `relay-chain` to `polkadot`. The container is prepared to handle this change + automatically but it is advised to check your /mnt/my_volume/data to see if + there are any extra folders after you upgrade from a previous version. For a + first time setup, ignore this message. + + -

    
    +
       ```Dockerfile
       version: '3'
       services:
    @@ -61,8 +90,6 @@ Replace `/mnt/my_volume/data` with the volume and/or data folder you want to use
           command:
           - "--port=30333"
           - "--rpc-port=9933"
    -      - "--ws-port=9944"
    -      - "--ws-external"
           - "--rpc-external"
           - "--rpc-cors=all"
           - "--pruning=archive"
    @@ -73,7 +100,6 @@ Replace `/mnt/my_volume/data` with the volume and/or data folder you want to use
           - "--execution=wasm"
           - "--wasm-execution=compiled"
           - "--ws-max-connections=5000"
    -      - "--bootnodes=/ip4/35.198.171.148/tcp/30333/ws/p2p/12D3KooWDXDwSdqi8wB1Vjjs5SVpAfk6neadvNTPAik5mQXqV7jF"
           - "--bootnodes=/ip4/34.159.117.205/tcp/30333/ws/p2p/12D3KooWMspZo4aMEXWBH4UXm3gfiVkeu1AE68Y2JDdVzU723QPc"
           - "--bootnodes=/dns4/node-7010781199623471104-0.p2p.onfinality.io/tcp/23564/ws/p2p/12D3KooWSN6VXWPvo1hoT5rb5hei5B7YdTWeUyDcc42oTPwLGF2p"
           - "--name=YOUR_NODE_NAME"
    @@ -83,11 +109,11 @@ Replace `/mnt/my_volume/data` with the volume and/or data folder you want to use
           - "--chain=polkadot"
           - "--sync=fast"
       ```
    -  
    + -
    
    +
       ```Dockerfile
       version: '3'
       services:
    @@ -104,9 +130,7 @@ Replace `/mnt/my_volume/data` with the volume and/or data folder you want to use
           command:
             - "--port=30333"
             - "--rpc-port=9933"
    -        - "--ws-port=9944"
             - "--unsafe-rpc-external"
    -        - "--unsafe-ws-external"
             - "--rpc-cors=all"
             - "--pruning=archive"
             - "--chain=/resources/demo-spec-raw.json"
    @@ -127,7 +151,7 @@ Replace `/mnt/my_volume/data` with the volume and/or data folder you want to use
             - "--chain=/resources/westend-alphanet-raw-specs.json"
             - "--sync=fast"
       ```
    -  
    +
    @@ -138,7 +162,9 @@ docker-compose pull --policy always && docker-compose up -d ``` ## 2. Get or build binaries + ### Prepare user and folder + ```bash adduser centrifuge_service --system --no-create-home mkdir /var/lib/centrifuge-data # Or use a folder location of you choosing. But replace the all occurences of `/var/lib/centrifuge-data` below accordingly @@ -146,9 +172,10 @@ chown -R centrifuge_service /var/lib/centrifuge-data ``` ### Getting the binary + -
    
    +   
              ```bash
              # This dependencies install is only for Debian Distros:
              sudo apt-get install cmake pkg-config libssl-dev git clang libclang-dev protobuf-compiler
    @@ -160,33 +187,36 @@ chown -R centrifuge_service /var/lib/centrifuge-data
              cargo build --release
              cp ./target/release/centrifuge-chain /var/lib/centrifuge-data
              ```
    -    
    +
    Use `latest` for testent, or a specific release tag for mainbet binaries. Keep in mind that the retrieved binary is build for Linux. -
    
    +  
             ```bash
             docker run --rm --name centrifuge-cp -d centrifugeio/centrifuge-chain:[INSERT_LATEST_RELEASE_HERE] --chain centrifuge
             docker cp centrifuge-cp:/usr/local/bin/centrifuge-chain /var/lib/centrifuge-data
             ```
    -    
    +
    ### Configure systemd + #### 1. Create systemd service file + We are now ready to start the node, but to ensure it is running in the background and auto-restarts in case of a server failure, we will set up a service file using systemd. Change the `ports` based on your network setup. - Note: It is important to leave the `--bootnodes $ADDR` in one line as otherwise the arguments are not parsed correctly. - Making it impossible for the chain to find peers as no bootnodes will be present + Note: It is important to leave the `--bootnodes $ADDR` in one line as + otherwise the arguments are not parsed correctly. Making it impossible for the + chain to find peers as no bootnodes will be present -
    
    +  
         ```bash
         sudo tee </dev/null /etc/systemd/system/centrifuge.service
         [Unit]
    @@ -204,9 +234,7 @@ Change the `ports` based on your network setup.
         KillSignal=SIGHUP
         ExecStart=/var/lib/centrifuge-data/centrifuge-chain --bootnodes=/ip4/35.198.171.148/tcp/30333/ws/p2p/12D3KooWDXDwSdqi8wB1Vjjs5SVpAfk6neadvNTPAik5mQXqV7jF --bootnodes=/ip4/34.159.117.205/tcp/30333/ws/p2p/12D3KooWMspZo4aMEXWBH4UXm3gfiVkeu1AE68Y2JDdVzU723QPc --bootnodes=/dns4/node-7010781199623471104-0.p2p.onfinality.io/tcp/23564/ws/p2p/12D3KooWSN6VXWPvo1hoT5rb5hei5B7YdTWeUyDcc42oTPwLGF2p \
             --port=30333 \
    -        --rpc-port=9933 \
    -        --ws-port=9944 \
    -        --ws-external \
    +        --rpc-port=9933
             --rpc-external \
             --rpc-cors=all \
             --pruning=archive \
    @@ -228,25 +256,26 @@ Change the `ports` based on your network setup.
         WantedBy=multi-user.target
         EOF
         ```
    -    
    + +
    You'll have to download the chain specs first: -
    
    +  
         ```bash
         curl -O https://github.com/centrifuge/centrifuge-chain/blob/main/res/westend-alphanet-raw-specs.json
         mv westend-alphanet-raw-specs.json /var/lib/centrifuge-data/moonbean-dev-relay.json
         curl -O https://github.com/centrifuge/centrifuge-chain/blob/main/res/demo-spec-raw.json
         mv demo-spec-raw.json /var/lib/centrifuge-data/centrifuge-demo-raw.json
         ```
    -    
    + Create systemd file now: -
    
    +  
         ```bash
         sudo tee </dev/null /etc/systemd/system/centrifuge.service
         [Unit]
    @@ -265,8 +294,6 @@ Change the `ports` based on your network setup.
         ExecStart=/var/lib/centrifuge-data/centrifuge-chain --bootnodes=/ip4/34.89.150.73/tcp/30333/p2p/12D3KooWHsA69Fb1HkdWrwrxY3cSga3wWyHnxuk5GeYtCh59XsWB --bootnodes=/ip4/35.198.144.90/tcp/30333/p2p/12D3KooWMJPzvEp5Jhea8eKsUDufBbAzGrn265GcaCmcnp3koPk4 --bootnodes=/ip4/35.198.98.253/tcp/30333/p2p/12D3KooWHzRutQHbQKWh3Z5BWoXGk5c3gxscxfG57N8fNV6XjVLz \
             --port=30333 \
             --rpc-port=9933 \
    -        --ws-port=9944 \
    -        --unsafe-ws-external \
             --unsafe-rpc-external \
             --rpc-cors=all \
             --pruning=archive \
    @@ -288,12 +315,13 @@ Change the `ports` based on your network setup.
         WantedBy=multi-user.target
         EOF
         ```
    -    
    + +
    - #### 2. Start the systemd service + Actually enable the previously generated service and start it. ```bash @@ -309,27 +337,31 @@ sudo systemctl status centrifuge.service sudo journalctl -u centrifuge.service -f ``` - ## Test your RPC connection Once your node is fully synced, you can run a cURL request to see the status of your node, use the port you configured in your `/etc/systemd/system/centrifuge.service` file above ```bash -curl -H "Content-Type: application/json" \ --d '{"id":1, "jsonrpc":"2.0", "method": "eth_syncing", "params":[]}' \ -localhost:9933 +curl -H "Content-Type: application/json" +localhost:9933/health ``` -Expected output if node is synced is `{"jsonrpc":"2.0","result":false,"id":1}` - +Expected output if node is synced is `{"peers":35,"isSyncing":false,"shouldHavePeers":true}` ## Optional: Using a snapshot instead of synching from scratch -* By downloading a snapshot from the Centrifuge Dev team: + + + Centrifuge currently does not maintain automated snapshots, if you need a + newer snapshot please reach out to the dev team + + +- By downloading a snapshot from the Centrifuge Dev team: - You get faster sync, your fullnode will be ready in within hours (time depends on how old the snapshot is) - You are trusting the Centrifuge's team snapshots and therefore is not as "trustless" or "decentralized" as synching from scratch Prerequisites: + - [Install Gcloud CLI](https://cloud.google.com/sdk/docs/install) - Install lz4. Ex: `sudo snap install lz4` @@ -351,7 +383,6 @@ DB data folders respectively. Use `$DATA_FOLDER_PATH` on your node config as `-- Remove the `chain` directory to sync ONLY the parachain from scratch but keep the relay DB (usually much bigger), this will remove a little bit of trust in the Centrifuge dev team by synching the parachain from scratch at least, which is what Axelar validators care about most in terms of data. - ## Configure `vald` In order for `vald` to connect to your local node, your `rpc_addr` should be exposed in @@ -378,7 +409,17 @@ start-with-bridge = true ## Troubleshooting + +### Upgrading from an older version + +If you are asked to update your node version run this checlist: + +- [ ] Make sure your CLI arguments look like this docs, there could have been changes for a new version +- [ ] It is a good practice to clone your `data` dir and setup a new node with the new version to make sure it runs, then either point to the new one or replace the old one with the exact same parameters +- [ ] Use the latest release, not the latest code from the main branch on the centrifuge-chain repo. + ### Error logs during syncing + During fast syncing it is expected to see the following error messages on the `[Relaychain]` side. ```bash @@ -396,20 +437,22 @@ INFO tokio-runtime-worker substrate: [Parachain] ⚙️ Syncing 469.4 bps, targ everything is working correctly. Once the chain is fully synced the errors logs will go away. ### Stalled Syncing + If the chain stops syncing, mostly due to the unavailable blocks then please restart your node. The reason is in most cases that the p2p-view of your node is bad at the moment. Resulting in your node dropping the peers and being unable to further sync. A restart helps in theses cases. Example logs will look like the following: + ```bash WARN tokio-runtime-worker sync: [Parachain] 💔 Error importing block 0x88591cb0cb4f66474b189a34abab560e335dc508cb8e7926343d6cf8db6840b7: consensus error: Import failed: Database ``` ### Changed bootnode or peer identities -It is common that bootnode change their p2p-identity leading to the following logs: + +It is common that bootnode change their p2p-identity leading to the following logs: ```bash WARN tokio-runtime-worker sc_network::service: [Relaychain] 💔 The bootnode you want to connect to at `/dns/polkadot-bootnode.polkadotters.com/tcp/30333/p2p/12D3KooWCgNAXvn3spYBeieVWeZ5V5jcMha5Qq1hLMtGTcFPk93Y` provided a different peer ID `12D3KooWPAVUgBaBk6n8SztLrMk8ESByncbAfRKUdxY1nygb9zG3` than the one you expect `12D3KooWCgNAXvn3spYBeieVWeZ5V5jcMha5Qq1hLMtGTcFPk93Y`. ``` These logs can be safely ignored. - diff --git a/src/pages/validator/external-chains/ethereum.mdx b/src/content/docs/validator/external-chains/ethereum.mdx similarity index 87% rename from src/pages/validator/external-chains/ethereum.mdx rename to src/content/docs/validator/external-chains/ethereum.mdx index 3089fa402..01893b2d3 100644 --- a/src/pages/validator/external-chains/ethereum.mdx +++ b/src/content/docs/validator/external-chains/ethereum.mdx @@ -1,24 +1,23 @@ # Ethereum -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Set up your Ethereum Mainnet or Goerli Testnet RPC node ## Prerequisites -- [Setup your Axelar validator](/validator/setup) +- [Setup your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: CPU with 2+ cores, 4GB RAM, 600GB+ free storage space. - MacOS or Ubuntu 18.04+ - [Official Documentation](https://ethereum.org/en/developers/docs/nodes-and-clients) - ## Steps + 1. Install execution client 2. Install consensus layer client 3. Configure systemd 4. Configure vald - ### Install Execution client Install an [execution client](https://ethereum.org/en/developers/docs/nodes-and-clients/#execution-clients) for Ethereum. @@ -64,11 +63,12 @@ wget https://github.com/eth-clients/eth2-networks/raw/master/shared/prater/genes After installation of `go-ethereum`, we are now ready to start the `geth` process but in order to ensure it is running in the background and auto-restarts in case of a server failure, we will setup a service file with systemd. - Replace `$USER` and path to `geth` in the config below. - For Goerli Testnet, add the `--goerli` flag to the `geth` command. + Replace `$USER` and path to `geth` in the config below. For Goerli Testnet, + add the `--goerli` flag to the `geth` command. Add the following to `/etc/systemd/system/geth.service` + ```yaml [Unit] Description=Ethereum Node @@ -105,20 +105,23 @@ sudo journalctl -u geth -f To verify if your node is in sync you can check the latest block from the [explorer](https://goerli.etherscan.io/). Compare it with what you have in `sudo journalctl -u geth -f` - ##### 4. Test RPC connection Alternatively, you can now also use the Geth JavaScript console and check status of your node by attaching to your newly created `geth.ipc`. Don't forget to replace `$USER` and `path`, depending on your server configuration. -
    geth attach ipc:/root/.ethereum/geth.ipc
    -eth.syncing
    + ```bash + geth attach ipc:/root/.ethereum/geth.ipc +eth.syncing +```
    -
    geth attach ipc:/root/.ethereum/goerli/geth.ipc
    -eth.syncing
    + ```bash + geth attach ipc:/root/.ethereum/goerli/geth.ipc +eth.syncing +```
    @@ -138,31 +141,21 @@ If you are testing it remotely, please replace `localhost` with the IP or URL of In order for `vald` to connect to your Ethereum node, your `rpc_addr` should be exposed in vald's `config.toml` - - Goerli testnet chain name is `ethereum-2` - - +Goerli testnet chain name is `ethereum-2` - ```bash - [[axelar_bridge_evm]] - name = "Ethereum" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` + ```bash [[axelar_bridge_evm]] name = "Ethereum" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` - ```bash - [[axelar_bridge_evm]] - name = "ethereum-2" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` + ```bash [[axelar_bridge_evm]] name = "ethereum-2" rpc_addr = + "http://IP:PORT" start-with-bridge = true +``` - ### Upgrade geth If new release of geth is out, you can update it via the following. diff --git a/src/pages/validator/external-chains/fantom.mdx b/src/content/docs/validator/external-chains/fantom.mdx similarity index 89% rename from src/pages/validator/external-chains/fantom.mdx rename to src/content/docs/validator/external-chains/fantom.mdx index 5b4a960ad..b215a46f9 100644 --- a/src/pages/validator/external-chains/fantom.mdx +++ b/src/content/docs/validator/external-chains/fantom.mdx @@ -1,12 +1,12 @@ # Fantom -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Set up your Fantom Mainnet or Testnet Opera node. ## Prerequisites -- [Setup your Axelar validator](/validator/setup) +- [Setup your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: 4 vCPU+, 16GB RAM, 1.5TB+ free storage space. - MacOS or Ubuntu 18.04+ - Build-essential packages @@ -57,7 +57,8 @@ wget https://download.fantom.network/mainnet-109331-pruned-mpt.g After installation of `go-opera`, we are now ready to start the process but in order to ensure it is running in the background and auto-restarts in case of a server failure, we will setup a service file with systemd. - Note: In the service file below you need to replace `$USER` and path to `opera`, depending on your system configuration. + Note: In the service file below you need to replace `$USER` and path to + `opera`, depending on your system configuration. ```bash @@ -69,7 +70,7 @@ After=network.target [Service] User=$USER Type=simple -ExecStart=/root/go-opera/build/opera --genesis /root/go-opera/build/mainnet-109331-pruned-mpt.g --identity --cache 8096 --http --http.addr 0.0.0.0 --http.corsdomain '*' --http.vhosts "*" --http.api "eth,net,web3" +ExecStart=/root/go-opera/build/opera --genesis /root/go-opera/build/mainnet-109331-pruned-mpt.g --identity --cache 8096 --http --http.addr 0.0.0.0 --http.corsdomain '*' --http.vhosts "*" --http.api "eth,net,web3" Restart=on-failure LimitNOFILE=65535 @@ -77,8 +78,11 @@ LimitNOFILE=65535 WantedBy=multi-user.target EOF ``` + - If you would like to run a node on the Testnet instead, you need to replace `--genesis /root/go-opera/build/testnet-6226-pruned-mpt.g` in the configuration above. + If you would like to run a node on the Testnet instead, you need to replace + `--genesis /root/go-opera/build/testnet-6226-pruned-mpt.g` in the + configuration above. ### 4. Enable and start the `fantom` service @@ -95,6 +99,7 @@ If everything was set-up correctly, your Fantom node should now be starting the sudo systemctl status fantom sudo journalctl -u fantom -f ``` + Your node will now start to synchronize with the network. It will take several hours before the node is fully synced. ## Test your Fantom RPC connection diff --git a/src/pages/validator/external-chains/filecoin.mdx b/src/content/docs/validator/external-chains/filecoin.mdx similarity index 84% rename from src/pages/validator/external-chains/filecoin.mdx rename to src/content/docs/validator/external-chains/filecoin.mdx index 63a92875a..87e6949e3 100644 --- a/src/pages/validator/external-chains/filecoin.mdx +++ b/src/content/docs/validator/external-chains/filecoin.mdx @@ -1,12 +1,12 @@ -# Filecoin +import { Callout } from "/src/components/callout"; -import { Callout } from "/src/components/callout" +# Filecoin Set up your Filecoin Mainnet or Testnet Hyperspace node. ## Prerequisites -- [Setup your Axelar validator](/validator/setup) +- [Setup your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: 8-core CPU and 32 GiB RAM. Models with support for Intel SHA Extensions (AMD Zen or Intel Ice Lake or newer) will significantly speed things up. - MacOS or Linux - Build-essential packages @@ -23,6 +23,7 @@ In order to build `lotus`, you first need to install all of the required depende You can view the official documentation for details on how to build lotus from source [here](https://lotus.filecoin.io/lotus/install/linux/#building-from-source). Instructions below are for Ubuntu. Install dependencies + ```bash sudo apt update sudo apt install mesa-opencl-icd ocl-icd-opencl-dev gcc git bzr jq pkg-config curl clang build-essential hwloc libhwloc-dev wget aria2 -y && sudo apt upgrade -y @@ -37,6 +38,7 @@ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh Install Golang You must compile the lotus daemon with the [required](https://lotus.filecoin.io/lotus/install/linux/#go) Go version. + ```bash wget -c https://golang.org/dl/go1.19.7.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc && source ~/.bashrc @@ -61,15 +63,19 @@ Checkout the correct release and build the daemon. -
    git checkout releases;
    +```bash
    +git checkout releases;
     make clean all;
    -sudo make install
    +sudo make install +```
    -
    git checkout v1.20.3-hyperspace-nv21-rpc-p01;
    +```bash
    +git checkout v1.20.3-hyperspace-nv21-rpc-p01;
     make clean hyperspacenet;
    -sudo make install
    +sudo make install +```
    @@ -82,11 +88,15 @@ Download the latest pruned snapshot. -
    aria2c -x5 https://snapshots.mainnet.filops.net/minimal/latest.zst
    +```bash +aria2c -x5 https://forest-archive.chainsafe.dev/latest/mainnet/ +```
    -
    aria2c -x5 https://snapshots.hyperspace.yoga/hyperspace-latest-pruned.car
    +```bash +aria2c -x5 https://forest-archive.chainsafe.dev/latest/calibnet/ +```
    @@ -94,14 +104,14 @@ Download the latest pruned snapshot. Import the snapshot ```bash -lotus daemon --import-snapshot path/to/snapshot.car --halt-after-import +lotus daemon --import-snapshot path/to/snapshot.car.zst --halt-after-import ``` Modify the lotus config file `~/.lotus/config.toml`. First, enable the Eth RPC needed by vald. Also set the P2P configuration to use a static port with your public IP. ```toml [Fevm] - # EnableEthRPC enables eth_ rpc, and enables storing a mapping of eth transaction hashes to filecoin message Cids. + # EnableEthRPC enables eth_rpc, and enables storing a mapping of eth transaction hashes to filecoin message Cids. # This will also enable the RealTimeFilterAPI and HistoricFilterAPI by default, but they can be disabled by config options above. # # type: bool @@ -116,6 +126,16 @@ Modify the lotus config file `~/.lotus/config.toml`. First, enable the Eth RPC n ConnMgrGrace = "20s" ``` + +Forest’s chain indexer is disabled by default, which causes EVM RPC methods like `eth_getTransactionReceipt` to return errors (`indexer disabled`). Vald relies on indexed receipts to see vote transactions. To enable: + + +```bash +export FOREST_CHAIN_INDEXER_ENABLED = true +``` + + + You also need to enable the `SplitStore` feature to reduce disk usage. You can read more on this [here](https://docs.filecoin.io/mine/lotus/splitstore/). `ColdStoreType` needs to be set to `messages` to allow querying FEVM transactions. @@ -161,7 +181,7 @@ Tail the logs to see if the daemon is syncing tail -F /var/log/lotus/daemon.log ``` -You should eventually (approx 5-10 minutes) see something like this in the logs: +You should eventually (approx 5-10 minutes) see syncing messages in the logs: ```logs {"level":"info","ts":"2023-03-30T01:29:02.455Z","logger":"chain","caller":"chain/sync.go:625","msg":"block validation","took":0.030020629,"height":"2301","age":6221912.455308664} @@ -216,22 +236,21 @@ Verify that the block number matches the latest block number on the explorer. In order for `vald` to connect to your Filecoin node, your `rpc_addr` should be exposed in vald's `config.toml` - - ```bash - [[axelar_bridge_evm]] - name = "filecoin" - rpc_addr = "http://localhost:1234/rpc/v1" - start-with-bridge = true - ``` + ```bash + [[axelar_bridge_evm]] + name = "filecoin" + rpc_addr = "http://localhost:1234/rpc/v1" + start-with-bridge = true + ``` - ```bash - [[axelar_bridge_evm]] - name = "filecoin" - rpc_addr = "http://localhost:1234/rpc/v1" - start-with-bridge = true - ``` + ```bash + [[axelar_bridge_evm]] + name = "filecoin" + rpc_addr = "http://localhost:1234/rpc/v1" + start-with-bridge = true + ``` diff --git a/src/content/docs/validator/external-chains/flow.mdx b/src/content/docs/validator/external-chains/flow.mdx new file mode 100644 index 000000000..f3eba9a69 --- /dev/null +++ b/src/content/docs/validator/external-chains/flow.mdx @@ -0,0 +1,640 @@ +# EVM on Flow + +import { Callout } from "/src/components/callout"; + +Node setup guide for Flow Testnet/Mainnet Axelar validator + +## EVM on Flow equivalence + +EVM on Flow integrates Ethereum's transaction execution core into Cadence's native transaction runtime and thus Flow's multi +node consensus. Access Nodes (AN) serve the Access API, the native entry point to Flow, accepting Cadence scripts or +transactions, into which signed transactions from the EVM Gateway are included. The EVM Gateway implements the Ethereum +JSON-RPC specification for web3.js clients. In the Flow context these two services together represent an Axelar validator. +Access Nodes, and by extension EVM Gateways, do not vote on the network - they are rpc-only node types. + +Operators can choose to run the Access Node and EVM Gateway separately or on the same logical host. Consider that +Access Nodes are optimized for high throughput script/transaction ingress for Flow clients. Node operators which choose +to make AN Access APIs public should use the recommended hardware requirements. If the validator's +sole purpose is to participate in the Axelar network, recommended hardware requirements may be excess to operational needs. +Operators may opt to run only EVM Gateway if using [public](https://www.flowdiver.io/node?sortField=node.organization) Access Nodes. + +## Prerequisites + +- Ubuntu (tested on 18.04 and 20.04) +- `sudo apt-get install wget liblz4-tool aria2 jq -y` +- [Official Documentation](https://developers.flow.com/networks/node-ops/access-onchain-data/access-nodes/access-node-setup) +- [Official Documentation](https://github.com/onflow/flow-evm-gateway/blob/main/README.md) +- Go +- Flow CLI (see below) + +## Steps + +The steps first walk through the process of setting up an access node and then setting up the EVM gateway node. + +### Access node setup +1. Generate access node information +2. Account creation +3. Stake the access node +4. Build access node binary +5. Download access node bootstrap files +6. Create access node service + +### EVM Gateway setup +7. Build EVM Gateway binary +8. Create EVM Gateway service +9. Start all services + +We recommend first time operators to complete the guidance for node setup below in full using testnet. + +## 1. Generate Node Information + +This is a one time operation that is required for each node. + +### Download the boot-tools utility +```bash +# get the boot-tools utility to generate node information +curl -sL -O storage.googleapis.com/flow-genesis-bootstrap/boot-tools.tar +# untar it +tar -xvf boot-tools.tar +# verify sha256sum: a06e3e9b2443c6755214150e9e101b70dd48ae30ffcfcbbcc471ba430cb104bf +sha256sum ./boot-tools/bootstrap +# create a directory +mkdir ./bootstrap +# Use a fully qualified domain name for YOUR_NODE_ADDRESS_GOES_HERE. Please also include the port number in the network address e.g. flowaccess.mycompany.com:3569 +./boot-tools/bootstrap key --address ":3569" --role access -o ./bootstrap +``` + + + The network address is the address that will be used by the other nodes in the network to talk to your node. + + Please ensure that the address (hostname:port) that you use is accessible from outside and there is no firewall rule blocking egress and **ingress** traffic for that address. + + +This will generate the node information which includes public and private staking keys, public and private networking key and the node ID. + +```bash +cat ./bootstrap/public-root-information/node-info.pub.[HASH].json +{ +"Role": "access", +"Address": "\u003cYOUR_NODE_ADDRESS\u003e:3569", +"NodeID": "c2b79d2d4384b30ac6db6ee284d0549bf3a19f6885232e4a20af438c49e15948", +"Weight": 0, +"NetworkPubKey": "f99ba93360c6daa3b044c5a474d915f9306d450ed3a996440c378cd9e37e37cd6d57c13f9417087af148f25a216ea7b239bcadb7ce4dd72f90ad26c9ea1db03a", +"StakingPubKey": "8b027c8afbb01d63e93ee40242ab2aad03f25800e3a3c01c3615520505ab23626c016d4e7525f3bebdfe301188275ec401b403f4825a1511d22b7bcdaa8b07936933c5cae3c9880a1bf218fa3a8c21b10023b667ac9d23809b7eaa152b059dfe" +} +``` + +```bash +cat ./bootstrap/private-root-information/private-node-info_[HASH]/node-info.priv.json + +{ + "Role": "access", + "Address": "\u003cYOUR_NODE_ADDRESS\u003e:3569", + "NodeID": "c2b79d2d4384b30ac6db6ee284d0549bf3a19f6885232e4a20af438c49e15948", + "NetworkPrivKey": "aba48858482ead4a1bdeee198b8948061fa80c9720b0107024ef7d5793dbc930", + "StakingPrivKey": "061d9bef99db63629ed28bb64ad0cc6b93418accc1a6c5e461dfcbdf087c2862" +} +``` +Please ensure you backup the bootstrap folder as it contains the node private keys. If they keys are lost, the node will not be able to run. + +For further information on this step see [official documentation](https://developers.flow.com/networks/node-ops/access-onchain-data/access-nodes/access-node-setup#step--1---generate-node-information). + +## 2. Account Creation + +Many operators will only require the first two steps below if aggregating operational costs across Flow into a single account is acceptable, or where only a +single logical host is being run for all services. Organizations who must separate operating costs between node types must include step (3) to create a +distinct account for the EVM Gateway. + +If you are only running the EVM Gateway and using public Access Nodes the first two account creation steps below are still required. In this case the account +will only be used for the EVM Gateway. + +### 1. Create Access Node operator account + +Accounts need to be created on Flow before they can be funded and used. Visit [Flow Port](https://port.flow.com) and +select `mainnet` or `testnet` in the dropdown and click 'Sign Up'. Flow Port will guide you through Flow Wallet download, +which once initialized will have created an account for you on the selected network. You should now be able to 'Sign in' +to Flow Port and can copy your account address from the wallet or Flow Port dashboard. + +Note: to enable Flow testnet network in Flow Wallet you will need to toggle
    Settings -> Developer Mode -> Enabled
    + +### 2. Fund Access Node operator account + + + + Use a supported [centralized exchange](https://flow.com/use-flow/flow-token#cex) to send FLOW to the account address you copied + + + Visit [Flow Faucet](https://faucet.flow.com/fund-account), enter the account address you copied then click 'Fund your Account' + + + +Check your account with the network directly using Flow CLI +```bash +# install Flow CLI +sh -ci "$(curl -fsSL https://raw.githubusercontent.com/onflow/flow-cli/master/install.sh)" +echo 'export PATH="$PATH:/root/.local/bin"' >> ~/.profile +source ~/.profile +``` + +Paste your account address and specify network +```bash +% flow accounts get 0x1844efeb3fef2542 -n testnet + +If you would like to fund the account with 1000 FLOW tokens for testing, visit https://testnet-faucet.onflow.org/fund-account?address=1844efeb3fef2542 + +Address 0x1844efeb3fef2542 +Balance 744.00060373 +Keys 2 + +Key 0 Public Key 3569d7acbc44cd61ffcca019820d4975e7c32bc0d0da38d3920e5ae7fac172bedc5905ddcf349e9ea6968bd7b1da33178c03dc45a73117d6b59c1fef79651cbe +Weight 1000 +Signature Algorithm ECDSA_secp256k1 +Hash Algorithm SHA2_256 +Revoked false +Sequence Number 7 +Index 0 +Contracts Deployed: 0 +``` + +### 3. Create EVM Gateway operator account \[Optional\] + +Use the existing operator account to create new accounts. + +```bash +flow keys generate +``` +It will generate an output like this. These keys are only output locally to the CLI and are used in the following step +```bash +🔴️ Store private key safely and don't share with anyone! +Private Key 5438b13e290b257f0c41e3b23fbf3b5f5f6d4e9b2d3797430d2d2d5484db9b37 +Public Key 9b85626369efe380ebd701f7189f2746fda26d09e1b63cb003bd84a5d33b662685c56427a0526a670efa88b0cb8da371cf9dc1de5ac6bbffb56e327a5c16e708 +Mnemonic sustain limb elbow awkward onion crouch truth trial until poverty famous feel +Derivation Path m/44'/539'/0'/0/0 +Signature Algorithm ECDSA_P256 +``` +Create EVM Gateway operator account + + + 1. Obtain wallet account private key from +
    Settings -> Account List -> Choose Main account -> Private Key -> [Password prompt]
    + + 2. Create flow.json, replacing `address` and `privateKey` values with those of your wallet account. Note `address` has no leading `0x` + + ```bash + flow init --config-only + cat flow.json | jq '.accounts += {"my-account-alias": {"address": "$YOUR_ADDRESS", "key": {"type": "hex", "index": 0, "signatureAlgorithm": "ECDSA_P256", "hashAlgorithm": "SHA2_256", "privateKey": "$YOUR_PK"}}}' > updated_flow.json ; mv updated_flow.json flow.json + ``` + 3. Create a new account using public key generated above + + ```bash + flow accounts create --key 9b85626369efe380ebd701f7189f2746fda26d09e1b63cb003bd84a5d33b662685c56427a0526a670efa88b0cb8da371cf9dc1de5ac6bbffb56e327a5c16e708 --signer my-account-alias -n testnet + + Transaction ID: efcacf408285100971f93053e28cf0d2fe0809213eb35c85d779c2fc2bca89c7 + + If you would like to fund the account with 1000 FLOW tokens for testing, visit https://testnet-faucet.onflow.org/fund-account?address=f3445838372e4e92 + + Address 0xf3445838372e4e92 + Balance 0.00100000 + Keys 1 + + Key 0 Public Key 9b85626369efe380ebd701f7189f2746fda26d09e1b63cb003bd84a5d33b662685c56427a0526a670efa88b0cb8da371cf9dc1de5ac6bbffb56e327a5c16e708 + Weight 1000 + Signature Algorithm ECDSA_P256 + Hash Algorithm SHA3_256 + Revoked false + Sequence Number 0 + Index 0 + + Contracts Deployed: 0 + ``` + 3. Send funds to this account from your wallet account +
    + + Visit https://faucet.flow.com and use the generated public key to create and fund your Flow account + +
    + +## 3. Stake the access node + +Access Nodes require a minimum 100 FLOW stake for each participating node to secure a slot on the network. Follow this +[guide](https://developers.flow.com/networks/node-ops/access-onchain-data/access-nodes/access-node-setup#step--2---stake-the-node) to stake using [Flow Port](https://port.flow.com). + + + Use the public key values previously generated by the bootstrap utility when staking your node + + When staking for the first time please select 'Upgrade Account' in Flow Port when requested + + +Once completed, your Flow Port 'Stake and Delegate' dashboard will display the new node registration stake in a pending +status. Note the banner which outlines when your staking action will be included in the next epoch. + +![flow-port-stake-pending.png](/images/ext-flow-port-stake-pending.png) + +Further information about staking on Flow can be found in the [Staking and Epochs](https://developers.flow.com/networks/staking#how-does-staking-work-on-flow) documentation. + +### Verify That Your Node ID Was Selected + +On Wednesday at around 12:00 UTC, the staking auction for the current epoch will end and five nodes from candidate list of nodes will be chosen at random by the staking contract for participation in the next epoch. +If all 5 slots have been taken from the previous epoch no new Access Nodes will be chosen + +You can verify whether your node was chosen in the Flow Port Staking Dashboard. The 'Staked Amount' for your node will equal the amount staked for that node ID once it has been selected. + +Using Flow CLI you can query the staking info for your node: + + + + ```bash + flow accounts staking-info your_account_address -n mainnet + ``` + + + ```bash + flow accounts staking-info your_account_address -n testnet + ``` + + + +Look for the 'Tokens Staked' field in the response of the above command to verify. + +### Restaking + +In the event that the epoch passes and the node you registered did not get picked your stake will be returned. You can re-stake the +node using the same staking procedure as above. + +## 4. Build access node binary + +Build the access node binary from the latest release tag. The access node source is available in the [onflow/flow-go](https://github.com/onflow/flow-go) repo. + +1. Install the prerequisites mentioned [here](https://github.com/onflow/flow-go?tab=readme-ov-file#installation) +2. Checkout the latest release tag mentioned [here](https://github.com/onflow/flow-go/releases/latest). +3. Build the access node binary by following this [step](https://github.com/onflow/flow-go?tab=readme-ov-file#building-a-binary-for-the-access-node) in the flow-go repo. (eg `make docker-native-build-access-binary`) + +Alternatively, you can also run the access node and the EVM gateway as a docker container. See [here](https://developers.flow.com/networks/node-ops/access-onchain-data/access-nodes/access-node-setup#step-4---start-your-node) for more details. + +## 5. Download access node bootstrap files + +After the access node has been successfully staked, it requires two pieces of information to startup. +1. An initialization file called the `root-protocol-state-snapshot.json` to initialize its local database. +2. A checkpoint of the execution state which contains the chain state (account balances, contracts etc.). The checkpoint consists of 18 files named as `root.checkpoint`, `root.checkpoint.000`, `root.checkpoint.001`...`root.checkpoint.016`. + +The `root-protocol-state-snapshot.json` and the checkpoint files are published by the Foundation to a GCP bucket. +Location of the bucket is available [here](https://github.com/onflow/flow/blob/master/sporks.json) under `rootProtocolStateSnapshot` and `rootCheckpointFile` for each of the past network upgrades. +For e.g. For mainnet25 the files are [here](https://github.com/onflow/flow/blob/master/sporks.json#L15-L16). + +The `transit` script which is part of the `boot-tools` utility downloaded earlier during [first step](#download-the-boot-tools-utility) can be used to download these files and place them in the right location. + +To download the files run when `testnet/mainnet-${version-label}` should be set to the latest version of testnet or mainnet, e.g. testnet-52, mainnet-26 etc. + +The role flag (`-r`) has to be `execution` to ensure the checkpoint files are placed in the correct location. + + + + ```bash + ./boot-tools/transit pull -b ./bootstrap -t mainnet-${version-label} -r execution --concurrency 10 --timeout 30m + ``` + + Example for network the upgrade mainnet-26 the command will be as follows, + + ```bash + ./boot-tools/transit pull -b ./bootstrap -t mainnet-26-execution -r execution --concurrency 10 --timeout 30m + ``` + + + ```bash + ./boot-tools/transit pull -b ./bootstrap -t testnet-${version-label} -r execution --concurrency 10 --timeout 30m + ``` + + Example for network upgrade testnet-52 the command will be as follows, + + ```bash + ./boot-tools/transit pull -b ./bootstrap -t testnet-52-execution -r execution --concurrency 10 --timeout 30m + ``` + + + +For more information on the steps to carry out after a network upgrade, please see [here](https://developers.flow.com/networks/node-ops/node-operation/spork). + + + If the node was already running on the previous network before the upgrade then please follow [these](https://developers.flow.com/networks/node-ops/node-operation/spork) steps to sync the node on the upgraded network. + + + + If you are joining the network on any epoch after the last network upgrade, then please see [here](https://developers.flow.com/networks/node-ops/access-onchain-data/access-nodes/access-node-configuration-options#option-2-enabling-indexing-mid-spork) for instructions on downloading the bootstrap files. + + +## 6. Create access node service + +Use `systemctl` to set up services for `access-node`. + +### Access Node + + + + ```bash + # Define the variables + NODE_ID=$(cat ./bootstrap/public-root-information/node-info.pub.* | jq -r .NodeID) + DYNAMIC_ACCESS_ADDRESS="secure.mainnet.nodes.onflow.org:9001" + DYNAMIC_ACCESS_PUBLICKEY="28a0d9edd0de3f15866dfe4aea1560c4504fe313fc6ca3f63a63e4f98d0e295144692a58ebe7f7894349198613f65b2d960abf99ec2625e247b1c78ba5bf2eae" + ``` + + + ```bash + # Define the variables + NODE_ID=$(cat ./bootstrap/public-root-information/node-info.pub.* | jq -r .NodeID) + DYNAMIC_ACCESS_ADDRESS="secure.testnet.nodes.onflow.org:9001" + DYNAMIC_ACCESS_PUBLICKEY="ba69f7d2e82b9edf25b103c195cd371cf0cc047ef8884a9bbe331e62982d46daeebf836f7445a2ac16741013b192959d8ad26998aff12f2adc67a99e1eb2988d" + ``` + + + +```bash +sudo tee </dev/null /etc/systemd/system/access-node.service +[Unit] +Description=Access Node daemon +After=network-online.target + +[Service] +User=$USER +ExecStart=/usr/bin/access-node \ +--nodeid=$NODE_ID \ +--bootstrapdir=$PWD/bootstrap \ +--datadir=$PWD/data/protocol \ +--secretsdir=$PWD/data/secrets \ +--execution-data-dir=$PWD/data/execution_data \ +--execution-state-checkpoint=$PWD/bootstrap/execution-state \ +--rpc-addr=0.0.0.0:9000 \ +--secure-rpc-addr=0.0.0.0:9001 \ +--http-addr=0.0.0.0:8000 \ +--rest-addr=0.0.0.0:8070 \ +--admin-addr=localhost:9002 \ +--bind=0.0.0.0:3569 \ +--dht-enabled=false \ +--grpc-compressor=gzip \ +--execution-state-dir= \ +--script-execution-mode=failover \ +--event-query-mode=failover \ +--tx-result-query-mode=failover \ +--register-cache-size=10000 \ +--state-stream-addr=0.0.0.0:9000 \ +--state-stream-response-limit=500.0 \ +--state-stream-heartbeat-interval=50 \ +--loglevel=error +Restart=always +RestartSec=3 +LimitNOFILE=4096 + +[Install] +WantedBy=multi-user.target +EOF + +cat /etc/systemd/system/access-node.service +sudo systemctl enable access-node +``` + +### Troubleshooting + +The following Access Node log message indicates that the node has not yet been selected for participation in the network. If your node is staked it will hopefully be selected at the next epoch. +[Check the staking status](#verify-that-your-node-id-was-selected) of your node. + +```bash +node identity not found in the identity list of the finalized state +``` + +Checking the sync status of your Access node +```bash +curl localhost:8080/metrics | grep consensus_compliance_sealed_height +``` + +Further details on Access Node setup can be found in the [Access Node setup](https://developers.flow.com/networks/node-ops/access-onchain-data/access-nodes/access-node-setup#how-to-run-a-permissionless-access-node) documentation. + +## 7. Build EVM Gateway binary + +Similar to the access node, build the EVM gateway binary from the latest release tag. The EVM gateway source is available in the [onflow/flow-go](https://github.com/onflow/flow-evm-gateway) repo. +```bash +git clone https://github.com/onflow/flow-evm-gateway.git +cd flow-evm-gateway +git checkout +make build +mv flow-evm-gateway /usr/bin/ +``` + +Further details on EVM Gateway building and configuration can be found in the EVM Gateway node ops [docs](https://developers.flow.com/networks/node-ops/access-onchain-data/evm-gateway/evm-gateway-setup). + +### Enable EVM address for Flow operator account + +The Flow operator account must initialize its COA address in EVM which is then configured as the EVM Gateway $COINBASE address. The guidance provided for wallet account below +is a GUI driven version of the CLI transaction. CLI guidance can be used on any account and network. + + + +* Click top left burger icon to show current profile +* Click 'Enable the path to EVM on Flow' button +* Your EVM account will now be available to use in the left nav account view + + +```bash +curl -sL https://raw.githubusercontent.com/onflow/flow-evm-bridge/refs/heads/main/cadence/transactions/evm/create_account.cdc > create_evm_account.cdc + +flow transactions send ./create_evm_account.cdc --args-json '[{"type": "UFix64", "value": "${AMOUNT}"}]' -n testnet +``` + +Select the network and update the amount of FLOW in the JSON arguments to send to the COA EVM account. This step requires a configured `flow.json` to run successfully, see [account creation step 3](#2-account-creation) + + + +EVM operator address and private key is configured for `--coa-address` & `--coa-key` EVM Gateway flags below. If running multiple EVM Gateway hosts it is standard to share the same COA address and key for all. + + + + ```bash + ACCESS_NODE_GRPC_HOST="${YOUR_NODE_ADDRESS}:9000" + ACCESS_NODE_SPORK_HOSTS="access-001.mainnet25.nodes.onflow.org:9000" + FLOW_NETWORK_ID="flow-mainnet" + INIT_CADENCE_HEIGHT="85981135" + COINBASE="${LINKED_EVM_ADDRESS_WITHOUT_0x}" + COA_ADDRESS="${FLOW_OPERATOR_ACCOUNT_ADDRESS}" + COA_KEY="${FLOW_OPERATOR_ACCOUNT_PRIVATE_KEY}" + GAS_PRICE="100" + ``` + + + ```bash + ACCESS_NODE_GRPC_HOST="${YOUR_NODE_ADDRESS}:9000" + ACCESS_NODE_SPORK_HOSTS="access-001.devnet51.nodes.onflow.org:9000" + FLOW_NETWORK_ID="flow-testnet" + INIT_CADENCE_HEIGHT="211176670" + COINBASE="${LINKED_EVM_ADDRESS_WITHOUT_0x}" + COA_ADDRESS="${FLOW_OPERATOR_ACCOUNT_ADDRESS}" + COA_KEY="${FLOW_OPERATOR_ACCOUNT_PRIVATE_KEY}" + GAS_PRICE="100" + ``` + + + +## 8. Create EVM Gateway service + +```bash +sudo tee </dev/null /etc/systemd/system/gateway.service +[Unit] +Description=Gateway daemon +After=network-online.target + +[Service] +User=$USER +ExecStart=/usr/bin/flow-evm-gateway run \ +--access-node-grpc-host=$ACCESS_NODE_GRPC_HOST \ +--access-node-spork-hosts=$ACCESS_NODE_SPORK_HOSTS \ +--flow-network-id=$FLOW_NETWORK_ID \ +--init-cadence-height=$INIT_CADENCE_HEIGHT \ +--ws-enabled=true \ +--coinbase=$COINBASE \ +--coa-address=$COA_ADDRESS \ +--coa-key=$COA_KEY \ +--rate-limit=9999999 \ +--rpc-host=0.0.0.0 \ +--gas-price=$GAS_PRICE +--tx-state-validation=local-index +Restart=always +RestartSec=3 +LimitNOFILE=4096 + +[Install] +WantedBy=multi-user.target +EOF + +cat /etc/systemd/system/gateway.service +sudo systemctl enable gateway +``` + +### Other configuration flags + +When running Access Node and EVM Gateway on the same logical host you must configure `--state-stream-addr` to use the same address/port combination which is +set for Access Node `--rpc-addr`. This is required by the GW to allow querying both the streaming and non-streaming APIs using the same connection. + +The appropriate block height to set for `—init-cadence-height` is the starting block of the current [spork version](https://github.com/onflow/flow/blob/master/sporks.json) being run for that network. + +### Troubleshooting + +State stream configuration + +The following log entries may occur when `--state-stream-addr` and `--rpc-port` are not set to the same values when running services locally +```bash +failure in event subscription at height ${INIT-CADENCE-HEIGHT}, with: recoverable: disconnected: error receiving event: rpc error: code = Unimplemented desc = unknown service flow.executiondata.ExecutionDataAPI” +``` +```bash +component execution data indexer initialization failed: could not verify checkpoint file: could not find expected root hash e6d4f4c755666c21d7456441b4d33d3521e5e030b3eae391295577e9130fd715 in checkpoint file which contains: [e10d3c53608a1f195b7969fbc06763285281f64595be491630a1e1bdfbe69161] +``` + +Access Node not fully synced + +The following log entry will occur when the EVM Gateway attempts to sync with the Access Node but it has not yet synced up to latest block +```bash +failure in event subscription at height ${INIT-CADENCE-HEIGHT}, with: recoverable: disconnected: error receiving event: rpc error: code = FailedPrecondition desc = could not get start height: failed to get lowest indexed height: index not initialized +``` + +## 9. Start all services + +Order of operations: + +1. `access-node`: ensure it's fully synced in terms of block height before proceeding. + - Query to Flow block height through Flow CLI + ```bash + flow blocks get latest -n mainnet + ``` + - Check block height on Flow [block explorer](https://www.flowscan.io/) or [testnet](https://testnet.flowscan.io/) +2. `gateway` + +```bash +sudo systemctl daemon-reload +sudo systemctl restart access-node +sudo systemctl restart gateway +``` + +Verify local Access Node has synced to latest block +```bash +flow blocks get latest --host localhost:9000 +``` + +For gateway + +```bash +curl -s -XPOST 'localhost:8545' --header 'Content-Type: application/json' --data-raw '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' | jq +``` +Verify block height compared to EVM [block explorer](https://evm.flowscan.io/) or [testnet](https://evm-testnet.flowscan.io/) + +### Check logs + +```bash +# change log settings to persistent if not already +sed -i 's/#Storage=auto/Storage=persistent/g' /etc/systemd/journald.conf +sudo systemctl restart systemd-journald + +journalctl -u access-node.service -f -n 100 +journalctl -u gateway.service -f -n 100 +``` +Logs should look like this which means EVM Gateway is indexing the Access Node data +```bash +{"level":"info","component":"ingestion","cadence-height":211179523,"cadence-event-length":1,"time":"2024-09-07T15:35:08Z","message":"received new cadence evm events"} +{"level":"info","component":"ingestion","hash":"0xa3e86dbe8a454d7f84908fc3af5ea3e335f4ab33bce8127f43243eb987505020","evm-height":2853,"cadence-height":211179523,"cadence-id":"872cda9894505a8357daa493d45fa99d2632b8a36a556e013df01506c5f893da","parent-hash":"0xa9b37ac67550b5b96490270b49b78fca35ff701b92bf37a6b7f6193050681bf4","tx-hashes-root":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","time":"2024-09-07T15:35:08Z","message":"new evm block executed event"} +{"level":"info","component":"ingestion","cadence-height":211179524,"cadence-event-length":1,"time":"2024-09-07T15:35:08Z","message":"received new cadence evm events"} +{"level":"info","component":"ingestion","hash":"0x0c7706407fd79496a845c2a337ecbf551fb670ba5ff864e42d94b6897d71474b","evm-height":2854,"cadence-height":211179524,"cadence-id":"5bd1d53fe3e3125d980dee8d9a75b8998d64d1710acacc1f4df0ad52ab4140f6","parent-hash":"0xa3e86dbe8a454d7f84908fc3af5ea3e335f4ab33bce8127f43243eb987505020","tx-hashes-root":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","time":"2024-09-07T15:35:08Z","message":"new evm block executed event"} +{"level":"info","component":"ingestion","cadence-height":211179525,"cadence-event-length":1,"time":"2024-09-07T15:35:08Z","message":"received new cadence evm events"} +{"level":"info","component":"ingestion","hash":"0x42d7665cc17c04170eb77e2b14f7adbfbf30a5ac65d5b36a98a2857798a7a33f","evm-height":2855,"cadence-height":211179525,"cadence-id":"df6a5ddbd669f56c44dc1f4c6701e00c323eedc6a6cd0a14593aeeed9000ea25","parent-hash":"0x0c7706407fd79496a845c2a337ecbf551fb670ba5ff864e42d94b6897d71474b","tx-hashes-root":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","time":"2024-09-07T15:35:08Z","message":"new evm block executed event"} +{"level":"info","component":"ingestion","cadence-height":211179526,"cadence-event-length":1,"time":"2024-09-07T15:35:08Z","message":"received new cadence evm events"} +{"level":"info","component":"ingestion","hash":"0x7e248dd506b721faeece565382d1f310665c2faa5a0882b49f039b73eddb0b34","evm-height":2856,"cadence-height":211179526,"cadence-id":"d34dc88006ebd8ce3e82af11d9668f864c7a9a274e4583c392fe367fc210294c","parent-hash":"0x42d7665cc17c04170eb77e2b14f7adbfbf30a5ac65d5b36a98a2857798a7a33f","tx-hashes-root":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","time":"2024-09-07T15:35:08Z","message":"new evm block executed event"} +{"level":"info","component":"ingestion","cadence-height":211179527,"cadence-event-length":1,"time":"2024-09-07T15:35:08Z","message":"received new cadence evm events"} +{"level":"info","component":"ingestion","hash":"0x133702b182bdff543bfccd0bf380b28a6b4a9de2c1d2123b14601b522bd49a33","evm-height":2857,"cadence-height":211179527,"cadence-id":"e886a98d565f11119f6f38950145c7c86ebf438dbd6c296d88bfac8d72857ccc","parent-hash":"0x7e248dd506b721faeece565382d1f310665c2faa5a0882b49f039b73eddb0b34","tx-hashes-root":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","time":"2024-09-07T15:35:08Z","message":"new evm block executed event"} +``` + + +## Ampd + +Once your node is up and running, you need to add the `Flow` blockchain to your [ampd daemon's](https://github.com/axelarnetwork/axelar-amplifier/tree/main/ampd) `config.toml`file. This can be done by adding in the following configuration: + + + + ```toml + [[handlers]] + type= "EvmMsgVerifier" + chain_finalization= "RPCFinalizedBlock" + chain_name= "flow" + chain_rpc_url= "your_own_rpc" + cosmwasm_contract= "axelar1kkqdsqvwq9a7p9fj0w89wpx2m2t0vrxl782aslhq0kdw2xxd2aesv3un04" + + [[handlers]] + type= "EvmVerifierSetVerifier" + chain_finalization= "RPCFinalizedBlock" + chain_name= "flow" + chain_rpc_url= "your_own_rpc" + cosmwasm_contract= "axelar1kkqdsqvwq9a7p9fj0w89wpx2m2t0vrxl782aslhq0kdw2xxd2aesv3un04" + + [[handlers]] + type = 'MultisigSigner' + chain_name = 'flow' + cosmwasm_contract = 'axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5' + ``` + + + ```toml + [[handlers]] + type= "EvmMsgVerifier" + chain_finalization= "RPCFinalizedBlock" + chain_name= "flow" + chain_rpc_url= "your_own_rpc" + cosmwasm_contract= "axelar1kkqdsqvwq9a7p9fj0w89wpx2m2t0vrxl782aslhq0kdw2xxd2aesv3un04" + + [[handlers]] + type= "EvmVerifierSetVerifier" + chain_finalization= "RPCFinalizedBlock" + chain_name= "flow" + chain_rpc_url= "your_own_rpc" + cosmwasm_contract= "axelar1kkqdsqvwq9a7p9fj0w89wpx2m2t0vrxl782aslhq0kdw2xxd2aesv3un04" + + [[handlers]] + type="MultisigSigner" + chain_name="flow" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + + ``` + + diff --git a/src/content/docs/validator/external-chains/fraxtal.mdx b/src/content/docs/validator/external-chains/fraxtal.mdx new file mode 100644 index 000000000..d15cd63ce --- /dev/null +++ b/src/content/docs/validator/external-chains/fraxtal.mdx @@ -0,0 +1,224 @@ +# Fraxtal + +Instructions to set up your frax node. + +## Requirements + +- [Setup your Axelar validator](/validator/setup/overview/) +- Minimum hardware requirements: 8 AWS vCPU+, 8GB RAM, 512GB of SSD free storage space. +- MacOS or Ubuntu 22.04 (tested on 22.04) +- [Official Documentation](https://github.com/FraxFinance/fraxtal-node) +- [Official Documentation](https://docs.frax.finance) + +## Prerequisites + +- [Common Docker Compose Commands](/validator/external-chains/optimism/#common-node-operations) + +```bash +sudo apt-get install jq -y +snap install docker +``` + +## Clone Repo + +```bash +git clone https://github.com/FraxFinance/fraxtal-node.git +cd fraxtal-node +``` + +## Set Environment Variables + +Note: Update your shell profile in accordance with the shell you are using + + + + ```bash echo export ENVIRONMENT=mainnet >> $HOME/.profile echo export + DOCKER_COMPOSE_FILE_LOCATION=$HOME/fraxtal-node/docker-compose.yml >> + $HOME/.profile +``` + + + ```bash echo export ENVIRONMENT=testnet >> $HOME/.profile echo export + DOCKER_COMPOSE_FILE_LOCATION=$HOME/fraxtal-node/testnet.docker-compose.yml + >> $HOME/.profile +``` + + + +Apply your changes + +```bash +source $HOME/.profile +``` + +## Set node config + + + + ```bash + cp .env.SAMPLE .env +``` + + + + ```bash + cp .env.testnet.SAMPLE .env.testnet +``` + + + + +Set the following config options in `fraxtal-node/.env.testnet` or `fraxtal-node/.env`: + +```bash +# Your Ethereum RPC node endpoint. As an L2, your Frax node will verify tx finality by +# querying your own Ethereum RPC node. +OP_NODE_L1_ETH_RPC= +``` + +## Start the node + +```bash +docker compose -f $DOCKER_COMPOSE_FILE_LOCATION up -d +``` + +This should show an output like this: + +```bash +[+] Running 3/3 + ✔ mainnet-node 2 layers [⣿⣿] 0B/0B Pulled 3.0s + ✔ 619be1103602 Pull complete 0.4s + ✔ b1167d0af7e0 Pull complete 1.7s +[+] Running 3/3 + ✔ Network fraxtal-node_default Created 0.1s + ✔ Container fraxtal-node-mainnet-geth-1 Healthy 10.9s + ✔ Container fraxtal-node-mainnet-node-1 Started 11.2s +``` + +After it is done, verify by listing the services and their status + +```bash +docker compose -f $DOCKER_COMPOSE_FILE_LOCATION ps +``` + +You should see these 2 services running + +```bash +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +fraxtal-node-testnet-geth-1 us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101305.1 "geth-entrypoint" testnet-geth 24 minutes ago Up 24 minutes (healthy) 30303/tcp, 30303/udp, 0.0.0.0:8548->8545/tcp, :::8548->8545/tcp, 0.0.0.0:8549->8546/tcp, :::8549->8546/tcp +fraxtal-node-testnet-node-1 public.ecr.aws/d7v3u3t4/fraxchain-testnet-optimism/op-node:a371733ab8b8ca288829e94734fbcdf88907e7c3 "node-entrypoint" testnet-node 24 minutes ago Up 24 minutes (healthy) 0.0.0.0:9222->9222/tcp, 0.0.0.0:9222->9222/udp, :::9222->9222/tcp, :::9222->9222/udp, 0.0.0.0:7545->8545/tcp, :::7545->8545/tcp +``` + +## Check logs + +#### Verify OP geth logs + +```bash +docker compose -f $DOCKER_COMPOSE_FILE_LOCATION logs $ENVIRONMENT-geth --since 2m -f +``` + +```bash +fraxtal-node-testnet-geth-1 | INFO [02-04|07:42:29.722] Chain head was updated number=39537 hash=26c5c6..e67efa root=14a631..1e99bf elapsed=5.40331ms age=2mo2w6d +fraxtal-node-testnet-geth-1 | INFO [02-04|07:42:29.734] Starting work on payload id=0x95a98a726f1398ee +fraxtal-node-testnet-geth-1 | INFO [02-04|07:42:29.751] Imported new potential chain segment number=39538 hash=219454..97cd30 blocks=1 txs=1 mgas=0.051 elapsed=16.713ms mgasps=3.022 age=2mo2w6d triedirty=0.00B +``` + +#### Verify OP node logs + +```bash +docker compose -f $DOCKER_COMPOSE_FILE_LOCATION logs $ENVIRONMENT-node --since 2m -f +``` + +You should see logs like + +```bash +fraxtal-node-testnet-node-1 | t=2024-02-04T07:41:42+0000 lvl=info msg="Sync progress" reason="processed safe block derived from L1" l2_finalized=0xd878b889605ac928844c12371b381d80a088fce5ae91cc4f25b913c7eb5bddaf:38833 l2_safe=0x9575d501f128d1fcd40229e6a3bc8d21d1f94667e2a81a5b01941d7ac2b11de1:38929 l2_safe_pending=0x9575d501f128d1fcd40229e6a3bc8d21d1f94667e2a81a5b01941d7ac2b11de1:38929 l2_unsafe=0x9575d501f128d1fcd40229e6a3bc8d21d1f94667e2a81a5b01941d7ac2b11de1:38929 l2_engineSyncTarget=0x9575d501f128d1fcd40229e6a3bc8d21d1f94667e2a81a5b01941d7ac2b11de1:38929 l2_time=1,700,075,234 l1_derived=0xfe9d9478267c3908ff1f59bfbebde3805b90c78015c672a72e1707b006a7bcc5:324630 +fraxtal-node-testnet-node-1 | t=2024-02-04T07:41:42+0000 lvl=info msg="Found next batch" batch_type=SingularBatch batch_timestamp=1,700,075,236 parent_hash=0x9575d501f128d1fcd40229e6a3bc8d21d1f94667e2a81a5b01941d7ac2b11de1 batch_epoch=0x18798cd2aec043a8fb1e8d1cf3fd76eb1ae146e9dc10c04de37051eb6bd01bd3:324624 txs=0 +fraxtal-node-testnet-node-1 | t=2024-02-04T07:41:42+0000 lvl=info msg="generated attributes in payload queue" txs=1 timestamp=1,700,075,236 +fraxtal-node-testnet-node-1 | t=2024-02-04T07:41:42+0000 lvl=info msg="Received signed execution payload from p2p" id=0x9ee568dd726943cb819f1baa231bb7e870d40e12e7f699189dab492ef5fdc4ea:3517563 peer=16Uiu2HAkyvyfKpDjZd8FasvbQ3SALrvYy5AJZKF4SeTd4xYEVWeg +fraxtal-node-testnet-node-1 | t=2024-02-04T07:41:42+0000 lvl=info msg="inserted block" hash=0xba734087a84f209a1c45585578bb10ac4dfa85af0eb147a2c7249eb9f4a7d63d number=38930 state_root=0x475ea2621418e01da0e350c51c20b388aad7f0307673adb35d66947693949050 timestamp=1,700,075,236 parent=0x9575d501f128d1fcd40229e6a3bc8d21d1f94667e2a81a5b01941d7ac2b11de1 prev_randao=0x01317c6e3c9c717e8819927f2c33eb83505d4d72ac627fb6883cc042573be0ed fee_recipient=0x4200000000000000000000000000000000000011 txs=1 update_safe=true +fraxtal-node-testnet-node-1 | t=2024-02-04T07:41:42+0000 lvl=info msg="Sync progress" reason="processed safe block derived from L1" l2_finalized=0xd878b889605ac928844c12371b381d80a088fce5ae91cc4f25b913c7eb5bddaf:38833 l2_safe=0xba734087a84f209a1c45585578bb10ac4dfa85af0eb147a2c7249eb9f4a7d63d:38930 l2_safe_pending=0xba734087a84f209a1c45585578bb10ac4dfa85af0eb147a2c7249eb9f4a7d63d:38930 l2_unsafe=0xba734087a84f209a1c45585578bb10ac4dfa85af0eb147a2c7249eb9f4a7d63d:38930 l2_engineSyncTarget=0xba734087a84f209a1c45585578bb10ac4dfa85af0eb147a2c7249eb9f4a7d63d:38930 l2_time=1,700,075,236 l1_derived=0xfe9d9478267c3908ff1f59bfbebde3805b90c78015c672a72e1707b006a7bcc5:324630 +fraxtal-node-testnet-node-1 | t=2024-02-04T07:41:42+0000 lvl=info msg="Advancing bq origin" origin=0x356f2620c66268c1e21dce36067271b894ce8cf3cfabbe205b42b7d5116f35f1:324631 originBehind=false +fraxtal-node-testnet-node-1 | t=2024-02-04T07:41:42+0000 lvl=warn msg="tx in inbox with unauthorized submitter" origin=0x356f2620c66268c1e21dce36067271b894ce8cf3cfabbe205b42b7d5116f35f1:324631 index=0 txHash=0xfc516bf5107835f384f2589f372498be041415aa75132378a222f06a6b5981fb err=nil +fraxtal-node-testnet-node-1 | t=2024-02-04T07:41:42+0000 lvl=warn msg="tx in inbox with unauthorized submitter" origin=0x356f2620c66268c1e21dce36067271b894ce8cf3cfabbe205b42b7d5116f35f1:324631 index=1 txHash=0x71a9a9d2c5ae121b1121d6a2d2c4f4b3dfe3b864c37e49690b89454f2a41ae3b err=nil +``` + +## Verify node sync status + +### RPC Endpoint + +```bash +echo "$(curl -4 ifconfig.co):8545" +``` + +#### Method: + +Check your op node status at port 7545 by + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"optimism_syncStatus","params":[],"id":1}' [rpc] | jq +``` + +If you get something like this in response to the above rpc call, your node is setup correctly + +```bash +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "current_l1": { + "hash": "0x24f7d66e8c80d0c6a598e9206ba1abc81264c1cc68afc14d8eca3f04fa81f921", + "number": 323360, + "parentHash": "0x99ce84a2d455425f0c3a68b2b83a74301810fc8c726cba384b08d9a79d9381d1", + "timestamp": 1700059308 + }, +.......... +.......... + "engine_sync_target": { + "hash": "0x7b7ed381aac9cec2a43b37c30779832cb8a82e044e38b4ada0f1c90719bd3d50", + "number": 30955, + "parentHash": "0x882503037e902b2476e1d4c308a895cc3b936c5ee19b45361dc26c9631d29ae0", + "timestamp": 1700059286, + "l1origin": { + "hash": "0x49ee7a7398bc5010b48de111fc0ebc99d63d38ac8233202c913646d901e15213", + "number": 323353 + }, + "sequenceNumber": 2 + } + } +} +``` + +You can compare the block height on your node with explorer ([mainnet](https://fraxscan.com) or [testnet](https://holesky.fraxscan.com)), +use your RPC node only when it has caught up with the latest block height. + +#### Sync Status of Frax optimism Execution Node + +You can check your status by connecting to geth console + +```bash +docker exec -it fraxtal-node-$ENVIRONMENT-geth-1 geth attach http://localhost:8545 +> eth.blockNumber +94078 # it will show you the latest block - number here is just an example + +> eth.syncing +false +``` + +## Configure vald + +In order for `vald` to connect to your Fraxtal node, your `rpc_addr` should be exposed in +vald's `config.toml` + + + + ```bash [[axelar_bridge_evm]] name = "fraxtal" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + + + ```bash [[axelar_bridge_evm]] name = "fraxtal" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + + diff --git a/src/content/docs/validator/external-chains/hedera.mdx b/src/content/docs/validator/external-chains/hedera.mdx new file mode 100644 index 000000000..7ed9e69dc --- /dev/null +++ b/src/content/docs/validator/external-chains/hedera.mdx @@ -0,0 +1,234 @@ +# Hedera + +import { Callout } from "/src/components/callout"; + +Instructions to set up your Hedera mirror node and RPC-relay. + +### Requirements + +- [Setup your Axelar verifier](/validator/amplifier/verifier-onboarding/) +- Minimum hardware requirements: CPUs: 4 cores RAM: 16 GB Storage (SSD): 500 GB +- Ubuntu 20.04 LTS or later +- NPM (installing via [`nvm`](https://github.com/nvm-sh/nvm) is recommended) +- Redis (used for caching) +- [Docker](https://docs.docker.com/engine/install/) (>= v20.10.x) installed on your machine. +- An Amazon Web Services account/Google Cloud Platform account. + +### Prerequisites + +```bash +sudo apt update +sudo apt install build-essential gcc g++ redis +``` + +### Clone Hedera Mirror Node Repository + +- [Official Documentation](https://docs.hedera.com/hedera/core-concepts/mirror-nodes/run-your-own-beta-mirror-node) + +Open your terminal and run the following commands + +```bash +git clone https://github.com/hiero-ledger/hiero-mirror-node +cd hiero-mirror-node +``` + +### Configure Mirror Node + +The `application.yml` file is the main configuration file for the Hedera Mirror Node. We'll update that file with GCP/AWS Secret and Access keys and the type of Hedera Network we want to mirror. + +For more information about the configuration for the Cloud related credentials, please refer to this documentation for [AWS](https://docs.hedera.com/hedera/core-concepts/mirror-nodes/run-your-own-beta-mirror-node/run-your-own-mirror-node-s3) and for [GCS](https://docs.hedera.com/hedera/core-concepts/mirror-nodes/run-your-own-beta-mirror-node/run-your-own-mirror-node-gcs). + +```application.toml +hedera: + mirror: + importer: + downloader: + accessKey: Enter access key from your GCP/AWS account + cloudProvider: "GCP/s3" #Choose GCP for google or s3 for AWS + secretKey: Enter secret key from your GCP/AWS account + gcpProjectId: ENTER GCP PROJECT ID HERE / N/A for AWS + network: PREVIEWNET/TESTNET/MAINNET #Pick one network +``` + +### Run Your Mirror Node + +```bash +docker compose up -d +``` + +### Check Logs + +Logs should appear like this + +```bash +importer-1 | 2024-09-05T14:10:43.832Z INFO pool-8-thread-2 c.h.m.i.p.b.BatchInserter Copied 1 rows to transaction table in 388.7 μs +importer-1 | 2024-09-05T14:10:43.833Z INFO pool-8-thread-2 c.h.m.i.p.r.e.s.SqlEntityListener Completed batch inserts in 11.59 ms +importer-1 | 2024-09-05T14:10:43.833Z INFO pool-8-thread-2 c.h.m.i.p.r.RecordFileParser Successfully processed 1 items from 2019-10-11T16_39_21.323930Z.rcd in 11.69 ms +importer-1 | 2024-09-05T14:10:43.948Z INFO pool-8-thread-2 c.h.m.i.p.b.BatchInserter Copied 7 rows to crypto_transfer table in 664.4 μs +importer-1 | 2024-09-05T14:10:43.957Z INFO pool-8-thread-2 c.h.m.i.p.b.BatchInserter Copied 3 rows to entity_temp table in 8.886 ms +importer-1 | 2024-09-05T14:10:43.958Z INFO pool-8-thread-2 c.h.m.i.p.b.BatchInserter Copied 1 rows to record_file table in 483.7 μs +importer-1 | 2024-09-05T14:10:43.958Z INFO pool-8-thread-2 c.h.m.i.p.b.TransactionHashBatchInserter Copied 1 rows from 1 shards to transaction_hash table in 653.0 μs +importer-1 | 2024-09-05T14:10:43.959Z INFO pool-8-thread-2 c.h.m.i.p.b.BatchInserter Copied 1 rows to transaction table in 486.9 μs +importer-1 | 2024-09-05T14:10:43.959Z INFO pool-8-thread-2 c.h.m.i.p.r.e.s.SqlEntityListener Completed batch inserts in 11.39 ms +importer-1 | 2024-09-05T14:10:43.959Z INFO pool-8-thread-2 c.h.m.i.p.r.RecordFileParser Successfully processed 1 items from 2019-10-11T16_39_31.290027001Z.rcd in 11.50 ms +importer-1 | 2024-09-05T14:10:44.539Z INFO scheduling-4 c.h.m.i.d.r.RecordFileDownloader No new signature files to download after file: 2019-10-11T16_39_31.290027001Z.rcd. Retrying in 0.5 s +``` + +### Verify RPC + +```bash + curl http://localhost:5551/api/v1/transactions?limit=1 +``` + +## Setup a Hedera JSON-RPC Relayer +You'll need to setup a JSON-RPC relay to let `ampd` intract with your Hedera node. Follow the setup instructions: + +### Clone Hedera JSON-RPC Relayer Repository + +* [Official Docs](https://docs.hedera.com/hedera/tutorials/more-tutorials/json-rpc-connections/hedera-json-rpc-relay) + +Open your terminal and run the following commands + +```bash +git clone https://github.com/hiero-ledger/hiero-json-rpc-relay.git +cd hiero-json-rpc-relay +git checkout tags/v0.68.0 # Or any other specific tag +``` + +### Install dependencies and Build the project + +```bash +npm install +npm run build +``` + +### Create a file named .env in the root directory of the project. + +```bash +CHAIN_ID= The network chain id. Local and previewnet envs should use 0x12a (298). Previewnet, Testnet and Mainnet should use 0x129 (297), 0x128 (296) and 0x127 (295) respectively + +MIRROR_NODE_URL= + +HEDERA_NETWORK= + +OPERATOR_KEY_FORMAT= + +OPERATOR_ID_MAIN= + +OPERATOR_KEY_MAIN= +``` + +### Start the RPC relay server as systemd service + +```bash +sudo nano /etc/systemd/system/hiero-json-rpc.service +``` + +```bash +[Unit] +Description=Hiero JSON-RPC Relayer +After=network.target + +[Service] +Type=simple + +# Change with the correct user +User=ubuntu + +# Change with the correct working directory +WorkingDirectory=/home/ubuntu/hiero-json-rpc-relay + +# Update NVM_DIR with the correct value +Environment=NODE_ENV=production NVM_DIR=/home/ubuntu/.nvm +ExecStart=/bin/bash -c 'source $NVM_DIR/nvm.sh && npm run start' +Restart=on-failure + +[Install] +WantedBy=multi-user.target +``` + +```bash +sudo systemctl enable hiero-json-rpc +sudo systemctl start hiero-json-rpc +``` + +### Check Logs + +Logs should appear like this + +```bash +[2024-10-03 16:49:33.460 +0000] INFO (relay/145017 on xxxxx): Configurations successfully loaded +[2024-10-03 16:49:33.461 +0000] TRACE (hbar-rate-limit/145017 on xxxxx): remainingBudget=11000000000 tℏ, resetTimestamp=1727974253461 +[2024-10-03 16:49:33.508 +0000] INFO (relay/145017 on xxxxx): SDK client successfully configured to "testnet" for account 0.0.12345 with request timeout value: 10000 +[2024-10-03 16:49:33.511 +0000] INFO (mirror-node/145017 on xxxxx): Mirror Node client successfully configured to REST url: https://testnet.mirrornode.hedera.com/api/v1/ and Web3 url: https://testnet.mirrornode.hedera.com/api/v1/ +[2024-10-03 16:49:33.512 +0000] INFO (relay/145017 on xxxxx): Relay running with chainId=0x128 +``` + +You can also testout the endpoint with sending a `curl`: + +```bash +curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":"2","method":"eth_blockNumber","params":[null]}' http://127.0.0.1:7546 + +> {"result":"0x7c568e","jsonrpc":"2.0","id":"2"} +``` + +## Ampd + +Once your node is up and running, you need to add the `Hedera` chain to your [ampd daemon's](https://github.com/axelarnetwork/axelar-amplifier/tree/main/ampd) `config.toml`file. This can be done by adding in the following configuration: + +This can be done as follows for Hedera Testnet: + + + + + ```toml + [[handlers]] + type="MultisigSigner" + chain_name="hedera" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + + [[handlers]] + type= "EvmMsgVerifier" + cosmwasm_contract= "axelar1q8q8qq59yv9wmhcreu5ykt4azsk83ttve4e7jyavt32k6jq862xsqexnfh" + chain_name= "hedera" + chain_rpc_url= "your_own_rpc" + chain_finalization= "RPCFinalizedBlock" + + [[handlers]] + type= "EvmVerifierSetVerifier" + cosmwasm_contract= "axelar1q8q8qq59yv9wmhcreu5ykt4azsk83ttve4e7jyavt32k6jq862xsqexnfh" + chain_name= "hedera" + chain_rpc_url= "your_own_rpc" + chain_finalization= "RPCFinalizedBlock" + ``` + + + ```toml + [[handlers]] + type="MultisigSigner" + chain_name="hedera" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + + [[handlers]] + type= "EvmMsgVerifier" + cosmwasm_contract= "axelar1ce9rcvw8htpwukc048z9kqmyk5zz52d5a7zqn9xlq2pg0mxul9mqxlx2cq" + chain_name= "hedera" + chain_rpc_url= "your_own_rpc" + chain_finalization= "RPCFinalizedBlock" + + [[handlers]] + type= "EvmVerifierSetVerifier" + cosmwasm_contract= "axelar1ce9rcvw8htpwukc048z9kqmyk5zz52d5a7zqn9xlq2pg0mxul9mqxlx2cq" + chain_name= "hedera" + chain_rpc_url= "your_own_rpc" + chain_finalization= "RPCFinalizedBlock" + ``` + + + + ### Register Chain +For your node to be recognized by the Axelar network, you need to register your chain with the `ampd` daemon. This can be done by running: + +```bash +ampd register-chain-support amplifier hedera +``` diff --git a/src/pages/validator/external-chains/hero.mdx b/src/content/docs/validator/external-chains/hero.mdx similarity index 96% rename from src/pages/validator/external-chains/hero.mdx rename to src/content/docs/validator/external-chains/hero.mdx index f8c4d25dd..eb4f142a8 100644 --- a/src/pages/validator/external-chains/hero.mdx +++ b/src/content/docs/validator/external-chains/hero.mdx @@ -1,12 +1,12 @@ # Heroes of NFT -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Set up your Heroes of NFT node in Testnet. Heroes of NFT is an Avalanche subnet. ## Prerequisites -- [Setup your Axelar validator](/validator/setup) +- [Setup your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: 8 AWS vCPU+, 16GB RAM, 500GB+ free storage space. - MacOS or Ubuntu 18.04+ - Golang 1.18.1+ @@ -43,6 +43,7 @@ git checkout v0.4.2 Alternatively, instead of running `avalanchego` with command flags, the conf file `~/.avalanchego/configs/node.json` can also be edited: ​ + ```json { “http-host”: “127.0.0.1”, @@ -56,6 +57,7 @@ Now you should be synchronizing on the Avalanche Testnet network. While the node is launching and catching up, search for logs pertaining to subnet ID `2MCNtqDyTQp7nAnj2iTREG7jdeJa3QRYWjvGvQh5uc9EqDmLTH`. ​ + ```bash [10-18|23:11:50.225] INFO <2MCNtqDyTQp7nAnj2iTREG7jdeJa3QRYWjvGvQh5uc9EqDmLTH Chain> bootstrap/bootstrapper.go:115 starting bootstrapper [10-18|23:11:50.225] INFO chains/manager.go:266 creating chain {"chainID": "ZyjdHoe9nbkVsUmuJEeWeFbtfAWKCsuZoTJ9WVUbbSLsc1aHX", "vmID": "nyfSdRoaSxyQUqMMQAVNaGR2bin6HRLC1yrRdEZRpfFrDiUk8"} @@ -85,7 +87,8 @@ Once your node is fully synced, you can run a cURL request to see the status of The EVM RPC should be running on your machine, at url `http://127.0.0.1:9650/ext/bc/p91WZe6xXivSgCBZwWwJmAfyxM92r819G7sqqRrYYRPzy49bP/rpc`. Ensure that it is running by executing the following curl command. ​ -```bash + +````bash curl --silent http://127.0.0.1:9650/ext/bc/p91WZe6xXivSgCBZwWwJmAfyxM92r819G7sqqRrYYRPzy49bP/rpc \ -X POST \ -H "Content-Type: application/json" \ @@ -96,10 +99,11 @@ If the node is successfully synced, the output from above will print ```json {"jsonrpc":"2.0","id":1,"result":{"baseFeePerGas":"0x59682f000","blockGasCost":"0x0","difficulty":"0x1","extraData":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","gasLimit":"0xf42400","gasUsed":"0x39765","hash":"0x4085c26854d2dcc13ca2c1f051bc1fd097b11ca3b1bd8049e30f0e9ccb936d3f","logsBloom":"0x00040000000000000040002020000000200000000002000000000008000040000000000000000000000000001000000000000000000000000000000000200000000000004000000000000008200000000000000000000000000000000020000000000000020000900000000000000800000000000000000000000010000400000000000000000100000100000000000001004000000000000400800000000000020000000000000000000000000000000020000080000000000000000000000000000002000000100000000000000000000000000000000000000000020020020010000000000000000000000000000000008000000000020400000008000000","miner":"0x0100000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0xaad9","parentHash":"0xbf7122548ba346e612ec1d11b90028f90d26ee80afa5a48e9b4609bfd2f24c38","receiptsRoot":"0x3073c7035f0cafaf4f4884e00b94626675a55319da4d3a7ebbcab6989c4fb3f8","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x332","stateRoot":"0x2de9ebfa56271c270b88f5fc90b91f6662c317b4b5f61cce5a689b6dc545c806","timestamp":"0x634e97c0","totalDifficulty":"0xaad9","transactions":["0xff632852e621a58bc249a59a6be87e2ca16d24727c18910807a7ab2735a39df1"],"transactionsRoot":"0x5cd072279c7afce34b659dd616f8a94439cccfe5ce8a513fef687fd1f8badce0","uncles":[]}} -``` +```` To add an alias for the subnet, edit `~/.avalanchego/vms/aliases.json`: ​ + ```json { "nzfDQr8VpSZwsJNTqqDPiDGCPc79GLe7QL3qdTbCkPJ8MFevG": ["hero", "herovm", "hvm"] @@ -117,17 +121,20 @@ http://IP:PORT/ext/bc/p91WZe6xXivSgCBZwWwJmAfyxM92r819G7sqqRrYYRPzy49bP/rpc Example: `http://192.168.192.168:9650/ext/bc/p91WZe6xXivSgCBZwWwJmAfyxM92r819G7sqqRrYYRPzy49bP/rpc` - ## Network Information ### HERO Subnet IDs + ``` VM ID: nzfDQr8VpSZwsJNTqqDPiDGCPc79GLe7QL3qdTbCkPJ8MFevG Subnet ID: 2MCNtqDyTQp7nAnj2iTREG7jdeJa3QRYWjvGvQh5uc9EqDmLTH Chain ID: p91WZe6xXivSgCBZwWwJmAfyxM92r819G7sqqRrYYRPzy49bP ``` + ​ + ### Subnet parameters: + ``` Network ID: 17771 Chain ID: 17771 @@ -136,20 +143,26 @@ Block Gas Limit: 16,000,000 Min Fee: 24 GWei Target Block Rate: 2s (Same as C-Chain) ``` + ​ + ### Validators + ``` Validator 1 ID: NodeID-AGSMAmA7HStwbKCJAYpBzBvDmjyd6BVvd Validator 1 IP: 154.12.249.187 -Validator 2 ID: NodeID-7iWipVaLBfGSMjY6WNCXiWtY5yKLe1kTx +Validator 2 ID: NodeID-7iWipVaLBfGSMjY6WNCXiWtY5yKLe1kTx Validator 2 IP: 66.94.125.28 Validator 10 ID: NodeID-6tWHHU9uVWAf46qTYTsnTnVZJeL65hwgR Validator 10 IP: 173.249.33.39 ``` + ​ + ### MetaMask Params + ``` Network Name: Hero Testnet RPC URL: https://herotestnet.heroesofnft.com:443/ext/bc/p91WZe6xXivSgCBZwWwJmAfyxM92r819G7sqqRrYYRPzy49bP/rpc @@ -157,8 +170,11 @@ Chain ID: 17771 Symbol: HRM Explorer: https://testnet.avascan.info/blockchain/hero/ ``` + ​ + ### Genesis file + ```json { "config": { @@ -216,8 +232,10 @@ Explorer: https://testnet.avascan.info/blockchain/hero/ ``` ## More Information of Avalanche Subnets + ​ -* https://docs.avax.network/nodes/build/run-avalanche-node-manually -* https://docs.avax.network/subnets/create-a-fuji-subnet -* https://docs.avax.network/subnets/setup-dfk-node -* https://docs.avax.network/nodes/maintain/subnet-configs + +- https://docs.avax.network/nodes/build/run-avalanche-node-manually +- https://docs.avax.network/subnets/create-a-fuji-subnet +- https://docs.avax.network/subnets/setup-dfk-node +- https://docs.avax.network/nodes/maintain/subnet-configs diff --git a/src/content/docs/validator/external-chains/hyperliquid.mdx b/src/content/docs/validator/external-chains/hyperliquid.mdx new file mode 100644 index 000000000..0c7af0995 --- /dev/null +++ b/src/content/docs/validator/external-chains/hyperliquid.mdx @@ -0,0 +1,203 @@ +# Hyperliquid + +import { Callout } from "/src/components/callout"; + +Set up your Hyperliquid Mainnet or Testnet node + +## Prerequisites + +- [Setup your Axelar validator](/validator/setup/overview/) +- [Minimum hardware requirements](https://github.com/hyperliquid-dex/node?tab=readme-ov-file#machine-specs): + - Memory: 32 GB RAM + - CPU: 4 CPU cores (64-bit) + - Disk: 200 GB of SSD storage +- Only Ubuntu 24.04 +- For lowest latency, run the node in Tokyo, Japan. +- [Official Documentation](https://github.com/hyperliquid-dex/node) + +## Clone the Repository and Import key + +```bash +cd $HOME +git clone https://github.com/hyperliquid-dex/node +cd node +gpg --import pub_key.asc +``` + +## Configuring the node + + + + ```bash + echo '{"chain": "Mainnet"}' > visor.json +``` + + + ```bash + echo '{"chain": "Testnet"}' > visor.json +``` + + + +## Download the Visor binary + +The visor binary spawns and manages the child node process. + + + + ```bash + curl https://binaries.hyperliquid.xyz/Mainnet/hl-visor > hl-visor && chmod a+x hl-visor +``` + + + ```bash + curl https://binaries.hyperliquid-testnet.xyz/Testnet/hl-visor > hl-visor && chmod a+x hl-visor +``` + + + +## Configure the node + + + + ```bash + echo '{ "root_node_ips": [{"Ip": "1.2.3.4"}], "try_new_peers": true, "chain": "Mainnet" }' > override_gossip_config.json +``` + + + ```bash + echo '{ "root_node_ips": [{"Ip": "1.2.3.4"}], "try_new_peers": true, "chain": "Testnet" }' > override_gossip_config.json +``` + + + +For faster bootstrapping, use a known reliable peer. Can be found [here](https://github.com/hyperliquid-dex/node?tab=readme-ov-file#mainnet-non-validator-seed-peers). + +**Note:** If you don't find peers for testnet, you can still start the node, but it may take some time to bootstrap. + +## Start the node + +```bash +sudo tee </dev/null /etc/systemd/system/hyperliquid.service +[Unit] +Description=Hyperliquid Node +After=network.target +[Service] +Type=simple +User=$USER +ExecStart=$HOME/hl-visor run-non-validator --serve-eth-rpc +Restart=on-failure +[Install] +WantedBy=multi-user.target +EOF +``` + +To enable and start the service: + +```bash +sudo systemctl daemon-reload +sudo systemctl start hyperliquid +sudo systemctl enable hyperliquid +``` + +To check the status of the running service or to follow the logs, you can use: + +```bash +sudo systemctl status hyperliquid +sudo journalctl -u hyperliquid -f +``` + +After a few minutes, you should see lines that look like this. This means your node has started syncing with the network and is receiving blocks. + +```bash +2025-05-26T06:59:33.774Z WARN >>> hl-node @@ applied block 607619100 +2025-05-26T06:59:35.240Z WARN >>> hl-node @@ applied block 607619200 +2025-05-26T06:59:36.233Z WARN >>> hl-node @@ applied block 607619300 +2025-05-26T06:59:38.395Z WARN >>> hl-node @@ applied block 607619400 +2025-05-26T06:59:39.407Z WARN >>> hl-node @@ applied block 607619500 +2025-05-26T06:59:40.688Z WARN >>> hl-node @@ applied block 607619600 +``` + +> **Note:** The network can generate up to 100 GB of data per day, so it is strongly recommended to archive or delete old files regularly. +> For more details, refer to the [official documentation](https://github.com/hyperliquid-dex/node?tab=readme-ov-file#reading-l1-data). + +To manage storage more efficiently, you can use the following flag: + +```bash +$HOME/hl-visor run-non-validator --serve-eth-rpc --replica-cmds-style recent-actions +``` + +This will automatically retain only the latest two height files, deleting older ones as new data is added. It’s a simple and effective way to reduce disk usage without manual intervention. + +## Check latest block height + +To retrieve the latest block height: + +```bash +curl -X POST --header 'Content-Type: application/json' \ + --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false],"id":1}' \ + http://localhost:3001/evm +``` + +**Note:** Port `3001` may take few moments to become available after the service has started. + +## Ampd Configuration + +Once your node is up and running, you need to add the `Hyperliquid` chain to your [ampd daemon's](https://github.com/axelarnetwork/axelar-amplifier/tree/main/ampd) `config.toml`file. This can be done by adding in the following configuration: + + + + + ```toml + [[handlers]] + type="EvmMsgVerifier" + chain_name="hyperliquid" + chain_finalization="RPCFinalizedBlock" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1n64vk7l3zagh2eadkuhl7602lxluu86dn9smfxyp7c2e4v8pqj5sv4ypjr" + + [[handlers]] + type="EvmVerifierSetVerifier" + chain_name="hyperliquid" + chain_finalization="RPCFinalizedBlock" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1n64vk7l3zagh2eadkuhl7602lxluu86dn9smfxyp7c2e4v8pqj5sv4ypjr" + + [[handlers]] + type="MultisigSigner" + chain_name="hyperliquid" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + + ``` + + + ```toml + [[handlers]] + type="EvmMsgVerifier" + chain_name="hyperliquid" + chain_finalization="RPCFinalizedBlock" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1n64vk7l3zagh2eadkuhl7602lxluu86dn9smfxyp7c2e4v8pqj5sv4ypjr" + + [[handlers]] + type="EvmVerifierSetVerifier" + chain_name="hyperliquid" + chain_finalization="RPCFinalizedBlock" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1n64vk7l3zagh2eadkuhl7602lxluu86dn9smfxyp7c2e4v8pqj5sv4ypjr" + + [[handlers]] + type="MultisigSigner" + chain_name="hyperliquid" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + ``` + + + +## Chain Registration + +For your node to be recognized by the Axelar Network, you need to register your verifier's support for the chain with the `ampd` daemon. This can be done by running: + +```bash +ampd register-chain-support amplifier hyperliquid +``` \ No newline at end of file diff --git a/src/pages/validator/external-chains/immutable.mdx b/src/content/docs/validator/external-chains/immutable.mdx similarity index 73% rename from src/pages/validator/external-chains/immutable.mdx rename to src/content/docs/validator/external-chains/immutable.mdx index 5e816539d..eba6dd2ca 100644 --- a/src/pages/validator/external-chains/immutable.mdx +++ b/src/content/docs/validator/external-chains/immutable.mdx @@ -4,19 +4,16 @@ Instructions to set up your Immutable zkEVM node. ## Requirements -- [Setup your Axelar validator](/validator/setup) +- [Setup your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: 2 AWS vCPU, 4GB RAM, 100GB free storage space. - Ubuntu 22.04.1 (tested on 22.04.1) - [Official Documentation](https://docs.immutable.com/) - ## Prerequisites + 1. Install [Docker](https://docs.docker.com/engine/install/ubuntu/) -2. Install `openssl`. -```bash -sudo apt-get install openssl -``` -3. **(Optional)** If you plan to use WireGuard (see [Get access to the Immutable zkEVM partner nodes](#get-access-to-the-immutable-zkevm-partner-nodes)), install it. +2. **(Optional)** If you plan to use WireGuard (see [Get access to the Immutable zkEVM partner nodes](#get-access-to-the-immutable-zkevm-partner-nodes)), install it. + ```bash sudo apt-get install wireguard ``` @@ -51,7 +48,7 @@ a link to your transaction in the Axelar explorer. For example:
    > *Please add my static IP to the Immutable allowlist: `_STATIC_IP_`* > -> *See my verfication transaction at: `_LINK_TO_EXPLORER_`* +> *See my verification transaction at: `_LINK_TO_EXPLORER_`*
    @@ -79,7 +76,7 @@ a link to your transaction in the Axelar explorer. For example:
    > *Please add my public key to the Immutable WireGuard tunnel: `_WIREGUARD_PUBLIC_KEY_`* -> *See my verfication transaction at: `_LINK_TO_EXPLORER_`* +> _See my verification transaction at: `_LINK_TO_EXPLORER_`_
    @@ -93,6 +90,7 @@ wg-quick up wg0 ``` The output should look something like this: + ```bash [#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 @@ -102,6 +100,7 @@ The output should look something like this: [#] ip -4 route add dev wg0 [#] ip -4 route add dev wg0 ``` + @@ -113,99 +112,46 @@ The output should look something like this: mkdir /opt/immutable-zkevm ``` -2. Generate a random password. -```bash -openssl rand -base64 32 > /opt/immutable-zkevm/password -``` - -3. Pull the Docker image. +2. Pull the Docker image. ```bash -docker pull ghcr.io/immutable/go-ethereum/go-ethereum:v0.0.8 +docker pull ghcr.io/immutable/go-ethereum/go-ethereum:latest # Create a short-form tag we can reference in the next few commands -docker tag ghcr.io/immutable/go-ethereum/go-ethereum:v0.0.8 geth +docker tag ghcr.io/immutable/go-ethereum/go-ethereum:latest geth ``` -4. Initialise the node. +3. Initialise the node. - -```bash -docker run \ - --rm \ - -v /opt/immutable-zkevm:/mnt/geth \ - --name geth \ - geth account new --datadir /mnt/geth --password /mnt/geth/password -``` - -```bash -docker run \ - --rm \ - -v /opt/immutable-zkevm:/mnt/geth \ - --name geth \ - geth init \ - --datadir /mnt/geth /etc/geth/testnet.json -``` - - -```bash -docker run \ - --rm \ - -v /opt/immutable-zkevm:/mnt/geth \ - --name geth \ - geth account new --datadir /mnt/geth --password /mnt/geth/password + + ```bash docker run \ --rm \ -v /opt/immutable-zkevm:/mnt/geth \ --name geth + \ geth immutable bootstrap rpc \ --zkevm testnet \ --datadir /mnt/geth ``` - -```bash -docker run \ - --rm \ - -v /opt/immutable-zkevm:/mnt/geth \ - --name geth \ - geth init \ - --datadir /mnt/geth /etc/geth/mainnet.json + + + ```bash docker run \ --rm \ -v /opt/immutable-zkevm:/mnt/geth \ --name geth + \ geth immutable bootstrap rpc \ --zkevm mainnet \ --datadir /mnt/geth ``` - + -5. Start the Immutable zkEVM node as a service +4. Start the Immutable zkEVM node as a service - -```bash -docker run \ - -d \ - --restart=always \ - -v /opt/immutable-zkevm:/mnt/geth \ - --name geth \ - -p 8545:8545 \ - geth \ - --config /etc/geth/testnet.toml \ - --datadir /mnt/geth \ - --keystore /mnt/geth/keystore \ - --networkid 13473 \ - --http \ - --http.port "8545" \ - --http.addr "0.0.0.0" + +```bash docker run \ -d \ --restart=always \ -v + /opt/immutable-zkevm:/mnt/geth \ --name geth \ -p 8545:8545 \ geth \ --zkevm + testnet \ --config /etc/geth/testnet.toml \ --datadir /mnt/geth \ --http \ + --http.port "8545" \ --http.addr "0.0.0.0" ``` - - -```bash -docker run \ - -d \ - --restart=always \ - -v /opt/immutable-zkevm:/mnt/geth \ - --name geth \ - -p 8545:8545 \ - geth \ - --config /etc/geth/mainnet.toml \ - --datadir /mnt/geth \ - --keystore /mnt/geth/keystore \ - --networkid 13371 \ - --http \ - --http.port "8545" \ - --http.addr "0.0.0.0" + + + ```bash docker run \ -d \ --restart=always \ -v + /opt/immutable-zkevm:/mnt/geth \ --name geth \ -p 8545:8545 \ geth \ --zkevm + mainnet \ --config /etc/geth/mainnet.toml \ --datadir /mnt/geth \ --http \ + --http.port "8545" \ --http.addr "0.0.0.0" ``` - + ### Verify your deployment @@ -221,55 +167,55 @@ The following logs indicate you are synching from the genesis block. ```bash INFO [12-04|04:54:26.418] Maximum peer count ETH=100 LES=0 total=100 INFO [12-04|04:54:26.421] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory" -INFO [12-04|04:54:26.422] initialising New Relic agent... -ERROR[12-04|04:54:26.422] Failed to initialise New Relic agent: NEW_RELIC_APP_NAME missing -INFO [12-04|04:54:26.433] Enabling recording of key preimages since archive mode is used -INFO [12-04|04:54:26.446] Using pebble as the backing database +INFO [12-04|04:54:26.422] initialising New Relic agent... +ERROR[12-04|04:54:26.422] Failed to initialise New Relic agent: NEW_RELIC_APP_NAME missing +INFO [12-04|04:54:26.433] Enabling recording of key preimages since archive mode is used +INFO [12-04|04:54:26.446] Using pebble as the backing database INFO [12-04|04:54:26.446] Allocated cache and file handles database=/mnt/geth/geth/chaindata cache=512.00MiB handles=524,288 INFO [12-04|04:54:26.504] Opened ancient database database=/mnt/geth/geth/chaindata/ancient/chain readonly=true INFO [12-04|04:54:26.505] State scheme set to already existing scheme=hash INFO [12-04|04:54:26.508] Set global gas cap cap=50,000,000 INFO [12-04|04:54:26.509] Initializing the KZG library backend=gokzg INFO [12-04|04:54:26.650] Allocated trie memory caches clean=512.00MiB dirty=0.00B -INFO [12-04|04:54:26.650] Using pebble as the backing database +INFO [12-04|04:54:26.650] Using pebble as the backing database INFO [12-04|04:54:26.650] Allocated cache and file handles database=/mnt/geth/geth/chaindata cache=512.00MiB handles=524,288 INFO [12-04|04:54:26.730] Opened ancient database database=/mnt/geth/geth/chaindata/ancient/chain readonly=false INFO [12-04|04:54:26.753] Initialising Ethereum protocol network=13473 dbversion=8 -INFO [12-04|04:54:26.754] -INFO [12-04|04:54:26.754] --------------------------------------------------------------------------------------------------------------------------------------------------------- -INFO [12-04|04:54:26.754] Chain ID: 13473 (unknown) -INFO [12-04|04:54:26.754] Reorg Invariants Enabled: true -INFO [12-04|04:54:26.754] Consensus: Clique (proof-of-authority) -INFO [12-04|04:54:26.754] -INFO [12-04|04:54:26.754] Pre-Merge hard forks (block based): -INFO [12-04|04:54:26.754] - Homestead: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/homestead.md) -INFO [12-04|04:54:26.754] - Tangerine Whistle (EIP 150): #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/tangerine-whistle.md) -INFO [12-04|04:54:26.754] - Spurious Dragon/1 (EIP 155): #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md) -INFO [12-04|04:54:26.754] - Spurious Dragon/2 (EIP 158): #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md) -INFO [12-04|04:54:26.754] - Byzantium: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/byzantium.md) -INFO [12-04|04:54:26.754] - Constantinople: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/constantinople.md) -INFO [12-04|04:54:26.754] - Petersburg: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/petersburg.md) -INFO [12-04|04:54:26.754] - Istanbul: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/istanbul.md) -INFO [12-04|04:54:26.754] - Muir Glacier: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/muir-glacier.md) -INFO [12-04|04:54:26.754] - Berlin: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/berlin.md) -INFO [12-04|04:54:26.754] - London: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/london.md) -INFO [12-04|04:54:26.754] - Arrow Glacier: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/arrow-glacier.md) -INFO [12-04|04:54:26.754] - Gray Glacier: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/gray-glacier.md) -INFO [12-04|04:54:26.754] -INFO [12-04|04:54:26.754] The Merge is not yet available for this network! -INFO [12-04|04:54:26.754] - Hard-fork specification: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md -INFO [12-04|04:54:26.754] -INFO [12-04|04:54:26.754] Post-Merge hard forks (timestamp based): -INFO [12-04|04:54:26.754] -INFO [12-04|04:54:26.754] --------------------------------------------------------------------------------------------------------------------------------------------------------- -INFO [12-04|04:54:26.754] +INFO [12-04|04:54:26.754] +INFO [12-04|04:54:26.754] --------------------------------------------------------------------------------------------------------------------------------------------------------- +INFO [12-04|04:54:26.754] Chain ID: 13473 (unknown) +INFO [12-04|04:54:26.754] Reorg Invariants Enabled: true +INFO [12-04|04:54:26.754] Consensus: Clique (proof-of-authority) +INFO [12-04|04:54:26.754] +INFO [12-04|04:54:26.754] Pre-Merge hard forks (block based): +INFO [12-04|04:54:26.754] - Homestead: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/homestead.md) +INFO [12-04|04:54:26.754] - Tangerine Whistle (EIP 150): #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/tangerine-whistle.md) +INFO [12-04|04:54:26.754] - Spurious Dragon/1 (EIP 155): #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md) +INFO [12-04|04:54:26.754] - Spurious Dragon/2 (EIP 158): #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md) +INFO [12-04|04:54:26.754] - Byzantium: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/byzantium.md) +INFO [12-04|04:54:26.754] - Constantinople: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/constantinople.md) +INFO [12-04|04:54:26.754] - Petersburg: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/petersburg.md) +INFO [12-04|04:54:26.754] - Istanbul: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/istanbul.md) +INFO [12-04|04:54:26.754] - Muir Glacier: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/muir-glacier.md) +INFO [12-04|04:54:26.754] - Berlin: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/berlin.md) +INFO [12-04|04:54:26.754] - London: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/london.md) +INFO [12-04|04:54:26.754] - Arrow Glacier: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/arrow-glacier.md) +INFO [12-04|04:54:26.754] - Gray Glacier: #0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/gray-glacier.md) +INFO [12-04|04:54:26.754] +INFO [12-04|04:54:26.754] The Merge is not yet available for this network! +INFO [12-04|04:54:26.754] - Hard-fork specification: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md +INFO [12-04|04:54:26.754] +INFO [12-04|04:54:26.754] Post-Merge hard forks (timestamp based): +INFO [12-04|04:54:26.754] +INFO [12-04|04:54:26.754] --------------------------------------------------------------------------------------------------------------------------------------------------------- +INFO [12-04|04:54:26.754] INFO [12-04|04:54:26.755] Loaded most recent local block number=1,343,036 hash=b5bb3f..cbe4f1 td=2,686,073 age=1m17s WARN [12-04|04:54:26.893] Sanitizing invalid blobpool storage cap provided=0 updated=10,737,418,240 INFO [12-04|04:54:26.893] Initialized transaction indexer limit=2,350,000 INFO [12-04|04:54:26.929] Gasprice oracle is ignoring threshold set threshold=2 -INFO [12-04|04:54:26.935] Shutdown tracker started marker +INFO [12-04|04:54:26.935] Shutdown tracker started marker WARN [12-04|04:54:26.935] Engine API enabled protocol=eth -WARN [12-04|04:54:26.935] Engine API started but chain not configured for merge yet +WARN [12-04|04:54:26.935] Engine API started but chain not configured for merge yet INFO [12-04|04:54:26.935] Starting peer-to-peer node instance=Geth/v1.13.0-unstable-cb37d5a3-20231204/linux-amd64/go1.21.4 INFO [12-04|04:54:26.975] IPC endpoint opened url=/mnt/geth/geth.ipc INFO [12-04|04:54:26.975] Loaded JWT secret file path=/mnt/geth/geth/jwtsecret crc32=0xaa03f756 @@ -279,7 +225,7 @@ INFO [12-04|04:54:26.976] WebSocket enabled url=ws://127. INFO [12-04|04:54:26.976] HTTP server started endpoint=127.0.0.1:8551 auth=true prefix= cors=localhost vhosts=localhost INFO [12-04|04:54:26.981] New local node record seq=1,701,654,445,241 id=660d517490a62260 ip=127.0.0.1 udp=0 tcp=0 INFO [12-04|04:54:26.981] Started P2P networking self=enode://9040706fed7d4ac85ff44ac1ad54b28ec39b585ec23a5dacb920163d95dd576ca0ab8d2ba4b590a16a183bc14114ac299f2712ada37f8060be684983b1d5016f@127.0.0.1:0 -INFO [12-04|04:54:36.978] Block synchronisation started +INFO [12-04|04:54:36.978] Block synchronisation started INFO [12-04|04:54:37.205] Imported new chain segment number=1,343,079 hash=560a17..971f02 blocks=43 txs=0 mgas=0.000 elapsed=205.607ms mgasps=0.000 triedirty=0.00B INFO [12-04|04:54:37.518] Imported new chain segment number=1,343,080 hash=db30ec..114a94 blocks=1 txs=0 mgas=0.000 elapsed=4.535ms mgasps=0.000 triedirty=0.00B INFO [12-04|04:54:39.517] Imported new chain segment number=1,343,081 hash=b72134..f35f55 blocks=1 txs=0 mgas=0.000 elapsed=4.587ms mgasps=0.000 triedirty=0.00B @@ -317,9 +263,11 @@ curl https://rpc.testnet.immutable.com \ ``` The output should be: + ```bash {"jsonrpc":"2.0","id":1,"result":"0x34a1"} ``` + @@ -331,9 +279,11 @@ curl https://rpc.immutable.com \ ``` The output should be: + ```bash {"jsonrpc":"2.0","id":1,"result":"0x343b"} ``` + @@ -342,7 +292,7 @@ The output should be: The following is a breakdown of the docker command used to start up the Immutable zkEVM node. This information should help node operators adjust the command to their respected environments. -For simplicity, we use the Mainnet start up command, but the information applies to both Testnet and Mainnet. +For simplicity, we use the mainnet start up command, but the information applies to both testnet and mainnet. ```bash docker run \ @@ -361,20 +311,19 @@ docker run \ --http.addr "0.0.0.0" ``` -* `-d` Detach. This means the container will start without holding on to your terminal. -* `--restart=always`: Always keep it running. This tells the Docker daemon, if the container stops running (e.g., if the host restarts), start it up again. -* `-v :`: Mount host directory. This tells docker to map a directory from your host, to a directory inside the container. -* `--name geth`: Name the container. This helps us reference the container later in the docker CLI. If you run `docker ps` you should see the container with an ID and this name. -* `-p :`. Map host port. This tells docker to forward any connections on the host's `` to the container's ``. -* `geth`: Command line. Here starts the command line inside the container. This is the binary for the `immutable-geth` instance running inside the container. -* `--config /etc/geth/mainnet.toml`: Pre-baked mainnet configuration. This path **_MUST NOT BE MODIFIED_**. -* `--datadir `: Directory path. This is the directory `geth` will use for storage. It **_MUST_** match `` in the `-v` flag. It **_MUST_** match the path used in the initialisation commands ran previously. -* `--keystore /keystore`: Keystore path. This is relative to `` mentioned above. NOTE: we have a backlog task to potentially remove this. -* `--networkid 13371`: ChainID. This ***MUST NOT*** be modified. -* `--http`: Enable RPC interface. -* `--http.port `: Expose RPC interface in container port ``. This ***MUST*** match `` in the `-p` flag above. -* `--http.addr "0.0.0.0"`. Expose the RPC interface in all network addresses. - +- `-d` Detach. This means the container will start without holding on to your terminal. +- `--restart=always`: Always keep it running. This tells the Docker daemon, if the container stops running (e.g., if the host restarts), start it up again. +- `-v :`: Mount host directory. This tells docker to map a directory from your host, to a directory inside the container. +- `--name geth`: Name the container. This helps us reference the container later in the docker CLI. If you run `docker ps` you should see the container with an ID and this name. +- `-p :`. Map host port. This tells docker to forward any connections on the host's `` to the container's ``. +- `geth`: Command line. Here starts the command line inside the container. This is the binary for the `immutable-geth` instance running inside the container. +- `--config /etc/geth/mainnet.toml`: Pre-baked mainnet configuration. This path **_MUST NOT BE MODIFIED_**. +- `--datadir `: Directory path. This is the directory `geth` will use for storage. It **_MUST_** match `` in the `-v` flag. It **_MUST_** match the path used in the initialisation commands ran previously. +- `--keystore /keystore`: Keystore path. This is relative to `` mentioned above. NOTE: we have a backlog task to potentially remove this. +- `--networkid 13371`: ChainID. This **_MUST NOT_** be modified. +- `--http`: Enable RPC interface. +- `--http.port `: Expose RPC interface in container port ``. This **_MUST_** match `` in the `-p` flag above. +- `--http.addr "0.0.0.0"`. Expose the RPC interface in all network addresses. ## Configure vald @@ -383,19 +332,13 @@ vald's `config.toml` - ```bash - [[axelar_bridge_evm]] - name = "immutable" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` + ```bash [[axelar_bridge_evm]] name = "immutable" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` - ```bash - [[axelar_bridge_evm]] - name = "immutable" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` + ```bash [[axelar_bridge_evm]] name = "immutable" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` diff --git a/src/content/docs/validator/external-chains/kava.mdx b/src/content/docs/validator/external-chains/kava.mdx new file mode 100644 index 000000000..c91716222 --- /dev/null +++ b/src/content/docs/validator/external-chains/kava.mdx @@ -0,0 +1,213 @@ +# Kava + +import { Callout } from "/src/components/callout"; + +This guide presents you the Kava Node setup for both testnet and mainnet, as well as the integration with Axelar Network. + +## Prerequisites + +- [Setup your Axelar validator](/validator/setup/overview/) +- Minimum hardware requirements: 4 core CPU , 8GB RAM +- MacOS or Ubuntu +- Build-essential packages +- Golang +- [Official Documentation](https://docs.kava.io/docs/nodes-and-validators/validator-node/) +- [GitHub](https://github.com/Kava-Labs/kava) + +## Install Kava + +[Install](https://go.dev/doc/install) the appropriate Golang version (found on their GitHub, linked above). + +```bash +git clone https://github.com/Kava-Labs/kava +cd kava +``` +
    + + + ```bash + git checkout [release tag] + ``` + + + + ```bash + git checkout [release tag] + ``` + + + +
    +```bash +make install + +# verify versions +kava version --long +``` + +## Setup Kava Node + +### Initialize Kava config + + + + ```bash + kava init [your_moniker_name] --chain-id kava_2222-10 + ``` + + + + ```bash + kava init [your_moniker_name] --chain-id kava_2221-16000 + ``` + + + +
    +```bash +kava tendermint unsafe-reset-all --home $HOME/.kava +cd $HOME/.kava/config +rm genesis.json +``` + +### Set up the Genesis file + + + + ```bash + wget https://kava-genesis-files.s3.us-east-1.amazonaws.com/kava_2222-10/genesis.json + ``` + + + + ```bash + wget https://raw.githubusercontent.com/Kava-Labs/kava-testnets/master/16000/genesis.json + ``` + + + + +Edit `$HOME/.kava/config/config.toml` to add the following persistent peers. + + + + ```bash persistent_peers = + "2a15d9c39eea97b4cf00480b45d4ea32a2e173d0@94.130.78.22:26656,5a933891627e8bde0c4bd0b43c9f99b706e520a2@141.95.99.214:11656,ab3064c37d406245fa2d6e6109395518e8ac8a4c@95.111.255.148:26656,41d88639239c55fd37279d24df507238e1c417ea@85.237.192.104:26656,b23050c89f8cb2f4099688b2bcd60f49b15f41d1@95.214.53.217:26656,d5db8898d40054c07442f3364b32f7fac2752f5e@188.34.178.92:26656,fc34d9a3aff6026a3dbd531a96a50680df61dd91@50.116.3.21:26656,50e4cad7d5e28f7b6495168f92e12bf810e293fd@142.132.152.187:10856,6885971cdb724fa93034fb9e6a11113a6f555d2a@15.235.53.92:11656,7b5a2b519cb5a7d70f0fc5842829d4cce1262585@65.108.121.153:26656,51cfccb07d5a45efdf98d005159c01f0656751ad@54.165.27.59:26656,f7c894901f450b92614fd051d10854d168ec30b5@65.21.94.20:10856,7393ed21b6dc516fcc0ad33c4fe42bdd295d2795@18.206.217.244:26656,508d7ec33c7f3c9c479ca9b845cadbbefee670f7@162.55.133.237:21656,d68410115d7681196651e7fece9e4cafc0456856@3.0.206.176:26656,4cfdd459466cfd492d66b7a5fe26cde96e35d735@182.48.203.7:26656,63ec88e98fc267fb82fa62a51ca5c0a2c115d749@51.38.53.4:27656,ebc272824924ea1a27ea3183dd0b9ba713494f83@185.16.39.172:26656,4efe3caf3b8c0ca197d40756f3bb1bd6081bf18d@51.210.220.20:36656,c124ce0b508e8b9ed1c5b6957f362225659b5343@136.243.248.185:26656,82588f011491c6100d922d133f52fc23460b9231@95.217.91.233:26656,8b5c4a890c8ae7efbbe3360af71be1c3c3a9e12e@121.78.241.68:46656,ce203135031ab08fc0ddff5bd13806e25f21b91d@3.115.125.121:26656,dcd6026ebe5586ed0e94751090f8290b5997666b@5.189.165.172:26656,bc61c26018f65e54232b7e9e99bf7599dffeb78b@13.56.56.180:26656"\\ + seeds = "b334e291ac361f9a1cf253d290047700b488b679@52.2.147.96:26656" ``` + + + ```bash persistent_peers = + "0ecf6974e645d267e1c40223fabc59521229de5a@203.238.191.195:26656,19a109e7b1bdbe020db34d883fc740006fd96d9e@54.205.248.136:26656,a610e40ec9c15ceab183bdc71e94fbf9c4c91d70@54.91.207.93:26656,0264f7762530ef4e637f0fcb866bea0b2ea68dd9@34.198.224.121:26656,c22a30eee9f4873a7891603a567d5825db4583a4@65.21.232.149:26756,b2dc431ea24139d5d2d728d6edb546b3dd8ca8ec@54.85.1.24:26656,cb44d1deb4b1732adc1fb81e2bdeed097c5052c2@195.201.108.152:26656,2a0fd732f484647a34076d03501b5ade76a0d056@54.162.132.18:26656,9b2b83d1bccab3c388c379f6b7a19146ee9b4d8b@161.97.155.94:30656,5af375a8f1fb5879087ea573e30976f084f23769@167.235.244.61:26656,8be1950812fe31c91a63eab482d13276fb7cc4c7@95.217.214.138:26656,e2e9d76fb4658f1757d4b51ef34ebbd1e857d1c5@88.99.25.84:26656,b9f759ca8cf1179ac10b36e6f458c69bf5ee2b85@89.149.218.18:26656,0e7c323c8d558f3aeecee09a679f39f7842287ca@52.207.243.95:26656,ddcc5e1b405fbf5763c7c1b3932c44f3f0917a58@50.19.243.132:26656,220aa32bc7279a43a2ce9af0393945c357e88b27@86.111.48.129:26656,25b3e8aa0c0a7bb47710cb5be1a700c243da211c@3.93.65.190:26656,2972850c607f65354af82c75382fa1745d46b63a@65.21.126.182:26656,9d0bad73fbf1bc53b3e8b4b3c7873980b1843524@18.207.210.224:26656,547f3b5f5907339794f6231d71ac0bd2246bdcb9@65.108.124.57:21656,353ae6090dc1fffb66d55faef6b6133693907af4@3.83.193.144:26656,80f5c216dbb472b483a578154167953c3a2913bb@34.224.245.49:26656,0f7c1725cacc5be8000209bbce4be55b7b5d7fe5@18.232.239.76:26656,4b127af8f935836798fb24b451849c6a28b0bf26@222.106.187.14:54506,a3176f14632e2ce70b879fd7c74b3e63626559d2@54.156.38.39:26656,47b3b6a795febcf3de0b50a65d383a8573e26289@3.80.131.4:26656,8d25035ba3da76aa8257cea0a110ea586511312e@65.109.26.45:26656,3b21dbf61555cbbc3828fca3af26737b81104a32@86.111.48.130:26656,ed0212d3afc1d6c9a02b785ca1577e1ee6609672@52.205.115.127:26656,d4b23cf74b22ea4c8be862151486dd7301e0b84b@44.199.250.214:26656,0f3bcd2ac6f13522600a7a20861c4c5354bf518e@34.226.104.212:26656,b859111f93f4d461a6de749e865c7fef2ac912d8@139.162.210.87:26656" + ``` + + + +Add minium gas prices into app.toml + +```bash +minimum-gas-prices = "0.025ukava;1000000000akava" +``` + +Do the rest of the port configuration as desired; The EVM configuration and ports can be found in the app.toml under ection "EVM Configuration" + +### Pruning configuration + +For the purposes of Axelar, Kava RPC nodes can be kept fully pruned. +Update the pruning config in `$HOME/.kava/config/app.toml` as below + +```yaml +pruning="everything" +``` + +### State sync script + +Create a state sync script `statesync.sh` with the following code and replace the RPC var for the appropriate network. + + + + ```bash + https://kava-mainnet.chainode.tech:443 + ``` + + + + ```bash + https://kava-testnet.chainode.tech:443 + ``` + + + +
    +```bash +#!/bin/bash + +RPC="RPC" + +LATEST_HEIGHT=$(curl -s $RPC/block | jq -r .result.block.header.height); \ +BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000)); \ +TRUST_HASH=$(curl -s "$RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash) + +sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \ +s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$RPC,$RPC\"| ; \ +s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \ +s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.kava/config/config.toml +``` + +Run the script with appropriate permissions. + +```bash +chmod 700 statesync.sh +./statesync.sh +``` + +### Configure systemd + +```bash +sudo tee </dev/null /etc/systemd/system/kvd.service +[Unit] +Description=KAVA daemon +After=network-online.target + +[Service] +User= +ExecStart=/home//go/bin/kava start +Restart=always +RestartSec=3 +LimitNOFILE=16384 + +[Install] +WantedBy=multi-user.target +EOF + +sudo systemctl enable kvd +sudo systemctl daemon-reload +sudo systemctl start kvd +``` + +## Configure vald + +In order for `vald` to connect to your RPC node, it should be exposed in +vald's `config.toml`. + + + + ```bash + [[axelar_bridge_evm]] + +name = "kava" +rpc_addr = "http://IP:PORT" +start-with-bridge = true + +```` + + +```bash +[[axelar_bridge_evm]] + +name = "kava" +rpc_addr = "http://IP:PORT" +start-with-bridge = true +```` + + + diff --git a/src/pages/validator/external-chains/linea.mdx b/src/content/docs/validator/external-chains/linea.mdx similarity index 83% rename from src/pages/validator/external-chains/linea.mdx rename to src/content/docs/validator/external-chains/linea.mdx index a47e9ebcf..18798bfc7 100644 --- a/src/pages/validator/external-chains/linea.mdx +++ b/src/content/docs/validator/external-chains/linea.mdx @@ -6,7 +6,7 @@ Instructions to set up your Linea node. ### Requirements -- [Setup your Axelar validator](/validator/setup) +- [Setup your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: 4 cores, 16GB RAM, 100GB Disk - Ubuntu 22.04, Docker(tested on 22.04) - [Official Documentation](https://docs.linea.build/build-on-linea/run-a-node) @@ -49,16 +49,14 @@ cd $HOME - ```bash - mkdir -p $HOME/.linea/config cd $HOME/.linea/config wget -O - genesis.json https://docs.linea.build/files/genesis.json - ``` + ```bash mkdir -p $HOME/.linea/config cd $HOME/.linea/config wget -O + genesis.json https://docs.linea.build/files/geth/mainnet/genesis.json +``` - ```bash - mkdir $HOME/.linea/config cd $HOME/.linea/config wget -O - genesis.json https://docs.linea.build/files/l2-genesis-uat.json - ``` + ```bash mkdir $HOME/.linea/config cd $HOME/.linea/config wget -O + genesis.json https://docs.linea.build/files/geth/sepolia/genesis.json +``` @@ -97,16 +95,14 @@ Set the necessary variables - ```bash - NETWORK_ID="59144" - BOOTNODES="enode://ca2f06aa93728e2883ff02b0c2076329e475fe667a48035b4f77711ea41a73cf6cb2ff232804c49538ad77794185d83295b57ddd2be79eefc50a9dd5c48bbb2e@3.128.49.168:30303" - ``` + ```bash NETWORK_ID="59144" + BOOTNODES="enode://ca2f06aa93728e2883ff02b0c2076329e475fe667a48035b4f77711ea41a73cf6cb2ff232804c49538ad77794185d83295b57ddd2be79eefc50a9dd5c48bbb2e@3.23.106.165:30303,enode://eef91d714494a1ceb6e06e5ce96fe5d7d25d3701b2d2e68c042b33d5fa0e4bf134116e06947b3f40b0f22db08f104504dd2e5c790d8bcbb6bfb1b7f4f85313ec@3.133.179.213:30303,enode://cfd472842582c422c7c98b0f2d04c6bf21d1afb2c767f72b032f7ea89c03a7abdaf4855b7cb2dc9ae7509836064ba8d817572cf7421ba106ac87857836fa1d1b@3.145.12.13:30303" +``` - ```bash - NETWORK_ID="59140" - BOOTNODES="enode://db471f0bad1da4f5e48042d0411bc38d5a245cf30ff76191e454c9ff2e27e57d45009b9c6e50d582c44332b05f2d747a8e995aa20399e80c22b1abb069332dde@3.17.183.45:30303,enode://1b10ff18e0d5055111af8cffe083d8d123ebede1dd5d81b3f8ce069ead6f0e70ec3217a0fa163bebaf1cd87b78e8f630182d703e1aebde93996dd5f67fa89389@18.117.161.184:30303,enode://25a42af9d7573a6299b54bb3c2d6566e59079ab1b94b4d42aa44325252d85f45f0bfe8b40dd476a4ee30c7007b61ab34375875ffa668b73eccc9c32640b17e48@3.20.238.193:30303,enode://3dfed9020ade850dca85d2855d42bfb431d1dbfdaec529ad66773bff434e473c071849dddf9cd43f9c529777a384bf5293463baecd4aea7623e575877fd30024@3.18.97.19:30303,enode://68848179e1bfe737045d19734db8f83ce3f85739d551a1e4c4661486380f69677316445375323172e5fcdbd5e26ccbb94306b647b7ac0468de9e9e775a0fbed6@18.190.156.63:30303" - ``` + ```bash NETWORK_ID="59141" + BOOTNODES="enode://6f20afbe4397e51b717a7c1ad3095e79aee48c835eebd9237a3e8a16951ade1fe0e66e981e30ea269849fcb6ba03d838da37f524fabd2a557474194a2e2604fa@18.221.100.27:31002,enode://ce1e0d8e0500cb5c0ac56bdcdafb2d6320c3a2c5125b5ccf12f5dfc9b47ee74acbcafc32559017613136c9c36a0ce74ba4f83b7fb8244f099f3b15708d9d3129@3.23.75.47:31000,enode://1b026a5eb0ae74300f58987d235ef0e3a550df963345cb3574be3b0b54378bd11f14dfd515a8976f2c2d2826090e9507b8ccc24f896a9ffffffcabcfd996a733@3.129.120.128:31001" +``` @@ -117,7 +113,7 @@ Create the systemd service file `/etc/systemd/system/geth-linea.service` machine, so update the IP address from 0.0.0.0 to your vald machine. -```ini +```bash sudo tee /etc/systemd/system/geth-linea.service &>/dev/null < ```bash [[axelar_bridge_evm]] name = "linea" rpc_addr = "http://IP:PORT" start-with-bridge = true +finality_override = "confirmation" ``` diff --git a/src/content/docs/validator/external-chains/mantle.mdx b/src/content/docs/validator/external-chains/mantle.mdx new file mode 100644 index 000000000..6b6efda8a --- /dev/null +++ b/src/content/docs/validator/external-chains/mantle.mdx @@ -0,0 +1,243 @@ +# Mantle + +import { Callout } from "/src/components/callout"; + +Set up your Mantle RPC node + +## Requirements + +- [Setup your Axelar validator](/validator/setup/overview/) +- Minimum hardware requirements: 8 AWS vCPU+, 16GB RAM, 500GB+ SSD free storage space. +- MacOS or Ubuntu 22.04 (tested on 22.04) +- [Official Documentation](https://github.com/mantlenetworkio/networks/blob/main/run-node-mainnet.md) + +## Prerequisites + +Install docker + +```bash +sudo apt update +sudo apt install snapd +sudo apt-get install jq -y +snap install docker +curl -L https://foundry.paradigm.xyz | bash && source /root/.bashrc && foundryup +``` + +- [Common Docker Compose Commands](/validator/external-chains/optimism/#common-node-operations) + +### Download configs + +```bash +git clone https://github.com/mantlenetworkio/networks.git mantlenetworks +cd mantlenetworks +``` + +### Generate JWT secret and p2p node key + + + + ```bash + mkdir -p mainnet/secret + node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" > mainnet/secret/jwt_secret_txt + cast w n |grep -i "Private Key" |awk -F ": " '{print $2}' |sed 's/0x//' > mainnet/secret/p2p_node_key_txt +``` + + + ```bash + mkdir sepolia/secret + node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" > sepolia/secret/jwt_secret_txt + cast w n |grep -i "Private Key" |awk -F ": " '{print $2}' |sed 's/0x//' > sepolia/secret/p2p_node_key_txt +``` + + + +### Update node config + + + Make sure to set `ETH1_HTTP` to your own Ethereum RPC node for security. + + + + + Set the following config option in + [mainnet/envs/geth.env](https://github.com/mantlenetworkio/networks/blob/99344b50e3b792d91a83ba89304ef6f479585ae7/mainnet/envs/geth.env#L31): + ```bash ETH1_HTTP=your_ethereum_mainnet_l1_node GCMODE=full # or archive ``` + + + Set the following config option in `docker-compose-sepolia.yml` ```bash + OP_NODE_L1_ETH_RPC=your_ethereum_sepolia_l1_node ``` + + + +### Download latest snapshot + +Download the latest snapshot for a quicker sync: [Mainnet](https://github.com/mantlenetworkio/networks/blob/main/run-node-mainnetv2.md) | [Testnet](https://github.com/mantlenetworkio/networks/blob/main/run-node-sepolia.md) + + + + ```bash mkdir -p ./data/mainnet-geth tarball="[latest snapshot].tar" wget + https://s3.ap-southeast-1.amazonaws.com/snapshot.mantle.xyz/${tarball} + tar vxf ${tarball} -C ./data/mainnet-geth +``` + + + ```bash mkdir -p ./data/geth tarball="[latest snapshot].tar" wget + https://s3.ap-southeast-1.amazonaws.com/static.testnet.mantle.xyz/${tarball} + tar vxf ${tarball} -C ./data/geth +``` + + + +### Start the node + + + + ```bash docker compose -f docker-compose-mainnetv2.yml up -d ``` + + + ```bash docker compose -f docker-compose-sepolia.yml up -d ``` + + + +An output similar to the following will be shown: + +```bash +[+] Running 6/6 + ✔ replica 5 layers [⣿⣿⣿⣿⣿] 0B/0B Pulled + ✔ 0cdfa0c98ed7 Pull complete + ✔ da01580fbcc6 Pull complete +[+] Running 1/1 + ✔ Container mantlenetworks-replica-1 Started +``` + +After it is done, verify by listing the services and their status + + + + ```bash docker compose -f docker-compose-mainnetv2.yml ps ``` + + + ```bash docker compose -f docker-compose-sepolia.yml ps ``` + + + +You should see these 2 services running + +```bash +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS +mantlenetworks-op-geth-1 mantlenetworkio/op-geth:v1.0.0-alpha.1 "geth --datadir=/db …" op-geth 7 minutes ago Up 7 minutes 0.0.0.0:8545-8546->8545-8546/tcp, :::8545-8546->8545-8546/tcp, 0.0.0.0:8551->8551/tcp, :::8551->8551/tcp, 30303/tcp, 30303/udp +mantlenetworks-op-node-1 mantlenetworkio/op-node:v1.0.0-alpha.1 "op-node" op-node 7 minutes ago Up 7 minutes +``` + +## Check logs + +#### Verify mantle geth logs + +```bash +docker compose logs op-geth --since 2m -f +``` + +```bash +mantlenetworks-op-geth-1 | INFO [04-01|11:02:21.459] Starting peer-to-peer node instance=Geth/v0.1.0-unstable-e1c72d53-20240312/linux-amd64/go1.20.14 +mantlenetworks-op-geth-1 | INFO [04-01|11:02:21.502] New local node record seq=1,711,969,341,501 id=d90665a63ea4440a ip=127.0.0.1 udp=30300 tcp=30300 +mantlenetworks-op-geth-1 | INFO [04-01|11:02:21.502] Started P2P networking self=enode://904642693e46d2f64234e635d4b3777e23d9227920ea27eaf62d76387eee2ecfe3a1c8881f2cc71b1c68b2e148a6215fc9e4c361b285f1bec9c5f0e92978e408@127.0.0.1:30300 +mantlenetworks-op-geth-1 | INFO [04-01|11:02:21.503] IPC endpoint opened url=/db/geth.ipc +mantlenetworks-op-geth-1 | INFO [04-01|11:02:21.503] Loaded JWT secret file path=/secret/jwt_secret_txt crc32=0x61dfbe40 +mantlenetworks-op-geth-1 | INFO [04-01|11:02:21.503] HTTP server started endpoint=[::]:8545 auth=false prefix= cors=* vhosts=* +mantlenetworks-op-geth-1 | INFO [04-01|11:02:21.503] WebSocket enabled url=ws://[::]:8546 +mantlenetworks-op-geth-1 | INFO [04-01|11:02:21.503] WebSocket enabled url=ws://[::]:8551 +mantlenetworks-op-geth-1 | INFO [04-01|11:02:21.503] HTTP server started endpoint=[::]:8551 auth=true prefix= cors=localhost vhosts=* +mantlenetworks-op-geth-1 | INFO [04-01|11:02:23.907] New local node record seq=1,711,969,341,502 id=d90665a63ea4440a ip=65.108.239.113 udp=30300 tcp=30300 +``` + +It will not import new headers until your op-node is synced, once your op-node is synced, your blast-geth logs should look like this + +```bash +mantlenetworks-op-geth-1 | INFO [02-29|08:08:15.219] Starting work on payload id=0x48323feb74b0d35a +mantlenetworks-op-geth-1 | INFO [02-29|08:08:15.237] Imported new potential chain segment number=3083 hash=96c535..584bd5 blocks=1 txs=1 mgas=0.047 elapsed=16.962ms mgasps=2.768 age=1mo3w1d snapdiffs=606.60KiB triedirty=0.00B +mantlenetworks-op-geth-1 | INFO [02-29|08:08:15.243] Chain head was updated number=3083 hash=96c535..584bd5 root=52730a..6a9c02 elapsed=5.42431ms age=1mo3w1d +mantlenetworks-op-geth-1 | INFO [02-29|08:08:15.256] Starting work on payload id=0x180234ae531457a1 +mantlenetworks-op-geth-1 | INFO [02-29|08:08:15.274] Imported new potential chain segment number=3084 hash=9687bc..de7e94 blocks=1 txs=1 mgas=0.047 elapsed=16.911ms mgasps=2.776 age=1mo3w1d snapdiffs=606.78KiB triedirty=0.00B +mantlenetworks-op-geth-1 | INFO [02-29|08:08:15.285] Chain head was updated number=3084 hash=9687bc..de7e94 root=8081fb..43e327 elapsed=10.075637ms age=1mo3w1d +mantlenetworks-op-geth-1 | INFO [02-29|08:08:15.307] Starting work on payload id=0x44c95802c3652dbd +``` + +#### Verify OP node logs + +```bash +docker compose logs op-node --since 2m -f +``` + +You should see logs like + +```bash +mantlenetworks-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Starting JSON-RPC server" +mantlenetworks-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="metrics disabled" +mantlenetworks-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Starting execution engine driver" +mantlenetworks-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Starting driver" sequencerEnabled=false sequencerStopped=false +mantlenetworks-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Rollup node started" +mantlenetworks-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="State loop started" +mantlenetworks-op-node-1 | t=2024-02-27T07:43:46+0000 lvl=info msg="Loaded current L2 heads" unsafe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 safe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 finalized=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 unsafe_origin=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 safe_origin=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 +mantlenetworks-op-node-1 | t=2024-02-27T07:43:47+0000 lvl=info msg="Walking back L1Block by number" curr=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 next=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 l2block=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 +mantlenetworks-op-node-1 | t=2024-02-27T07:43:47+0000 lvl=info msg="Hit finalized L2 head, returning immediately" unsafe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 safe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 finalized=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 unsafe_origin=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 safe_origin=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 +mantlenetworks-op-node-1 | t=2024-02-27T07:43:47+0000 lvl=info msg="Sync progress" reason="reset derivation work" l2_finalized=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 l2_safe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 l2_unsafe=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 l2_engineSyncTarget=0x26a1c0faad7b041f34569a1bb383f00ab74b335883a44bed53e9f41ced5fd906:0 l2_time=1,704,686,688 l1_derived=0x17728cf4d8e0b4f292d2390a869fd7c632d39e72efb00ca3462b4387c6aa2437:5044255 +``` + +### Verify node sync status + +RPC Endpoint + +```bash +echo "$(curl -4 ifconfig.co):8545" +``` + +#### Method 1: + +```bash +curl -X POST [rpc] -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' | jq +``` + +If you get something like this in response to the above rpc call, your node is setup correctly + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x4e4c" +} +``` + +You can use a [hex to number convertor](https://www.binaryhexconverter.com/hex-to-decimal-converter) to get the block height + +#### Method 2: + +You can also check your status by connecting to geth console + +```bash +docker exec -it mantlenetworks-op-geth-1 geth attach http://localhost:8545 +> eth.blockNumber +1209 # it will show you the latest block - number here is just an example +``` + +You can compare the block height on your node with explorer ([mainnet](https://explorer.mantle.xyz) or [testnet](https://explorer.testnet.mantle.xyz)), +use your RPC node only when it has caught up with the latest block height. + +### Configure vald + +In order for `vald` to connect to your mantle node, your `rpc_addr` should be exposed in +vald's `config.toml` + + + + ```bash [[axelar_bridge_evm]] name = "mantle" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + + + ```bash [[axelar_bridge_evm]] name = "mantle" rpc_addr = "http://IP:PORT" + start-with-bridge = true + +``` + + diff --git a/src/pages/validator/external-chains/moonbeam.mdx b/src/content/docs/validator/external-chains/moonbeam.mdx similarity index 89% rename from src/pages/validator/external-chains/moonbeam.mdx rename to src/content/docs/validator/external-chains/moonbeam.mdx index 471229e81..e9331a2bc 100644 --- a/src/pages/validator/external-chains/moonbeam.mdx +++ b/src/content/docs/validator/external-chains/moonbeam.mdx @@ -1,17 +1,16 @@ # Moonbeam -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Set up your Moonbeam Mainnet or Testnet (Moonbase-Alpha) node. ## Prerequisites -- [Setup your Axelar validator](/validator/setup) +- [Setup your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: 8+ cores CPU , 16GB+ RAM, 500GB+ free storage space. - MacOS or Ubuntu 18.04+ - [Official Documentation](https://docs.moonbeam.network/node-operators/networks/run-a-node/) - ## Install Moonbeam / Moonbase Alpha ### 1. Download compiled binary @@ -22,6 +21,7 @@ Download the [latest release binary](https://github.com/PureStake/moonbeam/tags) wget https://github.com/PureStake/moonbeam/releases/download/v0.23.0/moonbeam ``` + ### 2. Create a service account and copy the binary ```bash @@ -43,9 +43,11 @@ sudo chown -R moonbeam_service /var/lib/alphanet-data After the installation of `moonbeam`, we are now ready to start the node, but to ensure it is running in the background and auto-restarts in case of a server failure, we will set up a service file using systemd. - Note: In the service file below you need to replace `"YOUR-NODE-NAME"` and replace `50% RAM in MB` for 50% of the actual RAM your server has (Example: `--db-cache 16000` if your server has 32GB RAM). - - If you are connecting to Testnet instead (Moonbase Alpha), you will also need to change the path to `/var/lib/alphanet-data/` and add `--chain alphanet`. + Note: In the service file below you need to replace `"YOUR-NODE-NAME"` and + replace `50% RAM in MB` for 50% of the actual RAM your server has (Example: + `--db-cache 16000` if your server has 32GB RAM). If you are connecting to + Testnet instead (Moonbase Alpha), you will also need to change the path to + `/var/lib/alphanet-data/` and add `--chain alphanet`. ```bash diff --git a/src/pages/validator/external-chains/optimism.mdx b/src/content/docs/validator/external-chains/optimism.mdx similarity index 82% rename from src/pages/validator/external-chains/optimism.mdx rename to src/content/docs/validator/external-chains/optimism.mdx index 0f03baf07..d2453a071 100644 --- a/src/pages/validator/external-chains/optimism.mdx +++ b/src/content/docs/validator/external-chains/optimism.mdx @@ -1,19 +1,20 @@ # Optimism -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions to set up your Optimism node. - Note: Mainnet instructions here will only work after the bedrock upgrade is live on mainnet + Note: Mainnet instructions here will only work after the bedrock upgrade is + live on mainnet ## Requirements -- [Setup your Axelar validator](/validator/setup) +- [Setup your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: 8 AWS vCPU+, 16GB RAM, 80GB+ free storage space. - MacOS or Ubuntu 20.04 (tested on 20.04) -- [Official Documentation](https://community.optimism.io/docs/developers/bedrock/node-operator-guide/#) +- [Official Documentation](https://docs.optimism.io/builders/node-operators/rollup-node/#) ## Prerequisites @@ -33,40 +34,54 @@ cp .env.example .env ## Set node config Set the following config options in `simple-optimism-node/.env`: + ```bash - NETWORK_NAME=mainnet -NODE_TYPE=full -BEDROCK_SOURCE=download -# Your Ethereum RPC node endpoint. As an L2, your Optimism node will verify tx finality by -# querying your own Ethereum RPC node. -OP_NODE__RPC_ENDPOINT= -OP_NODE__RPC_TYPE=basic -``` + NETWORK_NAME=op-mainnet + NODE_TYPE=full + # Your Ethereum RPC node endpoint. As an L2, your Optimism node will verify tx finality by + # querying your own Ethereum RPC node. + OP_NODE__RPC_ENDPOINT= + # Specify the beacon endpoint of Layer 1 + OP_NODE__L1_BEACON= + OP_NODE__RPC_TYPE=basic + # HEALTHCHECK__REFERENCE_RPC_PROVIDER - Specify the public RPC endpoint for Layer 2 network you want to operate on for healthchecking. For instance: + # Optimism Mainnet - https://mainnet.optimism.io + # Optimism Sepolia - https://sepolia.optimism.io + HEALTHCHECK__REFERENCE_RPC_PROVIDER= + +```` ```bash - # only goerli is supported for now -NETWORK_NAME=goerli -NODE_TYPE=full -BEDROCK_SOURCE=download -# Your Ethereum RPC node endpoint. As an L2, your Optimism node will verify tx finality by -# querying your own Ethereum RPC node. -OP_NODE__RPC_ENDPOINT= -OP_NODE__RPC_TYPE=basic + NETWORK_NAME=op-sepolia + NODE_TYPE=full + # Your Ethereum RPC node endpoint. As an L2, your Optimism node will verify tx finality by + # querying your own Ethereum RPC node. + OP_NODE__RPC_ENDPOINT= + OP_NODE__RPC_TYPE=basic + # Specify the beacon endpoint of Layer 1 + OP_NODE__L1_BEACON= + OP_NODE__RPC_TYPE=basic + # HEALTHCHECK__REFERENCE_RPC_PROVIDER - Specify the public RPC endpoint for Layer 2 network you want to operate on for healthchecking. For instance: + # Optimism Mainnet - https://mainnet.optimism.io + # Optimism Sepolia - https://sepolia.optimism.io + HEALTHCHECK__REFERENCE_RPC_PROVIDER= ``` ## Start the node + ```bash -docker compose up -d +docker compose up -d --build ``` This should show an output like this: + ```bash ⠿ b08a0a826235 Pull complete 90.5s ⠦ d71d159599c3 Downloading [> ] 6.232kB/487.2kB 91.6s @@ -78,11 +93,13 @@ This should show an output like this: ``` After it is done, verify by listing the services and their status + ```bash docker compose ps ``` You should see these 4 services running + ```bash NAME COMMAND SERVICE STATUS PORTS simple-optimism-node-influxdb-1 "/entrypoint.sh infl…" influxdb running 0.0.0.0:8086->8086/tcp, :::8086->8086/tcp @@ -100,6 +117,7 @@ docker compose logs op-geth -f ``` It will download the bedrock.tar + ```bash simple-optimism-node-op-geth-1 | Still downloading bedrock.tar... simple-optimism-node-op-geth-1 | + CHECKSUM=df843fd53ea905808bc21d0e2dd4620a @@ -109,6 +127,7 @@ simple-optimism-node-op-geth-1 | + return 1 simple-optimism-node-op-geth-1 | + echo 'Still downloading bedrock.tar...' simple-optimism-node-op-geth-1 | + sleep 5s ``` + Once download the server will start, and you will see logs like ```bash @@ -123,6 +142,7 @@ simple-optimism-node-op-geth-1 | INFO [01-22|07:28:21.095] Chain head was updat ```bash docker compose logs op-node -f ``` + You should see logs like ```bash @@ -145,11 +165,13 @@ echo "$(curl -4 ifconfig.co):9991" ``` #### Method 1: + ```bash curl -X POST [rpc] -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' | jq ``` If you get something like this in response to the above rpc call, your node is setup correctly + ```json { "jsonrpc": "2.0", @@ -157,9 +179,11 @@ If you get something like this in response to the above rpc call, your node is s "result": "0x3df827" } ``` + You can use a [hex to number convertor](https://www.binaryhexconverter.com/hex-to-decimal-converter) to get the block height #### Method 2: + You can also check your status by connecting to geth console ```bash @@ -178,46 +202,45 @@ vald's `config.toml` - ```bash - [[axelar_bridge_evm]] - name = "optimism" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` + ```bash [[axelar_bridge_evm]] name = "optimism" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` - ```bash - [[axelar_bridge_evm]] - name = "optimism" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` + ```bash [[axelar_bridge_evm]] name = "optimism" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` ### Common Node Operations First `cd` into the directory + ```bash cd $HOME/simple-optimism-node/ ``` To start + ```bash docker compose up -d ``` To stop + ```bash docker compose down ``` To update + ```bash docker compose pull ``` To stop and wipe out everything + ```bash docker compose down -v ``` diff --git a/src/pages/validator/external-chains/overview.mdx b/src/content/docs/validator/external-chains/overview.mdx similarity index 82% rename from src/pages/validator/external-chains/overview.mdx rename to src/content/docs/validator/external-chains/overview.mdx index 89aafcdb5..c15295bdf 100644 --- a/src/pages/validator/external-chains/overview.mdx +++ b/src/content/docs/validator/external-chains/overview.mdx @@ -1,6 +1,6 @@ # Overview -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; As a validator for the Axelar network, your Axelar node will vote on the status of external blockchains such as Ethereum, Cosmos, etc. Specifically: @@ -23,22 +23,24 @@ See below for details. Read this entire article before you begin supporting exte ## External chains you can support on Axelar - EVM-compatible chains - - [Arbitrum](arbitrum) - - [Avalanche](avalanche) - - [Binance](binance) - - [Celo](celo) - - [Centrifuge](centrifuge) - - [Ethereum](ethereum) - - [Fantom](fantom) - - [Filecoin](filecoin) - - [Immutable zkEVM](immutable) - - [Kava](kava) - - [Mantle](mantle) - - [Scroll](scroll) - - [Moonbeam](moonbeam) - - [Optimism](optimism) - - [Polygon](polygon) - - [Polygon zkEVM](polygon-zkevm) + - [Arbitrum](/validator/external-chains/arbitrum/) + - [Avalanche](/validator/external-chains/avalanche/) + - [Binance](/validator/external-chains/binance/) + - [Blast](/validator/external-chains/blast/) + - [Celo](/validator/external-chains/celo/) + - [Centrifuge](/validator/external-chains/centrifuge/) + - [Ethereum](/validator/external-chains/ethereum/) + - [Fantom](/validator/external-chains/fantom/) + - [Filecoin](/validator/external-chains/filecoin/) + - [Fraxtal](/validator/external-chains/fraxtal/) + - [Immutable zkEVM](/validator/external-chains/immutable/) + - [Kava](/validator/external-chains/kava/) + - [Mantle](/validator/external-chains/mantle/) + - [Scroll](/validator/external-chains/scroll/) + - [Moonbeam](/validator/external-chains/moonbeam/) + - [Optimism](/validator/external-chains/optimism/) + - [Polygon](/validator/external-chains/polygon/) + - [Polygon zkEVM](/validator/external-chains/polygon-zkevm/) - Cosmos chains - Nothing to do. All Cosmos chains are automatically supported by default. @@ -100,15 +102,21 @@ Be sure to set `start-with-bridge` to `true`. ## Restart your companion processes - Caution: Do not stop the `axelar-core` process. If you stop `axelar-core` then you risk downtime for Tendermint consensus, which can result in penalties. + Caution: Do not stop the `axelar-core` process. If you stop `axelar-core` then + you risk downtime for Tendermint consensus, which can result in penalties. - Caution: If `vald`, `tofnd` are stopped for too long then your validator might fail to produce a heartbeat transaction when needed. The risk of this event can be reduced to near-zero if you promptly restart these processes shortly after a recent round of heartbeat transactions. + Caution: If `vald`, `tofnd` are stopped for too long then your validator might + fail to produce a heartbeat transaction when needed. The risk of this event + can be reduced to near-zero if you promptly restart these processes shortly + after a recent round of heartbeat transactions. - Tip: Heartbeat events are emitted every 50 blocks. Your validator typically responds to heartbeat events within 1-2 blocks. It should be safe to restart `vald`, `tofnd` at block heights that are 5-10 mod 50. + Tip: Heartbeat events are emitted every 50 blocks. Your validator typically + responds to heartbeat events within 1-2 blocks. It should be safe to restart + `vald`, `tofnd` at block heights that are 5-10 mod 50. Stop your companion processes `vald`, `tofnd`. @@ -118,11 +126,11 @@ kill -9 $(pgrep tofnd) kill -9 $(pgrep -f "axelard vald-start") ``` -Immediately resume your companion processes `vald`, `tofnd` as per [Launch companion processes](../setup/vald-tofnd). +Immediately resume your companion processes `vald`, `tofnd` as per [Launch companion processes](/validator/setup/vald-tofnd/). ## Check your connections to new chains in vald -Check your `vald` logs to see that your validator node has successfully connected to the new EVM chains you added. [[How to view logs.]](../setup/vald-tofnd) +Check your `vald` logs to see that your validator node has successfully connected to the new EVM chains you added. [[How to view logs.]](/validator/setup/vald-tofnd/) You should see something like: @@ -152,6 +160,7 @@ axelard tx nexus register-chain-maintainer avalanche ethereum fantom moonbeam po Automatic deregistration Your validator could be automatically deregistered as a maintainer for chain C for poor performance. See [Automatic deregistration](#automatic-deregistration) below. + ## Deregister as chain maintainer from an external chain diff --git a/src/content/docs/validator/external-chains/plume.mdx b/src/content/docs/validator/external-chains/plume.mdx new file mode 100644 index 000000000..8ecfa8150 --- /dev/null +++ b/src/content/docs/validator/external-chains/plume.mdx @@ -0,0 +1,308 @@ +# Plume + +import { Callout } from "/src/components/callout"; + +Set up your Plume node. + +## Prerequisites + +- [Setup your Axelar validator](/validator/setup/overview/) +- [Minimum hardware requirements](https://docs.plume.org/plume/developers/how-to-guides/how-to-run-a-node#hardware-requirements): + - Memory: 16 GB RAM + - CPU: 4 CPU cores + - Disk: NVMe SSD storage + - [Docker Engine](https://docs.docker.com/engine/install/) + - [Docker Compose](https://docs.docker.com/compose/install/) +- [Official Documentation](https://docs.plume.org/plume/developers/how-to-guides/how-to-run-a-node) + +## Running a Plume Node + +To run a plume node, you'll have to: + +1. [Run a Celestia DA Server](/validator/external-chains/plume/#1-run-a-celestia-da-server) + +2. [Run a Plume Nitro Node](/validator/external-chains/plume/#2-run-a-plume-nitro-node) + +## 1. Run a Celestia DA Server + +Create `celestia-server.yaml` file with the below config to run the Celestia DAS server. + + + + ```yaml + services: + celestia-server: + image: ghcr.io/celestiaorg/nitro-das-celestia:v0.4.3 + container_name: celestia-server + entrypoint: + - /bin/celestia-server + - --celestia.namespace-id + - "00000d048007a33abfeb" + - --rpc-addr + - "0.0.0.0" + - --rpc-port + - "26657" + - --celestia.rpc + - "CELESTIA_ENDPOINT" + - --log-level + - "DEBUG" + ports: + - "1317:1317" + - "9090:9090" + - "26657:26657" # Celestia RPC Port + - "1095:1095" + - "8080:8080" + ``` + + + ```yaml + services: + celestia-server-mocha: + image: ghcr.io/celestiaorg/nitro-das-celestia:v0.4.3 + container_name: celestia-server-mocha + entrypoint: + - /bin/celestia-server + - --celestia.namespace-id + - "0cd3a18eab940678" # Make sure to use 0cd3a18eab940678 as the Namespace ID for Plume Testnet. + - --rpc-addr + - "0.0.0.0" + - --rpc-port + - "26657" + - --celestia.rpc + - "CELESTIA_MOCHA_ENDPOINT" # Replace with your Celestia Mocha RPC URL + - --log-level + - "DEBUG" + ports: + - "1317:1317" + - "9090:9090" + - "26657:26657" # Celestia RPC Port + - "1095:1095" + - "8080:8080" +``` + + + +### Start Celestia DA Server + +```bash +docker compose -f celestia-server.yaml up -d +``` + +### Check Celestia DA Logs + + + + ```bash + docker logs -f celestia-server + ``` + + + ```bash + docker logs -f celestia-server-mocha + ``` + + + +## 2. Run a Plume Nitro Node + +Create `plume.yaml` file with the below config to run the Plume node. + + + + ```yaml + services: + plume-mainnet: + image: ghcr.io/conduitxyz/plume-nitro:v3.3.2-celestia + container_name: plume-mainnet + restart: unless-stopped + ports: + - "8547:8547" + - "6070:6070" + command: + - --chain.id=98866 + - --chain.name=conduit-orbit-deployer + - --http.addr=0.0.0.0 + - --http.corsdomain=* + - --http.vhosts=* + - --ws.expose-all + - --ws.rpcprefix=/ + - --ws.port=8547 + - --ws.addr=0.0.0.0 + - --ws.origins=* + - --http.api=net,web3,eth,txpool,debug,admin,arb,arbdebug,arbtrace + - --ws.api=net,web3,eth,txpool,debug + - --chain.info-json=[{"chain-id":98866,"parent-chain-id":1,"chain-name":"conduit-orbit-deployer","chain-config":{"chainId":98866,"homesteadBlock":0,"daoForkBlock":null,"daoForkSupport":true,"eip150Block":0,"eip150Hash":"0x0000000000000000000000000000000000000000000000000000000000000000","eip155Block":0,"eip158Block":0,"byzantiumBlock":0,"constantinopleBlock":0,"petersburgBlock":0,"istanbulBlock":0,"muirGlacierBlock":0,"berlinBlock":0,"londonBlock":0,"clique":{"period":0,"epoch":0},"arbitrum":{"EnableArbOS":true,"AllowDebugPrecompiles":false,"DataAvailabilityCommittee":true,"InitialArbOSVersion":32,"InitialChainOwner":"0x5Ec32984332eaB190cA431545664320259D755d8","GenesisBlockNum":0}},"rollup":{"bridge":"0x35381f63091926750F43b2A7401B083263aDEF83","inbox":"0x943fc691242291B74B105e8D19bd9E5DC2fcBa1D","sequencer-inbox":"0x85eC1b9138a8b9659A51e2b51bb0861901040b59","rollup":"0x35c60Cc77b0A8bf6F938B11bd3E9D319a876c2aC","validator-utils":"0x84eA2523b271029FFAeB58fc6E6F1435a280db44","validator-wallet-creator":"0x0A5eC2286bB15893d5b8f320aAbc823B2186BA09","deployed-at":21887008}}] + - --node.celestia-cfg.enable=true + - --node.celestia-cfg.url=http://celestia-ser:26657 + - --node.data-availability.enable=true + - --node.data-availability.rest-aggregator.enable=true + - --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz + - --execution.forwarding-target=https://rpc.plume.org + - --execution.caching.archive + - --parent-chain.connection.url= # Replace with execution layer client like Geth, Erigon, Nethermind, or Reth rpc url + - --parent-chain.blob-client.beacon-url= # Replace with consensus layer client like Lighthouse, Prysm, Nimbus, or Teku rpc url + - --node.staker.enable=false + - --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz + - --node.sequencer=false + - --execution.rpc.tx-fee-cap=100 + - --execution.rpc.gas-cap=500000000 + - --metrics + - --metrics-server.addr=0.0.0.0 + - --metrics-server.port=6070 + - --metrics-server.update-interval=5s + ``` + + + ```yaml + services: + plume-testnet: + image: ghcr.io/conduitxyz/plume-nitro:v3.3.2-celestia + container_name: plume-testnet + restart: unless-stopped + ports: + - "8547:8547" + - "6070:6070" + command: + - --chain.id=98867 + - --chain.name=conduit-orbit-deployer + - --http.addr=0.0.0.0 + - --http.corsdomain=* + - --http.vhosts=* + - --ws.expose-all + - --ws.rpcprefix=/ + - --ws.port=8547 + - --ws.addr=0.0.0.0 + - --ws.origins=* + - --http.api=net,web3,eth,txpool,debug,admin,arb,arbdebug,arbtrace + - --ws.api=net,web3,eth,txpool,debug + - --chain.info-json=[{"chain-id":98867,"parent-chain-id":11155111,"chain-name":"conduit-orbit-deployer","chain-config":{"chainId":98867,"homesteadBlock":0,"daoForkBlock":null,"daoForkSupport":true,"eip150Block":0,"eip150Hash":"0x0000000000000000000000000000000000000000000000000000000000000000","eip155Block":0,"eip158Block":0,"byzantiumBlock":0,"constantinopleBlock":0,"petersburgBlock":0,"istanbulBlock":0,"muirGlacierBlock":0,"berlinBlock":0,"londonBlock":0,"clique":{"period":0,"epoch":0},"arbitrum":{"EnableArbOS":true,"AllowDebugPrecompiles":false,"DataAvailabilityCommittee":true,"InitialArbOSVersion":32,"InitialChainOwner":"0x09a24DD120676EA4034cD47BfA4432a6a87A8a42","GenesisBlockNum":0}},"rollup":{"bridge":"0xC55b89c17d7a35877FA4ea818fea2a70d5765f1c","inbox":"0xb48cdff890199f5De31514024B95F8664F8Af222","sequencer-inbox":"0xbCa991f1831bE1F1E7e5576d5F84A645e70F3E4d","rollup":"0x76268c4a75D1bE588356569acbfE03366d9eDCbD","validator-utils":"0x9d502DD38E6E7FBdd3b7e964345d544ec37f1D72","validator-wallet-creator":"0x684A827456373a0C0379B1C82BA31Ee5E4F88F62","deployed-at":7889627}}] + - --node.celestia-cfg.enable=true + - --node.celestia-cfg.url=http://celestia-server-mocha:26657 + - --node.data-availability.enable=true + - --node.data-availability.rest-aggregator.enable=true + - --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz + - --execution.forwarding-target=https://testnet-rpc.plume.org + - --execution.caching.archive + - --parent-chain.connection.url= # Replace with execution layer client like Geth, Erigon, Nethermind, or Reth rpc url + - --parent-chain.blob-client.beacon-url= # Replace with consensus layer client like Lighthouse, Prysm, Nimbus, or Teku rpc url + - --node.staker.enable=false + - --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz + - --node.sequencer=false + - --execution.rpc.tx-fee-cap=100 + - --execution.rpc.gas-cap=500000000 + - --metrics + - --metrics-server.addr=0.0.0.0 + - --metrics-server.port=6070 + - --metrics-server.update-interval=5s +``` + + + +### Start Plume Nitro Node + + + + ```bash + docker-compose -f plume-mainnet.yaml up -d + ``` + + + ```bash + docker-compose -f plume.yaml up -d + ``` + + + +### Check Plume Nitro Node Logs + + + + ```bash + docker logs plume-mainnet + ``` + + + ```bash + docker logs -f plume-testnet +``` + + + +After a few minutes, you should see lines that look like this. This means your node has started syncing with the network and is receiving blocks. + +```bash +INFO [06-02|08:03:03.483] InboxTracker sequencerBatchCount=3 messageCount=15 l1Block=7,900,124 l1Timestamp=2025-03-14T09:59:00+0000 +INFO [06-02|08:03:03.496] created block l2Block=14 l2BlockHash=8405d0..0bfae6 +INFO [06-02|08:03:04.485] InboxTracker sequencerBatchCount=4 messageCount=16 l1Block=7,902,343 l1Timestamp=2025-03-14T17:50:01+0000 +INFO [06-02|08:03:04.498] created block l2Block=15 l2BlockHash=f48fcc..2f4412 +INFO [06-02|08:03:05.551] InboxTracker sequencerBatchCount=5 messageCount=18 l1Block=7,915,027 l1Timestamp=2025-03-16T14:56:01+0000 +INFO [06-02|08:03:05.568] created block l2Block=16 l2BlockHash=368751..af5f8b +INFO [06-02|08:03:06.124] InboxTracker sequencerBatchCount=6 messageCount=30 l1Block=7,916,951 l1Timestamp=2025-03-16T22:00:09+0000 +INFO [06-02|08:03:06.569] created block l2Block=29 l2BlockHash=c9f179..bb553e +INFO [06-02|08:03:06.655] InboxTracker sequencerBatchCount=7 messageCount=32 l1Block=7,920,611 l1Timestamp=2025-03-17T10:32:32+0000 +INFO [06-02|08:03:07.570] created block l2Block=31 l2BlockHash=37f20a..e11dcc +INFO [06-02|08:03:07.620] InboxTracker sequencerBatchCount=9 messageCount=39 l1Block=7,924,098 l1Timestamp=2025-03-17T22:27:20+0000 +INFO [06-02|08:03:08.381] InboxTracker sequencerBatchCount=11 messageCount=52 l1Block=7,925,945 l1Timestamp=2025-03-18T04:15:34+0000 +INFO [06-02|08:03:08.570] created block l2Block=51 l2BlockHash=1bd97f..28eb52 +``` + +## Ampd Configuration + +Once your node is up and running, you need to add the `Plume` chain to your [ampd daemon's](https://github.com/axelarnetwork/axelar-amplifier/tree/main/ampd) `config.toml`file. This can be done by adding in the following configuration: + + + + ```toml + [[handlers]] + type="MultisigSigner" + chain_name="plume" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + + [[handlers]] + type="EvmMsgVerifier" + chain_name="plume" + chain_finalization="RPCFinalizedBlock" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1nrdqke6tcxjuymg5gyd9x3yg35n3wrgarnj3sqskp98z2xnvlx9q82f63t" + + [[handlers]] + type="EvmVerifierSetVerifier" + chain_name="plume" + chain_finalization="RPCFinalizedBlock" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1nrdqke6tcxjuymg5gyd9x3yg35n3wrgarnj3sqskp98z2xnvlx9q82f63t" + + ``` + + + ```toml + [[handlers]] + type="MultisigSigner" + chain_name="plume" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + + [[handlers]] + type="EvmMsgVerifier" + chain_name="plume" + chain_finalization="RPCFinalizedBlock" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1nrdqke6tcxjuymg5gyd9x3yg35n3wrgarnj3sqskp98z2xnvlx9q82f63t" + + [[handlers]] + type="EvmVerifierSetVerifier" + chain_name="plume" + chain_finalization="RPCFinalizedBlock" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1nrdqke6tcxjuymg5gyd9x3yg35n3wrgarnj3sqskp98z2xnvlx9q82f63t" + + ``` + + + +## Chain Registration + +For your node to be recognized by the Axelar Network, you need to register your verifier's support for the chain with the `ampd` daemon. This can be done by running: + +```bash +ampd register-chain-support amplifier plume +``` diff --git a/src/pages/validator/external-chains/polygon-zkevm.mdx b/src/content/docs/validator/external-chains/polygon-zkevm.mdx similarity index 91% rename from src/pages/validator/external-chains/polygon-zkevm.mdx rename to src/content/docs/validator/external-chains/polygon-zkevm.mdx index b413ca023..73d6132f1 100644 --- a/src/pages/validator/external-chains/polygon-zkevm.mdx +++ b/src/content/docs/validator/external-chains/polygon-zkevm.mdx @@ -1,23 +1,26 @@ # Polygon zkEVM -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions to set up your Polygon ZkEVM node. - Note: Currently ARM-based CPUs are not supported + Note: Currently ARM-based CPUs are not supported ## Requirements -- [Setup your Axelar validator](/validator/setup) + +- [Setup your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: 4 cores, 32G RAM, 128G Disk with high IOPS. -- Ubuntu 22.04, Docker(tested on 22.04) +- Ubuntu 22.04, Docker(tested on 22.04) - [Official Documentation](https://github.com/0xPolygonHermez/zkevm-node/blob/develop/docs/production-setup.md) - [Official Documentation](https://zkevm.polygon.technology/docs/setup-production-node) ## Prerequisites + This is the most straightforward path to run a zkEVM node, and it's perfectly fine for most use cases, This is quite opinionated, feel free to run this software in a different way, for instance it's not needed to use Docker, you could use the Go and C++ binaries directly. Some instructions to install Prerequisites are give here however be sure to check the [official documentation](https://docs.docker.com/compose/install/) to install docker compose in case this doesn't work + ```bash sudo apt-get install jq -y sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname%20-s)-$(uname%20-m)" -o /usr/local/bin/docker-compose @@ -26,6 +29,7 @@ docker-compose --version ``` ## Create necessary directories + You can modify the paths as per your requirements ```bash @@ -36,27 +40,27 @@ mkdir -p ~/.zkevm/data/statedb # ZKEVM NODE POOLDB DATA_ DIR mkdir -p ~/.zkevm/data/pooldb ``` + # Get network configurations + Storing directory paths to variables to reuse - -```bash -ZKEVM_NET=mainnet -``` - - -```bash -ZKEVM_NET=testnet -``` - + + ```bash ZKEVM_NET=mainnet ``` + + + ```bash ZKEVM_NET=testnet ``` + ```bash ZKEVM_DIR=~/.zkevm ZKEVM_CONFIG_DIR=~/.zkevm/config ``` + Fetch network configuration files + ```bash # get zip and unzip into $ZKEVM_DIR curl -L https://github.com/0xPolygonHermez/zkevm-node/releases/latest/download/$ZKEVM_NET.zip > $ZKEVM_NET.zip && unzip -o $ZKEVM_NET.zip -d $ZKEVM_DIR && rm $ZKEVM_NET.zip @@ -65,7 +69,9 @@ cp $ZKEVM_DIR/$ZKEVM_NET/example.env $ZKEVM_CONFIG_DIR/.env ``` ## Set node config + Update the variables in `$ZKEVM_CONFIG_DIR/.env` + ```bash # your network could be either mainnet or testnet, we defined this earlier ZKEVM_NETWORK=$ZKEVM_NET @@ -76,13 +82,17 @@ ZKEVM_NODE_STATEDB_DATA_DIR="$HOME/.zkevm/data/statedb" # ZKEVM NODE POOLDB DATA_ DIR, we created this earlier ZKEVM_NODE_POOLDB_DATA_DIR="$HOME/.zkevm/data/pooldb" ``` + -Note: ZKEVM_NODE_ETHERMAN_URL must point to the validator's ethereum rpc node for security + Note: ZKEVM_NODE_ETHERMAN_URL must point to the validator's ethereum rpc node + for security ## Optional + We will need to use directories defined earlier when we want to pass config and env file to docker-compose, it would be nice to persist them across sessions Add them to your shell file of your choice + ```bash ZKEVM_NET=testnet ZKEVM_DIR=~/.zkevm @@ -90,20 +100,27 @@ ZKEVM_CONFIG_DIR=~/.zkevm/config ``` # Start the node + ```bash sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml up -d ``` + This should show an output like this: + ```bash ⠿ b08a0a826235 Pull complete 90.5s - ⠦ d71d159599c3 Downloading [> ] + ⠦ d71d159599c3 Downloading [> ] ... ``` + After it is done, verify by listing the services and their status + ```bash docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml ps ``` + You should see the following containers running + ```bash docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml ps @@ -115,7 +132,6 @@ zkevm-state-db postgres "docker-entrypoin zkevm-sync hermeznetwork/zkevm-node:v0.1.2 "/bin/sh -c '/app/zk…" zkevm-sync 12 minutes ago Up 12 minutes 8123/tcp ``` - ## Check logs #### Verify zkevm-rpc logs @@ -149,9 +165,6 @@ sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/d sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml logs zkevm-sync -f ``` - - - ```bash curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}' http://localhost:8545 | jq { @@ -161,8 +174,6 @@ curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","metho } ``` - - ## Verify node sync status ### RPC Endpoint @@ -172,11 +183,13 @@ echo "$(curl -4 ifconfig.co):8545" ``` #### Method 1: + ```bash curl -X POST [rpc] -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' | jq ``` If you get something like this in response to the above rpc call, your node is setup correctly + ```json { "jsonrpc": "2.0", @@ -184,6 +197,7 @@ If you get something like this in response to the above rpc call, your node is s "result": "0x3df827" } ``` + You can use a [hex to number convertor](https://www.binaryhexconverter.com/hex-to-decimal-converter) to get the block height You can compare the block height on your node with explorer ([mainnet](https://wallet.polygon.technology) or [testnet](https://wallet.polygon.technology)), @@ -194,34 +208,30 @@ use your RPC node only when it has caught up with the latest block height. In order for `vald` to connect to your Zk EVM node, your `rpc_addr` should be exposed in vald's `config.toml` - - -```bash -[[axelar_bridge_evm]] -name = "polygon-zkevm" -rpc_addr = "http://IP:PORT" -start-with-bridge = true + + + ```bash [[axelar_bridge_evm]] name = "polygon-zkevm" rpc_addr = + "http://IP:PORT" start-with-bridge = true + ``` - - -```bash -[[axelar_bridge_evm]] -name = "polygon-zkevm" -rpc_addr = "http://IP:PORT" -start-with-bridge = true + + + ```bash [[axelar_bridge_evm]] name = "polygon-zkevm" rpc_addr = + "http://IP:PORT" start-with-bridge = true ``` - + ### Common Node Operations - To start + ```bash sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml up -d ``` To stop + ```bash sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml down ``` @@ -231,6 +241,7 @@ To update To update the zkNode software, repeat the setup steps, being careful not to overwrite the configuration files that you have modified. To stop and wipe out everything + ```bash sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml down -v ``` diff --git a/src/content/docs/validator/external-chains/polygon.mdx b/src/content/docs/validator/external-chains/polygon.mdx new file mode 100644 index 000000000..21a45c71e --- /dev/null +++ b/src/content/docs/validator/external-chains/polygon.mdx @@ -0,0 +1,215 @@ +# Polygon + +import { Callout } from "/src/components/callout"; + +Set up your Polygon Mainnet or Testnet (Mumbai) node. + +## Prerequisites + +- [Setup your Axelar validator](/validator/setup/overview/) +- Minimum hardware requirements: 4-8+ core CPU , 16-32GB RAM, 2TB+ SSD free storage space. +- MacOS or Ubuntu 18.04+ +- Build-essential packages +- Golang 1.17+ +- [Official Documentation](https://docs.polygon.technology/pos/how-to/full-node/full-node-binaries) + +## Install required dependencies + +In order to build the `polygon` node, you first need to install all of the required dependencies. + +### 1. Update and install `build-essential` + +```bash +sudo apt-get update +sudo apt-get -y upgrade +sudo apt-get install -y build-essential +``` + +### 2. Install `golang` + +Install the [latest version of golang](https://go.dev/doc/install). + +## Install the Polygon node + +Polygon node consists of 2 layers, Heimdall and Bor. Heimdall is a fork of tendermint and runs in parallel to the Ethereum network, monitoring contracts, and Bor is a fork of go-Ethereum and producing blocks shuffled by Heimdall nodes. You need to install and run both binaries in the correct order, as explained in the following steps. + +Install the latest versions for the network accordingly [heimdall latest release tag](https://github.com/maticnetwork/heimdall/tags) and [bor latest release tag](https://github.com/maticnetwork/bor/tags) + +```bash +# These are examples - check their docs and release page to opt for the right version +HEIMDALL_RELEASE=v1.0.5 +BOR_RELEASE=v1.2.8 +``` + +### 1. Install Heimdall + + + + ```bash curl -L + https://raw.githubusercontent.com/maticnetwork/install/main/heimdall.sh | + bash -s -- $HEIMDALL_RELEASE mainnet sentry +``` + + + ```bash curl -L + https://raw.githubusercontent.com/maticnetwork/install/main/heimdall.sh | + bash -s -- $HEIMDALL_RELEASE amoy sentry +``` + + + +### 2. Install Bor + + + + ```bash curl -L curl -L + https://raw.githubusercontent.com/maticnetwork/install/main/bor.sh | bash -s + -- $BOR_RELEASE mainnet sentry +``` + + + ```bash curl -L curl -L + https://raw.githubusercontent.com/maticnetwork/install/main/bor.sh | bash -s + -- $BOR_RELEASE amoy sentry +``` + + + +## Check Versions + +```bash +heimdalld version --long +bor version +``` + +## Setup and configure node + +### 1. Configure Bor seeds + + + + ```bash sed -i 's|.*\[p2p.discovery\]| \[p2p.discovery\] |g' + /var/lib/bor/config.toml sed -i 's|.*bootnodes =.*| bootnodes = + ["enode://b8f1cc9c5d4403703fbf377116469667d2b1823c0daf16b7250aa576bacf399e42c3930ccfcb02c5df6879565a2b8931335565f0e8d3f8e72385ecf4a4bf160a@3.36.224.80:30303", + "enode://8729e0c825f3d9cad382555f3e46dcff21af323e89025a0e6312df541f4a9e73abfa562d64906f5e59c51fe6f0501b3e61b07979606c56329c020ed739910759@54.194.245.5:30303"]|g' + /var/lib/bor/config.toml chown bor /var/lib/bor +``` + + + ```bash # The Bor seeds don’t need to be configured manually for Amoy + testnet since they’ve already been included at genesis. +``` + + + +### 2. Update service config user permission + +```bash +sed -i 's/User=heimdall/User=$USER/g' /lib/systemd/system/heimdalld.service +sed -i 's/User=bor/User=$$USER/g' /lib/systemd/system/bor.service +``` + +### 3. Open port to public + +Open the `/var/lib/bor/config.toml` and edit host address under jsonrpc.http + +```bash +[jsonrpc] + ipcpath = "/var/lib/bor/bor.ipc" + # ipcdisable = false + # gascap = 50000000 + # evmtimeout = "5s" + # txfeecap = 5.0 + # allow-unprotected-txs = false + # enabledeprecatedpersonal = false + [jsonrpc.http] + enabled = true + port = 8545 + host = "0.0.0.0" # change this to "0.0.0.0" from "127.0.0.1" + api = ["eth", "net", "web3", "txpool", "bor"] + vhosts = ["*"] + corsdomain = ["*"] +``` + +## Sync from snapshot + +### Bor + +```bash +mkdir "/var/lib/bor/chaindata" +``` + + + + ```bash curl -L https://snapshot-download.polygon.technology/snapdown.sh | + bash -s -- --network mainnet --client bor --extract-dir + /var/lib/bor/chaindata --validate-checksum true +``` + + + ```bash curl -L https://snapshot-download.polygon.technology/snapdown.sh | + bash -s -- --network amoy --client bor --extract-dir /var/lib/bor/chaindata + --validate-checksum true +``` + + + +### Heimdall + + + + ```bash curl -L https://snapshot-download.polygon.technology/snapdown.sh | + bash -s -- --network mainnet --client heimdall --extract-dir + /var/lib/heimdall/data --validate-checksum true +``` + + + ```bash curl -L https://snapshot-download.polygon.technology/snapdown.sh | + bash -s -- --network amoy --client heimdall --extract-dir + /var/lib/heimdall/data --validate-checksum true +``` + + + +## Start the services + +```bash +sudo service heimdalld start +sudo service bor start +``` + +## Check logs + +```bash +journalctl -u heimdalld.service -f -n 100 -o cat +journalctl -u heimdalld-rest-server.service -f -n 100 -o cat +journalctl -u bor.service -f -n 100 -o cat +``` + +## Verify RPC + +Once your `Bor` node is fully synced, you can run a cURL request to see the status of your node: + +```bash +curl -H "Content-Type: application/json" -d '{"id":1, "jsonrpc":"2.0", "method": "eth_syncing", "params":[]}' localhost:8545 +``` + +If the node is successfully synced, the output from above will print `{"jsonrpc":"2.0","id":1,"result":false}` + +## Configure vald + +In order for `vald` to connect to your node, your `rpc_addr` should be exposed in +vald's `config.toml` + + + + ```bash [[axelar_bridge_evm]] name = "polygon" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + + + ```bash [[axelar_bridge_evm]] name = "polygon" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + + diff --git a/src/pages/validator/external-chains/scroll.mdx b/src/content/docs/validator/external-chains/scroll.mdx similarity index 85% rename from src/pages/validator/external-chains/scroll.mdx rename to src/content/docs/validator/external-chains/scroll.mdx index 9c47cda5b..81f67b664 100644 --- a/src/pages/validator/external-chains/scroll.mdx +++ b/src/content/docs/validator/external-chains/scroll.mdx @@ -1,24 +1,23 @@ # Scroll - -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Instructions to set up your [Scroll](https://scroll.io) node. ## Requirements -- [Setup your Axelar validator](/validator/setup) +- [Setup your Axelar validator](/validator/setup/overview/) - Minimum hardware requirements: 8vcpu 32GB RAM, 1TB+ free storage space. - MacOS or Ubuntu 22.04 (tested on 22.04) - You will need access to a fully-synced Ethereum Mainnet RPC endpoint - ## Prerequisites ```bash sudo apt-get update sudo apt-get install build-essential -y && sudo apt-get install jq -y ``` +

    #### [Install go](https://go.dev/doc/install) @@ -36,11 +35,15 @@ git branch make nccc_geth mv build/bin/geth /usr/bin/ ``` + - Note: nccc stands for “no circuit capacity checker”. This feature disables an expensive block validation rule that is not crucial on follower nodes. We recommend that you do not enable it. + Note: nccc stands for “no circuit capacity checker”. This feature disables an + expensive block validation rule that is not crucial on follower nodes. We + recommend that you do not enable it. #### Check version + ```bash geth version ``` @@ -50,16 +53,12 @@ geth version You will need access to a fully-synced Ethereum RPC endpoint before running scroll node. - - ```bash - L1_ENDPOINT="your synced Mainnet Ethereum Node" - ``` - - - ```bash - L1_ENDPOINT="your synced Sepolia Ethereum Node" - ``` - + + ```bash L1_ENDPOINT="your synced Mainnet Ethereum Node" ``` + + + ```bash L1_ENDPOINT="your synced Sepolia Ethereum Node" ``` + Please consider opening port `30303` (`UDP` & `TCP`) and enabling discovery so that other nodes can sync data from your node. @@ -80,7 +79,7 @@ Note: The following settings will allow your node to be accessed publicly from a --gcmode archive --cache.noprefetch \ --http --http.vhosts "*" --http.addr "0.0.0.0" --http.port 8545 --http.api "eth,net,web3,debug,scroll" \ --l1.endpoint "$L1_ENDPOINT" --l1.confirmations "finalized" \ - --ws --ws.origins '*' --ws.addr 0.0.0.0 + --ws --ws.origins '*' --ws.addr 0.0.0.0 --rollup.verify Restart=always RestartSec=3 @@ -108,7 +107,7 @@ Note: The following settings will allow your node to be accessed publicly from a --gcmode archive --cache.noprefetch \ --http --http.vhosts "*" --http.addr "0.0.0.0" --http.port 8545 --http.api "eth,net,web3,debug,scroll" \ --l1.endpoint "$L1_ENDPOINT" --l1.confirmations "finalized" \ - --ws --ws.origins '*' --ws.addr 0.0.0.0 + --ws --ws.origins '*' --ws.addr 0.0.0.0 --rollup.verify Restart=always RestartSec=3 @@ -122,10 +121,11 @@ Note: The following settings will allow your node to be accessed publicly from a cat /etc/systemd/system/geth.service ``` - + ## Start the service + ```bash sudo systemctl enable geth.service sudo systemctl daemon-reload @@ -143,6 +143,7 @@ journalctl -u geth.service -f -n 100 -o cat ``` Logs should appear like this + ```bash INFO [09-08|09:19:52.594] Starting L1 message sync service latestProcessedBlock=4,038,000 WARN [09-08|09:19:52.726] Running initial sync of L1 messages before starting l2geth, this might take a while... @@ -156,7 +157,9 @@ INFO [09-08|09:20:42.872] Syncing L1 messages processed=4,0 INFO [09-08|09:20:52.929] Syncing L1 messages processed=4,091,900 confirmed=4,246,270 collected=115 progress(%)=96.365 INFO [09-08|09:22:52.844] Syncing L1 messages processed=4,153,800 confirmed=4,246,270 collected=324,919 progress(%)=97.822 ``` + Wait for to sync L1 messages, and then it should start syncing scroll blockchain + ```bash INFO [09-08|09:25:25.840] L1 message initial sync completed latestProcessedBlock=4,246,270 INFO [09-08|09:25:25.841] created new worker CircuitCapacityChecker ID=4,589,695,372,138,917,397 @@ -182,10 +185,13 @@ INFO [09-08|09:25:41.823] Imported new chain segment blocks=233 tx ## Verify #### Method 1: + ```bash curl -X POST $YOUR_IP:8545 -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' | jq ``` + If you get something like this in response of the above rpc call, your node is setup correctly + ```json { "jsonrpc": "2.0", @@ -199,27 +205,26 @@ If you get something like this in response of the above rpc call, your node is s } } ``` + Wait for `"result"` to become `false` before using it in vald config ```json -{"jsonrpc":"2.0","id":1,"result":false} +{ "jsonrpc": "2.0", "id": 1, "result": false } ``` +

    -#### Method 2: -You can also check your status by connect to geth console -```bash -geth attach http://localhost:8545 -eth.syncing -``` +#### Method 2: You can also check your status by connect to geth console ```bash +geth attach http://localhost:8545 eth.syncing ``` If you get something like this in response, your node is setup correctly + ```json { - currentBlock: 14555, - highestBlock: 577771, - knownStates: 0, - pulledStates: 0, - startingBlock: 0 + "currentBlock": 14555, + "highestBlock": 577771, + "knownStates": 0, + "pulledStates": 0, + "startingBlock": 0 } ``` @@ -242,22 +247,14 @@ In order for `vald` to connect to your Binance Smart Chain node, your `rpc_addr` vald's `config.toml` - - ```bash - [[axelar_bridge_evm]] - name = "scroll" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` - - - ```bash - [[axelar_bridge_evm]] - name = "scroll" - rpc_addr = "http://IP:PORT" - start-with-bridge = true - ``` - + + ```bash [[axelar_bridge_evm]] name = "scroll" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + + + ```bash [[axelar_bridge_evm]] name = "scroll" rpc_addr = "http://IP:PORT" + start-with-bridge = true +``` + - - diff --git a/src/content/docs/validator/external-chains/solana.mdx b/src/content/docs/validator/external-chains/solana.mdx new file mode 100644 index 000000000..781c00300 --- /dev/null +++ b/src/content/docs/validator/external-chains/solana.mdx @@ -0,0 +1,350 @@ +# Solana + +import { Callout } from "/src/components/callout"; + +Instructions to set up your Solana Validator node. + +### Requirements + +- [Setup your Axelar validator](/validator/setup/overview/) +- Minimum hardware requirements: CPUs: 2.8GHz 12 cores / 24 threads, RAM: 256 GB Storage (SSD): 2 TB NVMe drive +- Ubuntu 20.04 +- [Official Documentation](https://docs.anza.xyz/operations/setup-a-validator) + +### Install the Solana CLI + +All commands mentioned in this section should be done on your trusted computer and NOT on a server where you intend to run your validator. + +Install the Agave release on your local (not the server) machine by running: + +```bash +sh -c "$(curl -sSfL https://release.anza.xyz/v2.2.0/install)" +``` + +You can replace v2.2.0 with the release tag matching the software version of your desired release. + +Confirm you have the desired version of solana installed by running: + +```bash +solana --version +``` + +After a successful install, `agave-install update` may be used to easily update the Solana software to a newer version at any time. + +Once you have successfully installed the cli, the next step is to change your config so that it is making requests to the right cluster: + + + + ```bash + export SOLANA_METRICS_CONFIG="host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password" + solana config set --url https://api.mainnet-beta.solana.com + ``` + + + ```bash + export SOLANA_METRICS_CONFIG="host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea" + solana config set --url https://api.testnet.solana.com/ + ``` + + + +### Create a new keypair + +Create a new keypair for your validator, vote account, and authorized withdrawer. + +```bash +solana-keygen new -o validator-keypair.json +solana-keygen new -o vote-account-keypair.json +solana-keygen new -o authorized-withdrawer-keypair.json +``` + +Here’s what each keypair is used for: + +Validator keypair (validator-keypair.json) +This is the identity of your validator node. It signs votes, transactions, and blocks. Think of it as the “identity card” for your validator in the Solana network. + +Vote account keypair (vote-account-keypair.json) +This account holds and tracks your validator’s voting credits. It’s linked to your validator identity and records the validator’s participation in consensus. + +Authorized withdrawer keypair (authorized-withdrawer-keypair.json) +This key has permission to withdraw rewards from the vote account. You can (and often should) separate this from the validator operator to improve security, as it controls the movement of funds. + +Reminder: Even if you’re familiar with keypair management, here’s a quick best practices review: +- Store keypairs securely and back them up safely. +- Never share private keys or store them on insecure machines. +- Set strict file permissions (`chmod 600`). + +### Create a vote account + +Create a vote account for your validator. + +```bash +solana config set --keypair ./validator-keypair.json +``` + +Now verify your account balance of 0: + +```bash +solana balance +``` + +Deposit some SOL into that keypair account in order create a transaction + +```bash +solana airdrop 1 +``` + +The airdrop sub command does not work on mainnet, so you will have to acquire SOL and transfer it into this keypair's account if you are setting up a mainnet validator. + +Create a vote account: + +```bash +solana create-vote-account -ut \ + --fee-payer ./validator-keypair.json \ + ./vote-account-keypair.json \ + ./validator-keypair.json \ + ./authorized-withdrawer-keypair.json +``` + +Note -ut tells the cli command that we would like to use the testnet cluster. If you're creating the RPC node you don't need the vote account. + +Now it's time to connect to the server. SSH into your server. + +### Preparing the system + +All commands mentioned below should be done on a server where you intend to run your validator. + +Create a new Ubuntu user, named sol, for running the validator: + +```bash +sudo adduser sol +sudo usermod -aG sudo sol +``` + +Prepare the hard drives or partitions to be used for the validator: for ledger and AccountsDB. + +Your system will need to be tuned in order to run properly. Your validator may not start without the settings below. + +```bash +sudo bash -c "cat >/etc/sysctl.d/21-agave-validator.conf </etc/security/limits.d/90-solana-nofiles.conf <: +scp vote-account-keypair.json sol@: +``` + +On the validator server, switch to the sol user: + +```bash +su - sol +``` + +### Install the Solana software + +Your remote machine will need the Solana CLI installed to run the Agave validator software. For simplicity, install the cli with user sol. Refer again to Solana's Install Tool or build from source. + +### Create A Validator Startup Script + +In your sol home directory (e.g. ``/home/sol/`), create a folder called `bin`. Inside that folder create a file called validator.sh and make it executable: + +```bash +mkdir -p /home/sol/bin +touch /home/sol/bin/validator.sh +chmod +x /home/sol/bin/validator.sh +``` + +Next, open the validator.sh file for editing and paste the following: + + + + ```text + #!/bin/bash + exec agave-validator \ + --identity ~/validator-keypair.json \ + --vote-account ~/vote-account-keypair.json \ + --known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \ + --known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \ + --known-validator DE1bawNcRJB9rVm3buyMVfr8mBEoyyu73NBovf2oXJsJ \ + --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \ + --only-known-rpc \ + --ledger ledger \ + --rpc-port 8899 \ + --private-rpc \ + --dynamic-port-range 8000-8020 \ + --entrypoint entrypoint.mainnet-beta.solana.com:8001 \ + --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \ + --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \ + --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \ + --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \ + --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \ + --wal-recovery-mode skip_any_corrupted_record \ + --limit-ledger-size + ``` + + + ```text + #!/bin/bash + exec agave-validator \ + --identity validator-keypair.json \ + --vote-account vote-account-keypair.json \ + --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \ + --known-validator dDzy5SR3AXdYWVqbDEkVFdvSPCtS9ihF5kJkHCtXoFs \ + --known-validator Ft5fbkqNa76vnsjYNwjDZUXoTWpP7VYm3mtsaQckQADN \ + --known-validator eoKpUABi59aT4rR9HGS3LcMecfut9x7zJyodWWP43YQ \ + --known-validator 9QxCLckBiJc783jnMvXZubK4wH86Eqqvashtrwvcsgkv \ + --only-known-rpc \ + --ledger ledger \ + --rpc-port 8899 \ + --dynamic-port-range 8000-8020 \ + --entrypoint entrypoint.testnet.solana.com:8001 \ + --entrypoint entrypoint2.testnet.solana.com:8001 \ + --entrypoint entrypoint3.testnet.solana.com:8001 \ + --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \ + --wal-recovery-mode skip_any_corrupted_record \ + --limit-ledger-size + ``` + + + +Refer to `agave-validator --help` for more information on what each flag is doing in this script. You can try running to check if working as expected. + +```bash +tail -f agave-validator.log +``` + +Check also if gossip protocol is working as expected. More information can be found [here](https://docs.anza.xyz/operations/setup-a-validator#gossip-protocol). + +### Creating a service + +Assuming you have a user called sol on your machine, create the file `/etc/systemd/system/sol.service` with the following: + +```text +[Unit] +Description=Solana Validator +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +Restart=always +RestartSec=1 +User=sol +LimitNOFILE=1000000 +LogRateLimitIntervalSec=0 +Environment="PATH=/bin:/usr/bin:/home/sol/.local/share/solana/install/active_release/bin" +ExecStart=/home/sol/bin/validator.sh + +[Install] +WantedBy=multi-user.target +``` + +Ensure that running `/home/sol/bin/validator.sh` manually starts the validator as expected. Don't forget to mark it executable with `chmod +x /home/sol/bin/validator.sh`. + +Start the service with: + +```bash +sudo systemctl enable --now sol +``` + +## RPC node + +Since a Solana RPC server runs the same process as a consensus validator, first follow the instructions above. Below is an example `validator.sh` file for a testnet RPC server. + + + + ```text + #!/bin/bash + exec agave-validator \ + --identity ~/validator-keypair.json \ + --vote-account ~/vote-account-keypair.json \ + --known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \ + --known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \ + --known-validator DE1bawNcRJB9rVm3buyMVfr8mBEoyyu73NBovf2oXJsJ \ + --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \ + --only-known-rpc \ + --full-rpc-api \ + --ledger ledger \ + --no-voting \ + --rpc-port 8899 \ + --private-rpc \ + --dynamic-port-range 8000-8020 \ + --entrypoint entrypoint.mainnet-beta.solana.com:8001 \ + --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \ + --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \ + --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \ + --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \ + --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \ + --wal-recovery-mode skip_any_corrupted_record \ + --limit-ledger-size + ``` + + + ```text + #!/bin/bash + exec agave-validator \ + --identity /home/sol/validator-keypair.json \ + --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \ + --known-validator dDzy5SR3AXdYWVqbDEkVFdvSPCtS9ihF5kJkHCtXoFs \ + --known-validator eoKpUABi59aT4rR9HGS3LcMecfut9x7zJyodWWP43YQ \ + --known-validator 7XSY3MrYnK8vq693Rju17bbPkCN3Z7KvvfvJx4kdrsSY \ + --known-validator Ft5fbkqNa76vnsjYNwjDZUXoTWpP7VYm3mtsaQckQADN \ + --known-validator 9QxCLckBiJc783jnMvXZubK4wH86Eqqvashtrwvcsgkv \ + --only-known-rpc \ + --full-rpc-api \ + --no-voting \ + --ledger /mnt/ledger \ + --accounts /mnt/accounts \ + --log /home/sol/solana-rpc.log \ + --rpc-port 8899 \ + --rpc-bind-address 0.0.0.0 \ + --private-rpc \ + --dynamic-port-range 8000-8020 \ + --entrypoint entrypoint.testnet.solana.com:8001 \ + --entrypoint entrypoint2.testnet.solana.com:8001 \ + --entrypoint entrypoint3.testnet.solana.com:8001 \ + --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \ + --wal-recovery-mode skip_any_corrupted_record \ + --limit-ledger-size + ``` + + diff --git a/src/content/docs/validator/external-chains/stacks.mdx b/src/content/docs/validator/external-chains/stacks.mdx new file mode 100644 index 000000000..4eb0a2088 --- /dev/null +++ b/src/content/docs/validator/external-chains/stacks.mdx @@ -0,0 +1,131 @@ +# Stacks + +import { Callout } from "/src/components/callout"; + +Instructions to set up your Stacks node. + +## Prerequisites + +- [Setup your Axelar validator](/validator/setup/overview/) +- [Minimum hardware requirements](https://docs.stacks.co/guides-and-tutorials/nodes-and-miners/run-a-node-with-docker#requirements): + - Memory: 8 GB RAM + - CPU: 2 CPU cores + - Disk: 500 GB NVMe SSD storage + - [Docker Engine](https://docs.docker.com/engine/install/) + - [Docker Compose](https://docs.docker.com/compose/install/) +- [Official Documentation](https://docs.stacks.co/guides-and-tutorials/nodes-and-miners/run-a-node-with-docker) + +## Setup Stacks Node + +### Clone the Repository + +```bash +git clone https://github.com/stacks-network/stacks-blockchain-docker +cd stacks-blockchain-docker +``` + +Open `manage.sh` script + +```bash +nano +6 manage.sh +``` + +Add the following function to support the newer docker compose syntax + +```bash +docker-compose() { + docker compose "$@" +} +``` + +**Note:** This ensures compatibility with newer Docker versions where docker compose replaces the legacy docker-compose. + +Make the script executable + +```bash +chmod +x manage.sh +``` + +### Start the services + + + + ```bash + ./manage.sh -n mainnet -a start + ``` + + + ```bash + ./manage.sh -n testnet -a start + ``` + + + +### Setup Bitcoin Node + +As Stacks is a Bitcoin layer 2, you will also need to run a Bitcoin node to query the layer 1 state. You can setup the Bitcoin node by going through the following [setup instructions](https://docs.stacks.co/guides-and-tutorials/nodes-and-miners/run-a-bitcoin-node). + +### Check Logs + + + + ```bash + ./manage.sh -n mainnet -a logs + ``` + + + ```bash + ./manage.sh -n testnet -a logs + ``` + + + +After a few minutes, you should see lines that look like this. This means your node has started syncing with the network and is receiving blocks. + +```bash +stacks-blockchain-api | {"level":"info","time":"2025-07-13T12:39:13.914Z","pid":19,"hostname":"e15f871c6dad","name":"stacks-node-event","reqId":"req-7","req":{"method":"POST","url":"/new_burn_block","hostname":"stacks-blockchain-api:3700","remoteAddress":"172.21.0.4","remotePort":60142,"bodySize":184},"msg":"incoming request"} +stacks-blockchain | INFO [1752410353.915124] [stackslib/src/net/relay.rs:2559] [relayer-http://0.0.0.0:20443] Got chunks for unconfigured StackerDB replica, stackerdb_contract_id: SP000000000000000000002Q6VF78.signers-1-2 +stacks-blockchain | INFO [1752410353.917114] [stackslib/src/net/relay.rs:2559] [relayer-http://0.0.0.0:20443] Got chunks for unconfigured StackerDB replica, stackerdb_contract_id: SP000000000000000000002Q6VF78.signers-1-2 +stacks-blockchain | INFO [1752410353.917128] [stackslib/src/net/relay.rs:2559] [relayer-http://0.0.0.0:20443] Got chunks for unconfigured StackerDB replica, stackerdb_contract_id: SP000000000000000000002Q6VF78.signers-1-1 +stacks-blockchain | INFO [1752410353.919038] [stackslib/src/net/relay.rs:2559] [relayer-http://0.0.0.0:20443] Got chunks for unconfigured StackerDB replica, stackerdb_contract_id: SP000000000000000000002Q6VF78.signers-1-2 +stacks-blockchain-api | {"level":"info","time":"2025-07-13T12:39:13.921Z","pid":19,"hostname":"e15f871c6dad","name":"stacks-node-event","reqId":"req-7","res":{"statusCode":200,"method":"POST","url":"/new_burn_block","requestBodySize":184,"responseBodySize":15},"responseTime":6.254112005233765,"msg":"request completed"} +``` + +### Check the following ports to check the block height + +Stacks Blockchain port: + +```bash +curl -sL localhost:20443/v2/info | jq -r +``` + +Stacks Blockchain Api service port: + +```bash +curl -sL localhost:3999 | jq -r +``` + +## Ampd Configuration + +Once your node is up and running, you need to add the `stacks` chain to your [ampd daemon's](https://github.com/axelarnetwork/axelar-amplifier/tree/main/ampd) `config.toml`file. This can be done by adding in the following configuration: + + + + ```toml + TBA + ``` + + + ```toml + TBA + ``` + + + +## Chain Registration + +For your node to be recognized by the Axelar Network, you need to register your verifier's support for the chain with the `ampd` daemon. This can be done by running: + +```bash +ampd register-chain-support amplifier stacks +``` diff --git a/src/content/docs/validator/external-chains/stellar.mdx b/src/content/docs/validator/external-chains/stellar.mdx new file mode 100644 index 000000000..71fb04f3c --- /dev/null +++ b/src/content/docs/validator/external-chains/stellar.mdx @@ -0,0 +1,885 @@ +import { Callout } from "../../../../components/callout"; + +# Stellar + +Set up your Stellar node. + + + These instructions have been tested on version `22.1.0`. Please refer to the official [Stellar releases](https://github.com/stellar/stellar-core/releases) for the latest release + + +## Prerequisites + +- Minimum hardware requirements: At least 4GB of RAM and a 2.40GHz CPU with 6 cores depending on your request load. Disk/Storage is recommended at least 10GB +- MacOS or Ubuntu 18.04+ +- Build-essential packages +- Golang 1.17+ +- [Official Documentation](https://developers.stellar.org/docs/data/rpc/admin-guide) + +## Install required dependencies + +In order to build the `Stellar` node, you first need to install all the required dependencies. +- c++ toolchain and headers that supports c++17 +- clang >= 12.0 (Only >= 14.0 versions are available on 24.04 LTS) +- g++ >= 10.0 +- pkg-config +- bison and flex +- libpq-dev unless you ./configure --disable-postgres in the build step below. +- 64-bit system +- clang-format >= 12 (for make format to work) +- sed and perl +- libunwind-dev +- Rust toolchain (see Installing Rust subsection) +- cargo >= 1.74 +- rust >= 1.74 + + + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + sudo apt-get update + sudo apt-get install -y make git-core libssl-dev pkg-config libclang-18-dev build-essential protobuf-compiler + sudo apt-get install -y libudev-dev + source "$HOME/.cargo/env" + + # common packages + sudo apt-get install git build-essential pkg-config autoconf automake libtool bison flex libpq-dev libunwind-dev parallel sed perl postgresql-common postgresql postgresql-contrib + # if using clang + sudo apt-get install clang-18 + # clang with libstdc++ + sudo apt-get install gcc-10 + # if using g++ or building with libstdc++ + # sudo apt-get install gcc-10 g++-10 cpp-10 + sudo apt-get install clang-format-18 + ``` + + + ```bash + # Install Homebrew (if not already installed) + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + + # Add Homebrew to PATH + echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile + eval "$(/opt/homebrew/bin/brew shellenv)" + + # Install Rust + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + source "$HOME/.cargo/env" + + # Update Homebrew + brew update + + # Install essential packages + brew install make git pkg-config llvm protobuf libpq parallel + + # Install additional development tools + brew install autoconf automake libtool bison flex sed perl + + # Install PostgreSQL + brew install postgresql + brew services start postgresql + + # Install + brew install llvm + brew link --force llvm + brew install gcc + + # Install clang-format + brew install clang-format + + # Configure environment variables (add to ~/.zprofile or ~/.bash_profile) + echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.zprofile + echo 'export LDFLAGS="-L/usr/local/opt/llvm/lib"' >> ~/.zprofile + echo 'export CPPFLAGS="-I/usr/local/opt/llvm/include"' >> ~/.zprofile + source ~/.zprofile + ``` + + + +## Install Stellar-Core + + +Stellar-RPC requires an instance of stellar-core binary on the same host. This is referred to as the Captive Core. Since, we are building RPC from source, we recommend considering two approaches to get the stellar-core binary: + +Install the latest versions for the network accordingly [Stellar core latest release tag](https://github.com/stellar/stellar-core/releases) and [Stellar latest release tag](https://github.com/stellar/stellar-rpc/releases) + +```bash +# These are examples - check their docs and release page to opt for the right version +STELLAR_RELEASE=v22.1.0 +``` + +### 1. Install Stellar Core + + +[Stellar core latest](https://developers.stellar.org/docs/validators/admin-guide/installation) + + + + + ```bash + git clone https://github.com/stellar/stellar-core.git + cd stellar-core + git checkout $STELLAR_RELEASE + git submodule init + git submodule update + ./autogen.sh + ./configure + make + make check + sudo make install + sudo mv stellar-core /usr/bin/ + + ``` + + + ```bash + git clone https://github.com/stellar/stellar-core.git + cd stellar-core + git checkout $STELLAR_RELEASE + git submodule init + git submodule update + ./autogen.sh + ./configure + make + make check + sudo make install + sudo mv stellar-core /usr/bin/ + + ``` + + + + + +### 2. Install Stellar RPC + + +[Stellar RPC latest](https://developers.stellar.org/docs/data/rpc/admin-guide#deploy-your-own-rpc-instance) + + + +```bash +git clone https://github.com/stellar/stellar-rpc.git +cd stellar-rpc +git checkout $STELLAR_RELEASE +make build-stellar-rpc +sudo mv stellar-rpc /usr/bin/ +``` + + +## Check Version + +```bash +stellar-core version +stellar-rpc version +``` + +## Configure Stellar node + +### 1. Create a config directories + +```bash +mkdir -p ~/.stellar/config +mkdir -p ~/.stellar-rpc/config +``` + +### 2. Create the config file for Captive Core + +In your `/.stellar/captive-core` directory create a file called `stellar-core.conf` for your captive core configuration. + +Now in your configuration file you can match Stellar's [mainnet](https://github.com/stellar/go/blob/master/ingest/ledgerbackend/configs/captive-core-pubnet.cfg) configuration and [testnet](https://github.com/stellar/go/blob/master/ingest/ledgerbackend/configs/captive-core-testnet.cfg) configuration. + + + + ```toml + # WARNING! Do not use this config in production. Quorum sets should + # be carefully selected manually. + NETWORK_PASSPHRASE="Public Global Stellar Network ; September 2015" + FAILURE_SAFETY=1 + HTTP_PORT=11626 + PEER_PORT=11725 + + [[HOME_DOMAINS]] + HOME_DOMAIN = "publicnode.org" + QUALITY = "HIGH" + + [[HOME_DOMAINS]] + HOME_DOMAIN = "lobstr" + QUALITY = "HIGH" + + [[HOME_DOMAINS]] + HOME_DOMAIN = "www.franklintempleton.com" + QUALITY = "HIGH" + + [[HOME_DOMAINS]] + HOME_DOMAIN = "satoshipay" + QUALITY = "HIGH" + + [[HOME_DOMAINS]] + HOME_DOMAIN = "stellar.creit.tech" + QUALITY = "HIGH" + + [[HOME_DOMAINS]] + HOME_DOMAIN = "sdf" + QUALITY = "HIGH" + + [[HOME_DOMAINS]] + HOME_DOMAIN = "blockdaemon" + QUALITY = "HIGH" + + [[VALIDATORS]] + ADDRESS = "bootes.publicnode.org:11625" + HISTORY = "curl -sf https://bootes-history.publicnode.org/{0} -o {1}" + HOME_DOMAIN = "publicnode.org" + NAME = "bootes" + PUBLIC_KEY = "GCVJ4Z6TI6Z2SOGENSPXDQ2U4RKH3CNQKYUHNSSPYFPNWTLGS6EBH7I2" + + [[VALIDATORS]] + ADDRESS = "lyra.publicnode.org:11625" + HISTORY = "curl -sf https://lyra-history.publicnode.org/{0} -o {1}" + HOME_DOMAIN = "publicnode.org" + NAME = "lyra" + PUBLIC_KEY = "GCIXVKNFPKWVMKJKVK2V4NK7D4TC6W3BUMXSIJ365QUAXWBRPPJXIR2Z" + + [[VALIDATORS]] + ADDRESS = "hercules.publicnode.org:11625" + HISTORY = "curl -sf https://hercules-history.publicnode.org/{0} -o {1}" + HOME_DOMAIN = "publicnode.org" + NAME = "hercules" + PUBLIC_KEY = "GBLJNN3AVZZPG2FYAYTYQKECNWTQYYUUY2KVFN2OUKZKBULXIXBZ4FCT" + + [[VALIDATORS]] + ADDRESS = "v3.stellar.lobstr.co:11625" + HISTORY = "curl -sf https://archive.v3.stellar.lobstr.co/{0} -o {1}" + HOME_DOMAIN = "lobstr" + NAME = "lobstr_3_north_america" + PUBLIC_KEY = "GD5QWEVV4GZZTQP46BRXV5CUMMMLP4JTGFD7FWYJJWRL54CELY6JGQ63" + + [[VALIDATORS]] + ADDRESS = "v1.stellar.lobstr.co:11625" + HISTORY = "curl -sf https://archive.v1.stellar.lobstr.co/{0} -o {1}" + HOME_DOMAIN = "lobstr" + NAME = "lobstr_1_eu" + PUBLIC_KEY = "GCFONE23AB7Y6C5YZOMKUKGETPIAJA4QOYLS5VNS4JHBGKRZCPYHDLW7" + + [[VALIDATORS]] + ADDRESS = "v2.stellar.lobstr.co:11625" + HISTORY = "curl -sf https://archive.v2.stellar.lobstr.co/{0} -o {1}" + HOME_DOMAIN = "lobstr" + NAME = "lobstr_2_eu" + PUBLIC_KEY = "GCB2VSADESRV2DDTIVTFLBDI562K6KE3KMKILBHUHUWFXCUBHGQDI7VL" + + [[VALIDATORS]] + ADDRESS = "v4.stellar.lobstr.co:11625" + HISTORY = "curl -sf https://archive.v4.stellar.lobstr.co/{0} -o {1}" + HOME_DOMAIN = "lobstr" + NAME = "lobstr_4_asia" + PUBLIC_KEY = "GA7TEPCBDQKI7JQLQ34ZURRMK44DVYCIGVXQQWNSWAEQR6KB4FMCBT7J" + + [[VALIDATORS]] + ADDRESS = "v5.stellar.lobstr.co:11625" + HISTORY = "curl -sf https://archive.v5.stellar.lobstr.co/{0} -o {1}" + HOME_DOMAIN = "lobstr" + NAME = "lobstr_5_india" + PUBLIC_KEY = "GA5STBMV6QDXFDGD62MEHLLHZTPDI77U3PFOD2SELU5RJDHQWBR5NNK7" + + [[VALIDATORS]] + ADDRESS = "stellar2.franklintempleton.com:11625" + HISTORY = "curl -sf https://stellar-history-usc.franklintempleton.com/azuscshf401/{0} -o {1}" + HOME_DOMAIN = "www.franklintempleton.com" + NAME = "FT_SCV_2" + PUBLIC_KEY = "GCMSM2VFZGRPTZKPH5OABHGH4F3AVS6XTNJXDGCZ3MKCOSUBH3FL6DOB" + + [[VALIDATORS]] + ADDRESS = "stellar3.franklintempleton.com:11625" + HISTORY = "curl -sf https://stellar-history-ins.franklintempleton.com/azinsshf401/{0} -o {1}" + HOME_DOMAIN = "www.franklintempleton.com" + NAME = "FT_SCV_3" + PUBLIC_KEY = "GA7DV63PBUUWNUFAF4GAZVXU2OZMYRATDLKTC7VTCG7AU4XUPN5VRX4A" + + [[VALIDATORS]] + ADDRESS = "stellar1.franklintempleton.com:11625" + HISTORY = "curl -sf https://stellar-history-usw.franklintempleton.com/azuswshf401/{0} -o {1}" + HOME_DOMAIN = "www.franklintempleton.com" + NAME = "FT_SCV_1" + PUBLIC_KEY = "GARYGQ5F2IJEBCZJCBNPWNWVDOFK7IBOHLJKKSG2TMHDQKEEC6P4PE4V" + + [[VALIDATORS]] + ADDRESS = "stellar-de-fra.satoshipay.io:11625" + HISTORY = "curl -sf https://stellar-history-de-fra.satoshipay.io/{0} -o {1}" + HOME_DOMAIN = "satoshipay" + NAME = "satoshipay_de" + PUBLIC_KEY = "GC5SXLNAM3C4NMGK2PXK4R34B5GNZ47FYQ24ZIBFDFOCU6D4KBN4POAE" + + [[VALIDATORS]] + ADDRESS = "stellar-sg-sin.satoshipay.io:11625" + HISTORY = "curl -sf https://stellar-history-sg-sin.satoshipay.io/{0} -o {1}" + HOME_DOMAIN = "satoshipay" + NAME = "satoshipay_sg" + PUBLIC_KEY = "GBJQUIXUO4XSNPAUT6ODLZUJRV2NPXYASKUBY4G5MYP3M47PCVI55MNT" + + [[VALIDATORS]] + ADDRESS = "stellar-us-iowa.satoshipay.io:11625" + HISTORY = "curl -sf https://stellar-history-us-iowa.satoshipay.io/{0} -o {1}" + HOME_DOMAIN = "satoshipay" + NAME = "satoshipay_us" + PUBLIC_KEY = "GAK6Z5UVGUVSEK6PEOCAYJISTT5EJBB34PN3NOLEQG2SUKXRVV2F6HZY" + + [[VALIDATORS]] + ADDRESS = "gamma.validator.stellar.creit.tech:11625" + HISTORY = "curl -sf https://gamma-history.validator.stellar.creit.tech/{0} -o {1}" + HOME_DOMAIN = "stellar.creit.tech" + NAME = "Gamma Node Validator" + PUBLIC_KEY = "GBF7QOLFPTHUEDUPTT4ZTULDTA3QXDIO75JHKJN2IYD7YGQLYUTR75BT" + + [[VALIDATORS]] + ADDRESS = "alpha.validator.stellar.creit.tech:11625" + HISTORY = "curl -sf https://alpha-history.validator.stellar.creit.tech/{0} -o {1}" + HOME_DOMAIN = "stellar.creit.tech" + NAME = "Alpha Node Validator" + PUBLIC_KEY = "GBPLJDBFZO2H7QQH7YFCH3HFT6EMC42Z2DNJ2QFROCKETAPY54V4DCZD" + + [[VALIDATORS]] + ADDRESS = "beta.validator.stellar.creit.tech:11625" + HISTORY = "curl -sf https://beta-history.validator.stellar.creit.tech/{0} -o {1}" + HOME_DOMAIN = "stellar.creit.tech" + NAME = "Beta Node Validator" + PUBLIC_KEY = "GDDANSYOYSY5EPSFHBRPCLX6XMHPPLIMHVIDXG6IPQLVVLRI2BN4HMH3" + + [[VALIDATORS]] + ADDRESS = "core-live-b.stellar.org:11625" + HISTORY = "curl -sf http://history.stellar.org/prd/core-live/core_live_002/{0} -o {1}" + HOME_DOMAIN = "sdf" + NAME = "SDF 2" + PUBLIC_KEY = "GCM6QMP3DLRPTAZW2UZPCPX2LF3SXWXKPMP3GKFZBDSF3QZGV2G5QSTK" + + [[VALIDATORS]] + ADDRESS = "core-live-a.stellar.org:11625" + HISTORY = "curl -sf http://history.stellar.org/prd/core-live/core_live_001/{0} -o {1}" + HOME_DOMAIN = "sdf" + NAME = "SDF 1" + PUBLIC_KEY = "GCGB2S2KGYARPVIA37HYZXVRM2YZUEXA6S33ZU5BUDC6THSB62LZSTYH" + + [[VALIDATORS]] + ADDRESS = "core-live-c.stellar.org:11625" + HISTORY = "curl -sf http://history.stellar.org/prd/core-live/core_live_003/{0} -o {1}" + HOME_DOMAIN = "sdf" + NAME = "SDF 3" + PUBLIC_KEY = "GABMKJM6I25XI4K7U6XWMULOUQIQ27BCTMLS6BYYSOWKTBUXVRJSXHYQ" + + [[VALIDATORS]] + ADDRESS = "stellar-full-validator3.bdnodes.net:11625" + HISTORY = "curl -sf https://stellar-full-history3.bdnodes.net/{0} -o {1}" + HOME_DOMAIN = "blockdaemon" + NAME = "Blockdaemon Validator 3" + PUBLIC_KEY = "GAYXZ4PZ7P6QOX7EBHPIZXNWY4KCOBYWJCA4WKWRKC7XIUS3UJPT6EZ4" + + [[VALIDATORS]] + ADDRESS = "stellar-full-validator2.bdnodes.net:11625" + HISTORY = "curl -sf https://stellar-full-history2.bdnodes.net/{0} -o {1}" + HOME_DOMAIN = "blockdaemon" + NAME = "blockdaemon_2" + PUBLIC_KEY = "GAVXB7SBJRYHSG6KSQHY74N7JAFRL4PFVZCNWW2ARI6ZEKNBJSMSKW7C" + + [[VALIDATORS]] + ADDRESS = "stellar-full-validator1.bdnodes.net:11625" + HISTORY = "curl -sf https://stellar-full-history1.bdnodes.net/{0} -o {1}" + HOME_DOMAIN = "blockdaemon" + NAME = "blockdaemon_1" + PUBLIC_KEY = "GAAV2GCVFLNN522ORUYFV33E76VPC22E72S75AQ6MBR5V45Z5DWVPWEU" + ``` + + + ```toml + NETWORK_PASSPHRASE="Test SDF Network ; September 2015" + UNSAFE_QUORUM=true + FAILURE_SAFETY=1 + + [[HOME_DOMAINS]] + HOME_DOMAIN="testnet.stellar.org" + QUALITY="HIGH" + + [[VALIDATORS]] + NAME="sdf_testnet_1" + HOME_DOMAIN="testnet.stellar.org" + PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" + ADDRESS="core-testnet1.stellar.org" + HISTORY="curl -sf http://history.stellar.org/prd/core-testnet/core_testnet_001/{0} -o {1}" + + [[VALIDATORS]] + NAME="sdf_testnet_2" + HOME_DOMAIN="testnet.stellar.org" + PUBLIC_KEY="GCUCJTIYXSOXKBSNFGNFWW5MUQ54HKRPGJUTQFJ5RQXZXNOLNXYDHRAP" + ADDRESS="core-testnet2.stellar.org" + HISTORY="curl -sf http://history.stellar.org/prd/core-testnet/core_testnet_002/{0} -o {1}" + + [[VALIDATORS]] + NAME="sdf_testnet_3" + HOME_DOMAIN="testnet.stellar.org" + PUBLIC_KEY="GC2V2EFSXN6SQTWVYA5EPJPBWWIMSD2XQNKUOHGEKB535AQE2I6IXV2Z" + ADDRESS="core-testnet3.stellar.org" + HISTORY="curl -sf http://history.stellar.org/prd/core-testnet/core_testnet_003/{0} -o {1}" + ``` + + + +### 3. Create the config file for Stellar RPC + +```bash +cd ~/.stellar-rpc/config/ +stellar-rpc gen-config-file +``` + +The `gen-config-file` should create the following configuration that you can add in your `stellar-rpc/config/core.toml` file. + +```toml +# Admin endpoint to listen and serve on. WARNING: this should not be accessible +# from the Internet and does not use TLS. "" (default) disables the admin server +# ADMIN_ENDPOINT = "" + +# path to additional configuration for the Stellar Core configuration file used +# by captive core. It must, at least, include enough details to define a quorum +# set +# CAPTIVE_CORE_CONFIG_PATH = "" + +# Storage location for Captive Core bucket data +CAPTIVE_CORE_STORAGE_PATH = "" + +# establishes how many ledgers exist between checkpoints, do NOT change this +# unless you really know what you are doing +CHECKPOINT_FREQUENCY = 64 + +# configures classic fee stats retention window expressed in number of ledgers +CLASSIC_FEE_STATS_RETENTION_WINDOW = 10 + +# SQLite DB path +DB_PATH = "soroban_rpc.sqlite" + +# Default cap on the amount of events included in a single getEvents response +DEFAULT_EVENTS_LIMIT = 100 + +# Default cap on the amount of transactions included in a single getTransactions +# response +DEFAULT_TRANSACTIONS_LIMIT = 50 + +# Endpoint to listen and serve on +ENDPOINT = "localhost:8000" + +# The friendbot URL to be returned by getNetwork endpoint +# FRIENDBOT_URL = "" + +# comma-separated list of stellar history archives to connect with +HISTORY_ARCHIVE_URLS = [] + +# configures history retention window for transactions and events, expressed in +# number of ledgers, the default value is 120960 which corresponds to about 7 +# days of history +HISTORY_RETENTION_WINDOW = 120960 + +# Ingestion Timeout when bootstrapping data (checkpoint and in-memory +# initialization) and preparing ledger reads +INGESTION_TIMEOUT = "50m0s" + +# format used for output logs (json or text) +# LOG_FORMAT = "text" + +# minimum log severity (debug, info, warn, error) to log +LOG_LEVEL = "info" + +# Maximum amount of events allowed in a single getEvents response +MAX_EVENTS_LIMIT = 10000 + +# The maximum duration of time allowed for processing a getEvents request. When +# that time elapses, the rpc server would return -32001 and abort the request's +# execution +MAX_GET_EVENTS_EXECUTION_DURATION = "10s" + +# The maximum duration of time allowed for processing a getFeeStats request. +# When that time elapses, the rpc server would return -32001 and abort the +# request's execution +MAX_GET_FEE_STATS_EXECUTION_DURATION = "5s" + +# The maximum duration of time allowed for processing a getHealth request. When +# that time elapses, the rpc server would return -32001 and abort the request's +# execution +MAX_GET_HEALTH_EXECUTION_DURATION = "5s" + +# The maximum duration of time allowed for processing a getLatestLedger request. +# When that time elapses, the rpc server would return -32001 and abort the +# request's execution +MAX_GET_LATEST_LEDGER_EXECUTION_DURATION = "5s" + +# The maximum duration of time allowed for processing a getLedgerEntries +# request. When that time elapses, the rpc server would return -32001 and abort +# the request's execution +MAX_GET_LEDGER_ENTRIES_EXECUTION_DURATION = "5s" + +# The maximum duration of time allowed for processing a getNetwork request. When +# that time elapses, the rpc server would return -32001 and abort the request's +# execution +MAX_GET_NETWORK_EXECUTION_DURATION = "5s" + +# The maximum duration of time allowed for processing a getTransactions request. +# When that time elapses, the rpc server would return -32001 and abort the +# request's execution +MAX_GET_TRANSACTIONS_EXECUTION_DURATION = "5s" + +# The maximum duration of time allowed for processing a getTransaction request. +# When that time elapses, the rpc server would return -32001 and abort the +# request's execution +MAX_GET_TRANSACTION_EXECUTION_DURATION = "5s" + +# The maximum duration of time allowed for processing a getVersionInfo request. +# When that time elapses, the rpc server would return -32001 and abort the +# request's execution +MAX_GET_VERSION_INFO_EXECUTION_DURATION = "5s" + +# maximum ledger latency (i.e. time elapsed since the last known ledger closing +# time) considered to be healthy (used for the /health endpoint) +MAX_HEALTHY_LEDGER_LATENCY = "30s" + +# The max request execution duration is the predefined maximum duration of time +# allowed for processing a request. When that time elapses, the server would +# return 504 and abort the request's execution +MAX_REQUEST_EXECUTION_DURATION = "25s" + +# The maximum duration of time allowed for processing a sendTransaction request. +# When that time elapses, the rpc server would return -32001 and abort the +# request's execution +MAX_SEND_TRANSACTION_EXECUTION_DURATION = "15s" + +# The maximum duration of time allowed for processing a simulateTransaction +# request. When that time elapses, the rpc server would return -32001 and abort +# the request's execution +MAX_SIMULATE_TRANSACTION_EXECUTION_DURATION = "15s" + +# Maximum amount of transactions allowed in a single getTransactions response +MAX_TRANSACTIONS_LIMIT = 200 + +# Network passphrase of the Stellar network transactions should be signed for. +# Commonly used values are "Test SDF Future Network ; October 2022", "Test SDF +# Network ; September 2015" and "Public Global Stellar Network ; September 2015" +# NETWORK_PASSPHRASE = "" + +# Enable debug information in preflighting (provides more detailed errors). It +# should not be enabled in production deployments. +PREFLIGHT_ENABLE_DEBUG = true + +# Number of workers (read goroutines) used to compute preflights for the +# simulateTransaction endpoint. Defaults to the number of CPUs. +PREFLIGHT_WORKER_COUNT = 12 + +# Maximum number of outstanding preflight requests for the simulateTransaction +# endpoint. Defaults to the number of CPUs. +PREFLIGHT_WORKER_QUEUE_SIZE = 12 + +# Maximum number of outstanding GetEvents requests +REQUEST_BACKLOG_GET_EVENTS_QUEUE_LIMIT = 1000 + +# Maximum number of outstanding GetFeeStats requests +REQUEST_BACKLOG_GET_FEE_STATS_QUEUE_LIMIT = 100 + +# Maximum number of outstanding GetHealth requests +REQUEST_BACKLOG_GET_HEALTH_QUEUE_LIMIT = 1000 + +# Maximum number of outstanding GetLatestsLedger requests +REQUEST_BACKLOG_GET_LATEST_LEDGER_QUEUE_LIMIT = 1000 + +# Maximum number of outstanding GetLedgerEntries requests +REQUEST_BACKLOG_GET_LEDGER_ENTRIES_QUEUE_LIMIT = 1000 + +# Maximum number of outstanding GetNetwork requests +REQUEST_BACKLOG_GET_NETWORK_QUEUE_LIMIT = 1000 + +# Maximum number of outstanding GetTransactions requests +REQUEST_BACKLOG_GET_TRANSACTIONS_QUEUE_LIMIT = 1000 + +# Maximum number of outstanding GetTransaction requests +REQUEST_BACKLOG_GET_TRANSACTION_QUEUE_LIMIT = 1000 + +# Maximum number of outstanding GetVersionInfo requests +REQUEST_BACKLOG_GET_VERSION_INFO_QUEUE_LIMIT = 1000 + +# Maximum number of outstanding requests +REQUEST_BACKLOG_GLOBAL_QUEUE_LIMIT = 5000 + +# Maximum number of outstanding SendTransaction requests +REQUEST_BACKLOG_SEND_TRANSACTION_QUEUE_LIMIT = 500 + +# Maximum number of outstanding SimulateTransaction requests +REQUEST_BACKLOG_SIMULATE_TRANSACTION_QUEUE_LIMIT = 100 + +# The request execution warning threshold is the predetermined maximum duration +# of time that a request can take to be processed before a warning would be +# generated +REQUEST_EXECUTION_WARNING_THRESHOLD = "5s" + +# configures soroban inclusion fee stats retention window expressed in number of +# ledgers +SOROBAN_FEE_STATS_RETENTION_WINDOW = 50 + +# HTTP port for Captive Core to listen on (0 disables the HTTP server) +STELLAR_CAPTIVE_CORE_HTTP_PORT = 11626 + +# path to stellar core binary +STELLAR_CORE_BINARY_PATH = "/usr/local/bin/stellar-core" + +# Timeout used when submitting requests to stellar-core +STELLAR_CORE_TIMEOUT = "2s" + +# URL used to query Stellar Core (local captive core by default) +# STELLAR_CORE_URL = "" + +# Enable strict toml configuration file parsing. This will prevent unknown +# fields in the config toml from being parsed. +# STRICT = false +``` + +# Run the node + +## Manual + +Make sure the working directory ~/.stellar/data exists and is writable + +```bash +mkdir -p ~/.stellar/data +chmod 700 ~/.stellar/data +``` + +Run + +```bash + cd /Users/username/.stellar/data +stellar-rpc \ + --config-path /Users//.stellar-rpc/config/core.toml \ + --captive-core-config-path /Users//.stellar/captive-core/stellar-core.conf \ +``` + +If all goes well, you should see logs indicating it’s starting up and connecting to testnet. +If you get a `“Database not found”` error, confirm you used `sqlite3:///Users//.stellar/data/stellar.db` (absolute path with triple slash). + +## Ubuntu + +### Create Service + +```bash +BINARY_NAME=stellar-rpc +CONFIG_PATH=$HOME/.stellar-rpc/config/config.toml +sudo tee </dev/null /etc/systemd/system/$BINARY_NAME.service +[Unit] +Description=$BINARY_NAME daemon +After=network-online.target + +[Service] +User=$USER +WorkingDirectory=$HOME/.stellar/ +ExecStart=$(which $BINARY_NAME) --config-path $CONFIG_PATH +Restart=always +RestartSec=3 +LimitNOFILE=65536 + +[Install] +WantedBy=multi-user.target +EOF + + +cat /etc/systemd/system/$BINARY_NAME.service +``` + +### Run Service + +```bash +sudo systemctl enable stellar-rpc +sudo systemctl daemon-reload +sudo systemctl restart stellar-rpc +``` + +## MacOS + +On macOS, you’ll can use a LaunchAgent in ~/Library/LaunchAgents/. For example, create ~/Library/LaunchAgents/com.stellar.rpc.plist: + +```xml + + + + + + Label + com.stellar.rpc + + + ProgramArguments + + + /usr/local/bin/stellar-rpc + + --config-path + /Users/username/.stellar-rpc/config/core.toml + + --captive-core-config-path + /Users/username/.stellar/captive-core/stellar-core.conf + + + + RunAtLoad + + + + KeepAlive + + + + WorkingDirectory + /Users/username/.stellar/data + + + EnvironmentVariables + + PATH + /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin + + + + StandardOutPath + /Users/username/.stellar/data/com.stellar.rpc.out + StandardErrorPath + /Users/username/.stellar/data/com.stellar.rpc.out + + +``` + +### Run Service + +Once the LaunchAgent has been setup you can run the service by running + +```bash +launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.stellar.rpc.plist +launchctl list | grep com.stellar.rpc +# If it appears with a PID, it's running! +``` +To check if the service is running run: + + + ```bash + journalctl -u stellar-rpc.service -n 100 -f -o cat + ``` + + + ```bash + tail -f ~/.stellar/data/com.stellar.rpc.out + ``` + + + +To stop the service run: + +```bash +launchctl remove com.stellar.rpc +``` + + + + +## Verify RPC + +Once your `Stellar` node is fully synced, you can run a cURL request to see the status of your node: + +```bash +curl --location 'http://localhost:8000/' --header 'Content-Type: application/json' --data '{ +"jsonrpc":"2.0", +"id":2, +"method":"getHealth" +}' | jq +``` + +If the node is successfully synced, the output from above will print + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "result": { + "status": "healthy", + "latestLedger": 52909103, + "oldestLedger": 52908928, + "ledgerRetentionWindow": 17280 + } +} +``` + +If your node is still syncing it may return a response as follows: + +```json + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 190 100 145 100 45 71888 22310 --:--:-- --:--:-- --:--:-- 185k +{ + "jsonrpc": "2.0", + "id": 1, + "error": { + "code": -32603, + "message": "[-32603] latency (288h35m28s) since last known ledger closed is too high (>30s)" + } +} +``` + +## Ampd Configuration + +Once your node is up and running, you need to add the `Stellar` chain to your [ampd daemon's](https://github.com/axelarnetwork/axelar-amplifier/tree/main/ampd) `config.toml`file. This can be done by adding in the following configuration: + + + + ```toml + [[handlers]] + type="StellarMsgVerifier" + cosmwasm_contract="axelar1dalnx2yvmu3g3aau8m7fj426fk9u8dnzlr5azvqmr4x82rtclats8lhjmu" + rpc_url="your_own_rpc" + + [[handlers]] + type="StellarVerifierSetVerifier" + cosmwasm_contract="axelar1dalnx2yvmu3g3aau8m7fj426fk9u8dnzlr5azvqmr4x82rtclats8lhjmu" + rpc_url="your_own_rpc" + + [[handlers]] + type = 'MultisigSigner' + chain_name = 'stellar' + cosmwasm_contract = 'axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5' + ``` + + + ```toml + [[handlers]] + type="StellarMsgVerifier" + cosmwasm_contract="axelar1a4wt84rllhuwpdvymj4tql6cugfsmdmau9ufmzcm329yx9st96eqx05uam" + rpc_url="your_own_prc" + + [[handlers]] + type="StellarVerifierSetVerifier" + cosmwasm_contract="axelar1a4wt84rllhuwpdvymj4tql6cugfsmdmau9ufmzcm329yx9st96eqx05uam" + rpc_url="your_own_prc" + + [[handlers]] + type="MultisigSigner" + chain_name="stellar-2025-q1" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + ``` + + + +### Register Chain +For your node to be recognized by the Axelar network, you need to register your chain with the `ampd` daemon. This can be done by running: + +```bash +ampd register-chain-support amplifier stellar +``` + +For the Stellar integration you will need to have `ed25519` key registered. To register this key you must ensure you are running `tofnd` version >1.0.1 + +## Common Issues +Tips & Common Pitfalls +1. Absolute DB path: On macOS, either set `WorkingDirectory` in your plist or use `DB_PATH="/Users/USERNAME/.stellar/data/stellar_rpc.sqlite"`. +1. Logs default to stderr: That’s why StandardErrorPath is where you see everything. +1. To see real-time logs: either run Stellar in the foreground (not via launchd/systemd) or `tail -f` the logs. +1. `“Bootstrap failed: 5: Input/output error”` (macOS) often just means Stellar had a brief exit or stale job. If Stellar is actually running (PID > 0) and syncing, you can ignore it or use a wrapper script that ensures a zero exit code. +1. Missing `history-archive-urls`: Ensure you pass it via `--history-archive-urls` or set HISTORY_ARCHIVE_URLS as an environment variable for stellar-rpc—and never put that key in the Captive Core file. \ No newline at end of file diff --git a/src/content/docs/validator/external-chains/sui.mdx b/src/content/docs/validator/external-chains/sui.mdx new file mode 100644 index 000000000..706ef9020 --- /dev/null +++ b/src/content/docs/validator/external-chains/sui.mdx @@ -0,0 +1,266 @@ +# Sui + +import { Callout } from "/src/components/callout"; + +Instructions to set up your Sui node. + +### Requirements + +- [Setup your Axelar validator](/validator/setup/overview/) +- Minimum hardware requirements: CPUs: 8 physical cores / 16 vCPUs RAM: 128 GB Storage (SSD): 4 TB NVMe drive +- Ubuntu 22.04 +- [Official Documentation](https://docs.sui.io/guides/operator/sui-full-node) + +### Prerequisites + +```bash +sudo apt-get install jq -y +``` + +With the remaining steps in the guide, we assume the user you are using has enough permissions as a `sudoer`. + +### Install Sui + +Check the appropriate version for the network accordingly [in their docs](https://github.com/MystenLabs/sui/releases) + +```bash +# This is an example - check their docs and release page to opt for the right version +SUI_SHA=b8eb8920aeca592d0cf15fbddc7f64ed4aad7202 # ex: testnet-v1.37.3 +``` + +```bash +# verify correct version +echo $SUI_SHA + +# create a temp dir for binaries +cd $HOME +mkdir binaries && cd binaries + +# if you are on linux amd +wget https://releases.sui.io/$SUI_SHA/sui-node https://releases.sui.io/$SUI_SHA/sui +chmod +x * +sudo mv * /usr/bin/ +# verify version +sui-node --version +cd $HOME +``` + +### Download genesis and config files + + + + ```bash + sudo mkdir -p /opt/sui/config/ + sudo chown -R $USER:$USER /opt/sui/config/ + cd /opt/sui/config/ + curl -fLJO https://github.com/MystenLabs/sui-genesis/raw/main/mainnet/genesis.blob + wget -O fullnode.yaml https://raw.githubusercontent.com/MystenLabs/sui/main/crates/sui-config/data/fullnode-template.yaml + ls + ``` + + + ```bash + sudo mkdir -p /opt/sui/config/ + sudo chown -R $USER:$USER /opt/sui/ + cd /opt/sui/config/ + curl -fLJO https://github.com/MystenLabs/sui-genesis/raw/main/testnet/genesis.blob + wget -O fullnode.yaml https://raw.githubusercontent.com/MystenLabs/sui/main/crates/sui-config/data/fullnode-template.yaml + ls + ``` + + + +Edit the `fullnode.yaml` file to include peer nodes for state synchronization. Append the following to the end of the current configuration + + + + ```yaml + p2p-config: + seed-peers: + - address: /dns/mel-00.mainnet.sui.io/udp/8084 + peer-id: d32b55bdf1737ec415df8c88b3bf91e194b59ee3127e3f38ea46fd88ba2e7849 + - address: /dns/ewr-00.mainnet.sui.io/udp/8084 + peer-id: c7bf6cb93ca8fdda655c47ebb85ace28e6931464564332bf63e27e90199c50ee + - address: /dns/ewr-01.mainnet.sui.io/udp/8084 + peer-id: 3227f8a05f0faa1a197c075d31135a366a1c6f3d4872cb8af66c14dea3e0eb66 + - address: /dns/lhr-00.mainnet.sui.io/udp/8084 + peer-id: c619a5e0f8f36eac45118c1f8bda28f0f508e2839042781f1d4a9818043f732c + - address: /dns/sui-mainnet-ssfn-1.nodeinfra.com/udp/8084 + peer-id: 0c52ca8d2b9f51be4a50eb44ace863c05aadc940a7bd15d4d3f498deb81d7fc6 + - address: /dns/sui-mainnet-ssfn-2.nodeinfra.com/udp/8084 + peer-id: 1dbc28c105aa7eb9d1d3ac07ae663ea638d91f2b99c076a52bbded296bd3ed5c + - address: /dns/sui-mainnet-ssfn-ashburn-na.overclock.run/udp/8084 + peer-id: 5ff8461ab527a8f241767b268c7aaf24d0312c7b923913dd3c11ee67ef181e45 + - address: /dns/sui-mainnet-ssfn-dallas-na.overclock.run/udp/8084 + peer-id: e1a4f40d66f1c89559a195352ba9ff84aec28abab1d3aa1c491901a252acefa6 + - address: /dns/ssn01.mainnet.sui.rpcpool.com/udp/8084 + peer-id: fadb7ccb0b7fc99223419176e707f5122fef4ea686eb8e80d1778588bf5a0bcd + - address: /dns/ssn02.mainnet.sui.rpcpool.com/udp/8084 + peer-id: 13783584a90025b87d4604f1991252221e5fd88cab40001642f4b00111ae9b7e + ``` + + + ```yaml + p2p-config: + seed-peers: + - address: /dns/yto-tnt-ssfn-01.testnet.sui.io/udp/8084 + peer-id: 2ed53564d5581ded9b6773970ac2f1c84d39f9edf01308ff5a1ffe09b1add7b3 + - address: /dns/yto-tnt-ssfn-00.testnet.sui.io/udp/8084 + peer-id: 6563732e5ab33b4ae09c73a98fd37499b71b8f03c27b5cc51acc26934974aff2 + - address: /dns/nrt-tnt-ssfn-00.testnet.sui.io/udp/8084 + peer-id: 23a1f7cd901b6277cbedaa986b3fc183f171d800cabba863d48f698f518967e1 + - address: /dns/ewr-tnt-ssfn-00.testnet.sui.io/udp/8084 + peer-id: df8a8d128051c249e224f95fcc463f518a0ebed8986bbdcc11ed751181fecd38 + - address: /dns/lax-tnt-ssfn-00.testnet.sui.io/udp/8084 + peer-id: f9a72a0a6c17eed09c27898eab389add704777c03e135846da2428f516a0c11d + - address: /dns/lhr-tnt-ssfn-00.testnet.sui.io/udp/8084 + peer-id: 9393d6056bb9c9d8475a3cf3525c747257f17c6a698a7062cbbd1875bc6ef71e + - address: /dns/mel-tnt-ssfn-00.testnet.sui.io/udp/8084 + peer-id: c88742f46e66a11cb8c84aca488065661401ef66f726cb9afeb8a5786d83456e + ``` + + + +Download the snapshot from the latest epoch. + +```bash +sui-tool download-formal-snapshot --latest --genesis /opt/sui/config/genesis.blob --network testnet --path /opt/sui/db/ --num-parallel-downloads 50 --no-sign-request +``` + +If you encounter any failures, try lowering the `num-parallel-downloads` value. + +Don't forget also to set the value for `object-store-config.bucket` to the correct value as well in that file: + - `testnet`: `bucket: "mysten-testnet-archives"` + - `mainnet`: `bucket: "mysten-mainnet-archives"` + +### Setup systemd + +Create the systemd service file `/etc/systemd/system/suid.service` + +```bash +sudo tee /etc/systemd/system/suid.service &>/dev/null < + + ```bash [[axelar_bridge_evm]] name = "sui" rpc_addr = "http://ip:9000/" + start-with-bridge = true + ``` + + + ```bash [[axelar_bridge_evm]] name = "sui" rpc_addr = "http://ip:9000/" + start-with-bridge = true + ``` + + + + +## Ampd + +Once your node is up and running, you need to add the `Sui` chain to your [ampd daemon's](https://github.com/axelarnetwork/axelar-amplifier/tree/main/ampd) `config.toml`file. This can be done by adding in the following configuration: + + + + ```toml + [[handlers]] + type="SuiMsgVerifier" + cosmwasm_contract="axelar1sykyha8kzf35kc5hplqk76kdufntjn6w45ntwlevwxp74dqr3rvsq7fazh" + rpc_url="your_own_rpc" + + [[handlers]] + type="SuiVerifierSetVerifier" + cosmwasm_contract="axelar1sykyha8kzf35kc5hplqk76kdufntjn6w45ntwlevwxp74dqr3rvsq7fazh" + rpc_url="your_own_rpc" + + [[handlers]] + type = 'MultisigSigner' + chain_name = 'sui' + cosmwasm_contract = 'axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5' + ``` + + + ```toml + [[handlers]] + type="SuiMsgVerifier" + cosmwasm_contract="axelar1sykyha8kzf35kc5hplqk76kdufntjn6w45ntwlevwxp74dqr3rvsq7fazh" + rpc_url="your_own_rpc" + + [[handlers]] + type="SuiVerifierSetVerifier" + cosmwasm_contract="axelar1sykyha8kzf35kc5hplqk76kdufntjn6w45ntwlevwxp74dqr3rvsq7fazh" + rpc_url="your_own_rpc" + + [[handlers]] + type="MultisigSigner" + chain_name="sui" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + ``` + + diff --git a/src/content/docs/validator/external-chains/xrpl-evm.mdx b/src/content/docs/validator/external-chains/xrpl-evm.mdx new file mode 100644 index 000000000..3e0b4f797 --- /dev/null +++ b/src/content/docs/validator/external-chains/xrpl-evm.mdx @@ -0,0 +1,276 @@ +import { Callout } from "/src/components/callout"; + +# XRPL EVM + + +Setup your XRPL EVM Mainnet or Testnet node. + +## Prerequisites + +- MacOS or Ubuntu 18.04+ +- Build-essential packages +- Golang 1.17+ +- [Official Documentation](https://docs.xrplevm.org/pages/operators/getting-started/system-requirements) + + +| Resource | Minimum Recommendation | Notes | +|-----------------|------------------------------|-----------------------------------------| +| Operating System | Linux (AMD64) | A recent Linux distribution (e.g., Ubuntu 20.04 LTS, CentOS 8, Debian 11) is strongly recommended for stability, security, and compatibility. | +| CPU | 4 Physical Cores or More | Multi-core processors provide enough parallel processing to efficiently handle validation, API requests, and block synchronization. Higher core counts can enhance performance under heavy load. | +| Memory (RAM) | 32GB | Sufficient memory ensures smooth operation during peak network load, handling large state DB operations, and responding to complex smart contract queries. More memory may further improve performance. | +| Storage | 500GB NVMe SSD | A high-performance NVMe SSD provides fast random access and write speeds, which are essential for maintaining a responsive node database and quickly processing state updates. More storage capacity may be required for archive nodes or long-term data retention. | +| Network | 100Mbps | A stable 100Mbps connection or faster ensures timely propagation of blocks, efficient peer discovery, and responsive API endpoints. Lower bandwidth may lead to delayed synchronization or performance bottlenecks. | + +## Install + +To get started with the node setup. + + + This setup has been tested with `exrpd` version `6.0.0` + + +1. Install the latest binary from the official XRPL EVM node [repo](https://github.com/xrplevm/node/releases) +2. Move the binary to your preferred directory +3. Make the binary executable + +```bash +chmod +x exrpd +``` + +4. Confirm if `exrpd` successfully installed by running version command + +```bash + exrpd version +``` + +## Node Configuration + +1. Create the .exrpd directory in your user’s home directory: +```bash +mkdir -p ~/.exrpd +``` +Inside it, you will eventually see two subfolders. The first is `~/.exrpd/config`. The second is `~/.exrpd/data`. + +2. Set the chain id + + + ```bash + exrpd config set client chain-id exrp_1440002-1 + ``` + + + ```bash + exrpd config set client chain-id xrplevm_1449000-1 + ``` + + + ```bash + exrpd config set client chain-id xrplevm_1440000-1 + ``` + + + +3. Initialize the node +Make sure to replace `` with a short ASCII-only name for your node (e.g., my-node). + + + ```bash + exrpd init --chain-id exrp_1440002-1 + ``` + + + ```bash + exrpd init --chain-id xrplevm_1449000-1 + ``` + + + ```bash + exrpd init --chain-id xrplevm_1440000-1 + ``` + + +This step populates the aforementioned `~/.exrpd` directory with the `config` and `data` directories. + +## Download genesis file + + + + ```bash + wget https://raw.githubusercontent.com/Peersyst/xrp-evm-archive/main/poa-devnet/genesis.json -O ~/.exrpd/config/genesis.json + ``` + + + ```bash + wget https://raw.githubusercontent.com/xrplevm/networks/main/testnet/genesis.json \ -O ~/.exrpd/config/genesis.json + ``` + + + ```bash + wget https://raw.githubusercontent.com/xrplevm/networks/main/mainnet/genesis.json \ -O ~/.exrpd/config/genesis.json + ``` + + + +## Download Snapshot + +You can download Peersyst's [snapshot](https://evm-sidechain-snapshots-devnet.s3.us-east-1.amazonaws.com/exrpd.tar.lz4). + + + + Note: you can also download from genesis but genesis was created with `v1.0.0` and if you downloaded the latest `exrpd` you will be running a later version than that. + + +This may take a few hours to complete and will require about ~142gb of storage. Once completed, extract the file into your `~/.exrpd/data` folder. + + + +## Add Peers + +You need peers so that your node can sync with the devnet. The XRPL EVM Devnet provides a text file listing known peers: + +Grab 10 +```bash +PEERS=$(curl -sL https://raw.githubusercontent.com/Peersyst/xrp-evm-archive/main/poa-devnet/peers.txt \ + | sort -R \ + | head -n 10 \ + | awk '{print $1}' \ + | paste -s -d, -) + +``` + +Inject the peers into your `config.toml` file (persistent_peers): + +```bash +sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" \ + ~/.exrpd/config/config.toml +``` + +## Ethereum JSON RPC Compatibility + +The XRP EVM node is a CometBFT Node. The `ampd` daemon however will be attempting to interact with your node as an Ethereum JSON RPC compatible node. To configure your CometBFT Node to support Ethereum JSON RPC functionality you need to update your `app.toml` file. In the JSON RPC section of the `app.toml` update the `enable` flag to `true`. + +```toml +############################################################################### +### JSON RPC Configuration ### +############################################################################### + +[json-rpc] + +# Enable defines if the JSONRPC server should be enabled. +enable = true +``` + +## Run Node + +At this point your `~/.exrpd` file should have a `config` and `data` file. The config should be wired up with various configurations including the +1. `addrbook.json` +1. `app.toml` +1. `client.toml` +1. `config.toml` +1. `config.toml.bak` +1. `genesis.json` +1. `node_key.json` +1. `priv_validator_key.json` + +The `data` directory should contain the data that you extraced from the snpashot you installed before. + +Run the following command to start the node + +```bash +exrpd start +``` + +You should see logs similar to + +```bash +INF starting ABCI with CometBFT module=server +... +INF finalized block block_app_hash=... height=13242560 ... +``` + +### Common Observations in Logs + +1. `“ERR failed to add block ... got an already committed block #XXXX”`. This just means your node already processed the block from a faster peer. +1. `Periodic connect/disconnect messages (e.g., SendTimeout, error with peer ...)` This is normal. Tendermint/CometBFT will drop slow or unresponsive peers and reconnect if needed. +1. `“catching_up”: true` This means your node thinks there are more blocks to fetch. If the Devnet is actively producing blocks, this will remain true until you fully sync. If the network is paused or slow, it may stay true indefinitely, but you’ll still be at the latest block. + +### Common Issues + +1. No peers +- Make sure you updated persistent_peers. +- If you see repeated “No addresses to dial,” your node has zero connections. Re-run the peer script or check the docs for seed nodes. + +2. Genesis or config file errors +- Ensure the chain ID and all fields (like `initial_height`) are in the correct format (typically string in Cosmos). +- Re-download the official genesis.json if in doubt. + +3. Port collisions +- If something else is using 26657, you may need to open ~/.exrpd/config/config.toml and change your RPC ports. + +4. Minimum gas price error +- If you receive an error that says `Error: set min gas price in app.toml or flag or env variable: error in app.toml`. Set the `minimum-gas-prices` field in `app.toml` to a value for example `0.25axrp` + +### Ampd Configuration +Once your node is up and running, you need to add the XRPL-EVM chain to your [ampd daemon's](https://github.com/axelarnetwork/axelar-amplifier/tree/main/ampd) `config.toml`file. This can be done by adding in the following configuration: + + + + + ```toml + [[handlers]] + type="EvmMsgVerifier" + chain_finalization="RPCFinalizedBlock" + chain_name="xrpl-evm" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1q8kn9t39ddpce42atk0d6wpdudr6djqxmz689m3nxy92ck0nnftqxfsuyk" + + [[handlers]] + type="EvmVerifierSetVerifier" + chain_finalization="RPCFinalizedBlock" + chain_name="xrpl-evm" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1q8kn9t39ddpce42atk0d6wpdudr6djqxmz689m3nxy92ck0nnftqxfsuyk" + + [[handlers]] + type="MultisigSigner" + chain_name="xrpl-evm" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + ``` + + + ```toml + [[handlers]] + type="EvmMsgVerifier" + chain_finalization="RPCFinalizedBlock" + chain_name="xrpl-evm" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1q8kn9t39ddpce42atk0d6wpdudr6djqxmz689m3nxy92ck0nnftqxfsuyk" + + [[handlers]] + type="EvmVerifierSetVerifier" + chain_finalization="RPCFinalizedBlock" + chain_name="xrpl-evm" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1q8kn9t39ddpce42atk0d6wpdudr6djqxmz689m3nxy92ck0nnftqxfsuyk" + + [[handlers]] + type="MultisigSigner" + chain_name="xrpl-evm" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + ``` + + + + + + Mainnet config instructions will be added when XRPL-EVM is integrated on mainnet. + + +### Register Chain +For your node to be recognized by the Axelar network, you need to register your chain with the `ampd` daemon. This can be done by running: + +```bash +ampd register-chain-support amplifier xrpl-evm +``` + + diff --git a/src/content/docs/validator/external-chains/xrpl.mdx b/src/content/docs/validator/external-chains/xrpl.mdx new file mode 100644 index 000000000..1b257c893 --- /dev/null +++ b/src/content/docs/validator/external-chains/xrpl.mdx @@ -0,0 +1,225 @@ +import { Callout } from "/src/components/callout"; + +# XRPL + +Node setup guide for your XRP Ledger Testnet or Mainnet validator. + +## Requirements + +- [Set up your Amplifier verifier node](https://docs.axelar.dev/validator/amplifier/verifier-onboarding/) +- Recommended hardware requirements: + * CPU: 3+ GHz 64-bit x86_64 processor with 8+ cores + * Memory: 64 GB RAM + * Disk: 1.5 TB SSD/NVMe +- Ubuntu Linux 18.04+ (tested on 22.04) or Debian 10+ +- [Official Documentation](https://xrpl.org/docs/infrastructure/installation) + +## Install on Ubuntu or Debian Linux + +1. Update repositories: + +```bash +sudo apt -y update +sudo apt -y install apt-transport-https ca-certificates wget gnupg +``` + +2. Add Ripple's package-signing GPG key to your list of trusted keys: + +```bash +sudo install -m 0755 -d /etc/apt/keyrings && \ + wget -qO- https://repos.ripple.com/repos/api/gpg/key/public | \ + sudo gpg --dearmor -o /etc/apt/keyrings/ripple.gpg +``` + +3. Check the fingerprint of the newly-added key: + +```bash +gpg --show-keys /etc/apt/keyrings/ripple.gpg +``` + +The output should include an entry for Ripple such as the following: + +``` +pub rsa3072 2019-02-14 [SC] [expires: 2026-02-17] + C0010EC205B35A3310DC90DE395F97FFCCAFD9A2 +uid TechOps Team at Ripple +sub rsa3072 2019-02-14 [E] [expires: 2026-02-17] +``` + +4. Add the appropriate Ripple repository for your operating system version. Replace `$OS` with: +- `buster` for Debian 10 Buster +- `bullseye` for Debian 11 Bullseye +- `bookworm` for Debian 12 Bookworm +- `bionic` for Ubuntu 18.04 Bionic Beaver +- `jammy` for Ubuntu 22.04 Jammy Jellyfish +- `noble` for Ubuntu 24.04 Noble Numbat + +```bash +echo "deb [signed-by=/etc/apt/keyrings/ripple.gpg] https://repos.ripple.com/repos/rippled-deb $OS stable" | \ + sudo tee -a /etc/apt/sources.list.d/ripple.list +``` + +5. Update the package index to include Ripple's repo and install `rippled`. + +```bash +sudo apt -y update && sudo apt -y install rippled +``` + +6. Configure your node to store at least a month of ledger history. Edit your `rippled.cfg` file located at `/etc/opt/ripple/rippled.cfg`: +- Under the `[node_db]` stanza, update `online_delete` and make sure `advisory_delete=0` (keep the rest of the parameters as is): +``` +[node_db] +online_delete=750000 +advisory_delete=0 +``` +- Uncomment and set the `[ledger_history]` stanza: +``` +[ledger_history] +none +``` + +7. Configure the `[server]` stanza in `rippled.cfg` securely according to your needs. + + + Note: The default `[server]` parameters may allow for unauthorized administrative access to your node. + + +8. Restart the `rippled` service: + +```bash +sudo systemctl restart rippled.service +``` + +9. Check the status of the `rippled` service: + +```bash +sudo systemctl status rippled.service +``` + +If you're configuring a Mainnet `rippled` node, you can skip the next section. + +## Just for Testnet + +If you are setting up a Testnet `rippled` node, first complete the above proccess, and then follow these next steps: + +### 1. Hub configuration + +Edit your `rippled.cfg` file located under `/etc/opt/ripple/rippled.cfg`. + +1. Set an `[ips]` stanza with the Testnet hub: + +``` +[ips] +s.altnet.rippletest.net 51235 +``` + +2. Comment out the previous `[ips]` stanza, if there is one. + +3. Add a `[network_id]` stanza with the appropriate value: + +``` +[network_id] +testnet +``` + +### 2. Trusted validator configuration + +Edit your `validators.txt` file located under `/etc/opt/ripple/validators.txt`. + +1. Uncomment or add the Testnet `[validator_list_sites]` and `[validator_list_keys]` stanzas: + +``` +[validator_list_sites] +https://vl.altnet.rippletest.net + +[validator_list_keys] +ED264807102805220DA0F312E71FC2C69E1552C9C5790F6C25E3729DEB573D5860 +``` + +2. Comment out any previous `[validator_list_sites]`, `[validator_list_keys]`, or `[validators]` stanzas. + +### 3. Restart the server + +```bash +sudo systemctl restart rippled +``` + +You can find more information on connecting to parallel networks [here](https://xrpl.org/docs/infrastructure/configuration/connect-your-rippled-to-the-xrp-test-net). + +## Final checks + +Use the `rippled` commandline interface to see if your server is synced with the network: + +```bash +rippled server_info +``` + +It can take several minutes to sync. When the `server_state` in the response is `full`, then your server is fully synced with the network. + +You can query the node with: + +```bash +curl -H 'Content-Type: application/json' -d '{"method":"server_info","params":[{}]}' http://localhost:5005 +``` + +## Axelar Node Configuration + +Due to a bug in the Cosmos SDK that appears when the database is being read from under heavy load, when `ampd` is trying to broadcast transactions, your Axelar node may run into issues when running (such as an `AppHash` error). An example of such an error may appear as follows: + +`ERR CONSENSUS FAILURE!!! err="precommit step; +2/3 prevoted for an invalid block: wrong Block.Header.AppHash` + +Your node orchestration needs to be updated to perform a `rollback` when a node crashes. The rollback command must be executed **before restarting the Axelar node** to auto-recover from such errors. The rollback can be performed by running: + +```bash +axelard rollback +``` + + +### Ampd Configuration +Once your node is up and running, you need to add the `XRPL` chain to your [ampd daemon's](https://github.com/axelarnetwork/axelar-amplifier/tree/main/ampd) `config.toml`file. This can be done by adding in the following configuration: + + + + ```toml + [[handlers]] + type="XRPLMsgVerifier" + chain_name="xrpl" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar14rd4uyrqyl0tw75gjn8zqfppmy08t3x3wrsujeqp37l0hghduanscfvkz6" + + [[handlers]] + type="XRPLMultisigSigner" + chain_name="xrpl" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + ``` + + + ```toml + [[handlers]] + type="XRPLMsgVerifier" + chain_name="xrpl" + chain_rpc_url="your_own_rpc" + cosmwasm_contract="axelar1pnynr6wnmchutkv6490mdqqxkz54fnrtmq8krqhvglhsqhmu7wzsnc86sy" + + [[handlers]] + type="XRPLMultisigSigner" + chain_name="xrpl" + cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" + ``` + + + + + + + + Mainnet config instructions will be added when XRPL is integrated on mainnet. + + +### Register Chain +For your node to be recognized by the Axelar network, you need to register your chain with the `ampd` daemon. This can be done by running: + +```bash +ampd register-chain-support amplifier xrpl +``` + diff --git a/src/pages/validator/operations/mnemonic-rotation.mdx b/src/content/docs/validator/operations/mnemonic-rotation.mdx similarity index 87% rename from src/pages/validator/operations/mnemonic-rotation.mdx rename to src/content/docs/validator/operations/mnemonic-rotation.mdx index 239d04cd1..9b2f3fb02 100644 --- a/src/pages/validator/operations/mnemonic-rotation.mdx +++ b/src/content/docs/validator/operations/mnemonic-rotation.mdx @@ -1,4 +1,4 @@ -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; # Rotation of mnemonics in tofnd @@ -7,8 +7,9 @@ to slowly rotate out their old `tofnd` mnemonics for improved security. New Axelar key rotations will automatically use the most recent mnemonic generated. - Caution: A validator needs to make sure their old `tofnd` mnemonics are still backed up. - These mnemonics are still in use until the keys generated from them are considered "old" by the Axelar network. + Caution: A validator needs to make sure their old `tofnd` mnemonics are still + backed up. These mnemonics are still in use until the keys generated from them + are considered "old" by the Axelar network. A key becomes _old_ after `x` subsequent key rotations for that EVM chain. (Currently `x=7`.) @@ -38,10 +39,10 @@ It's also useful to perform a health check. Validators are recommended to have processes in place to rotate their `tofnd` mnemonic once every 2 months. -## Recovery of mnmenonics +## Recovery of mnemonics As before, you can import a `tofnd` mnemonic with `tofnd -m import -d $TOFND_HOME`. -If there are no other mnemonics yet in `tofnd` storage then the imported mnemonic will be treated as the *latest mnemonic*, +If there are no other mnemonics yet in `tofnd` storage then the imported mnemonic will be treated as the _latest mnemonic_, and automatically used for future key ids that are rotated to and any previous key ids it was already a part of. Each subsequent imported mnemonic is considered as "old" and so only used for any past key ids that corresponded to it. diff --git a/src/pages/validator/operations/monitoring.mdx b/src/content/docs/validator/operations/monitoring.mdx similarity index 87% rename from src/pages/validator/operations/monitoring.mdx rename to src/content/docs/validator/operations/monitoring.mdx index 288286f8a..6b8ffdc57 100644 --- a/src/pages/validator/operations/monitoring.mdx +++ b/src/content/docs/validator/operations/monitoring.mdx @@ -1,19 +1,20 @@ -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; # Monitoring a Validator or Node There are a few different aspects to monitoring your validator. We need to monitor both the infrastructure and the axelard & supporting processes. ## Infrastructure + Infrastructure setups differ. This varies highly from one setup to another. Here are a few basic metrics to monitor. -* CPU Usage -* Memory Usage -* Disk Usage (I/O) -* Disk Space -* Bandwidth -You can run the node and quickly establish baselines for some of these like disk i/o, bandwidth etc. +- CPU Usage +- Memory Usage +- Disk Usage (I/O) +- Disk Space +- Bandwidth +You can run the node and quickly establish baselines for some of these like disk i/o, bandwidth etc. ## Validator and Supporting Processes @@ -21,7 +22,6 @@ You can run the node and quickly establish baselines for some of these like disk Axelar runs using Tendermint consensus. Several metrics are exposed via the prometheus metrics endpoint by Tendermint. You can find details on the metrics available through tendermint [here](https://docs.tendermint.com/v0.34/tendermint-core/metrics.html). All these metrics are prefixed with `tendermint` e.g `consensus_height` will be `tendermint_consensus_height`. - Here are a few prometheus metrics to alert on, we have also provided sample queries for prometheus where helpful. #### Consensus Height @@ -31,6 +31,7 @@ Make sure the that chain is making progress **Metric Key**: tendermint_consensus_height **Sample Query**: + ``` rate(tendermint_consensus_height[1m])*60 < 5 ``` @@ -40,12 +41,16 @@ rate(tendermint_consensus_height[1m])*60 < 5 Make sure that there are enough peers you are connected to. - When Running a validator behind sentry nodes, the number of peers for the validator will be the number of sentry nodes you have deployed as opposed to the entire network. In this case you want to alert only if the validators peers are less than the number of sentry nodes. + When Running a validator behind sentry nodes, the number of peers for the + validator will be the number of sentry nodes you have deployed as opposed to + the entire network. In this case you want to alert only if the validators + peers are less than the number of sentry nodes. **Metric Key**: tendermint_p2p_peers **Sample Query**: + ``` tendermint_p2p_peers < 10 ``` @@ -61,11 +66,13 @@ This check will differ from one setup to another, but it is worth keeping an eye #### Health Check The health check command should be run to ensure that validator is healthy. The command to run is: + ```sh $AXELARD_HOME/bin/axelard health-check --tofnd-host localhost --operator-addr {VALOPER_ADDR} ``` This should print out an output like this: + ```sh tofnd check: passed broadcaster check: passed @@ -73,23 +80,27 @@ operator check: passed ``` You can create a script that can check output of this command. For instance to ensure tofnd status is passed you can use something like: + ```sh $AXELARD_HOME/bin/axelard health-check --tofnd-host localhost --operator-addr {VALOPER_ADDR} | grep tofnd | awk -F: '{print $2}' | tr -d ' ' ``` #### Chain Maintainers -For all the EVM chains that are active on the network, make sure that your validator is a chain maintainer. To retreieve all chains run the following query: +For all the EVM chains that are active on the network, make sure that your validator is a chain maintainer. To retrieve all chains run the following query: + ```sh axelard q evm chains ``` The query for a specific chain is: + ```sh axelard q nexus chain-maintainers {CHAIN_NAME} ``` To test if your validator is a chain-maintainer, retrieve the `axelarvaloper` address and look for that in the output. For example, for ethereum, the command would look like: + ```sh axelard q nexus chain-maintainers ethereum | grep {VALOPER_ADDR} ``` diff --git a/src/pages/validator/setup/backup.mdx b/src/content/docs/validator/setup/backup.mdx similarity index 64% rename from src/pages/validator/setup/backup.mdx rename to src/content/docs/validator/setup/backup.mdx index c27583339..f0fd59b65 100644 --- a/src/pages/validator/setup/backup.mdx +++ b/src/content/docs/validator/setup/backup.mdx @@ -11,7 +11,7 @@ You must store backup copies of the following data in a safe place: ## Backup your Tendermint validator secret key -As described in [Basic node management](../../node/basic) BACKUP the file `${AXELARD_HOME}/config/priv_validator_key.json`. +As described in [Basic node management](/node/basic/) BACKUP the file `${AXELARD_HOME}/config/priv_validator_key.json`. ## Create and backup accounts @@ -22,11 +22,11 @@ axelard keys add validator --home $AXELARD_HOME axelard keys add broadcaster --home $AXELARD_HOME ``` -As described in [Basic node management](../../node/basic), BACKUP the secret mnemonics for these accounts that are printed to stdout when you crate them. +As described in [Basic node management](/node/basic/), BACKUP the secret mnemonics for these accounts that are printed to stdout when you crate them. ## Create and backup tofnd mnemonic -Similar to your [Axelar keyring](../../node/keyring), your `tofnd` storage is encrypted with a password you choose. Your password must have at least 8 characters. +Similar to your [Axelar keyring](/node/keyring/), your `tofnd` storage is encrypted with a password you choose. Your password must have at least 8 characters. Set `tofnd` password and create `tofnd` mnemonic: diff --git a/src/pages/validator/setup/config.mdx b/src/content/docs/validator/setup/config.mdx similarity index 89% rename from src/pages/validator/setup/config.mdx rename to src/content/docs/validator/setup/config.mdx index e5d67de88..2401dabc4 100644 --- a/src/pages/validator/setup/config.mdx +++ b/src/content/docs/validator/setup/config.mdx @@ -1,13 +1,12 @@ # Configure companion processes -import { Callout } from "/src/components/callout" - +import { Callout } from "/src/components/callout"; Axelar validators need two companion processes called `vald` and `tofnd`. ## Download binaries and initialize configuration -Similar to [Node configuration](../../node/config-node), run `setup-validator.sh` to download and configure `vald` and `tofnd` binaries. In the [`axelerate-community`](https://github.com/axelarnetwork/axelarate-community) repo do: +Similar to [Node configuration](/node/config-node/), run `setup-validator.sh` to download and configure `vald` and `tofnd` binaries. In the [`axelerate-community`](https://github.com/axelarnetwork/axelarate-community) repo do: ```bash ./scripts/setup-validator.sh -n [mainnet|testnet] @@ -25,10 +24,13 @@ gpg --verify [axelard_binary_signature_path] [axelard_binary_path] ``` On github the signatures are attached to the releases. To download the signatures from the axelar-releases AWS Bucket, you can add `.asc` to the end of the binary URL. For example, if the path of the binary is: + ```bash https://axelar-releases.s3.us-east-2.amazonaws.com/axelard/v0.26.0/axelard-darwin-arm64-v0.26.0 ``` + The path for the signature will be: + ```bash https://axelar-releases.s3.us-east-2.amazonaws.com/axelard/v0.26.0/axelard-darwin-arm64-v0.26.0.asc ``` @@ -61,6 +63,6 @@ Later, after you've launched your companion processes and created your validator Relevant files: -- `priv_validator_key.json`, `node_key.json` : Created when you first launched your node as described in [Basic node management](../../node/basic). +- `priv_validator_key.json`, `node_key.json` : Created when you first launched your node as described in [Basic node management](/node/basic/). - `priv_validator_state.json` : Last block height signed by the validator. This prevents double signing old blocks. If it’s content is `{}`, it’ll start signing from a synced node’s latest block - `vald/state.json` : State file specifying the last block processed. If it’s not present, or is too old, vald starts from the latest block instead. diff --git a/src/pages/validator/setup/manual.mdx b/src/content/docs/validator/setup/manual.mdx similarity index 89% rename from src/pages/validator/setup/manual.mdx rename to src/content/docs/validator/setup/manual.mdx index 539861656..f5eb273e1 100644 --- a/src/pages/validator/setup/manual.mdx +++ b/src/content/docs/validator/setup/manual.mdx @@ -1,6 +1,6 @@ # Manual setup -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; ## Prerequisites @@ -11,21 +11,23 @@ import { Callout } from "/src/components/callout" Check the appropriate version for the network accordingly: -- [Mainnet](/resources/mainnet) -- [Testnet](/resources/testnet) +- [Mainnet](/resources/contract-addresses/mainnet/) +- [Testnet](/resources/contract-addresses/testnet/) - ```bash - AXELARD_RELEASE=v0.34.1 -TOFND_RELEASE=v0.10.1 +```bash +AXELARD_RELEASE=v1.1.3 +TOFND_RELEASE=v1.0.1 +WASMVM_RELEASE=v1.3.1 ``` - ```bash - AXELARD_RELEASE=v0.34.1 -TOFND_RELEASE=v0.10.1 +```bash +AXELARD_RELEASE=v1.2.1 +TOFND_RELEASE=v1.0.1 +WASMVM_RELEASE=v1.5.8 ``` @@ -33,7 +35,7 @@ TOFND_RELEASE=v0.10.1 ```bash # verify correct versions -echo $AXELARD_RELEASE $TOFND_RELEASE +echo $AXELARD_RELEASE $TOFND_RELEASE $WASMVM_RELEASE # create a temp dir for binaries cd $HOME @@ -52,11 +54,15 @@ chmod +x * # move to usr bin sudo mv * /usr/bin/ +# get wasmvm library +wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_RELEASE/libwasmvm.x86_64.so -O /usr/local/lib/libwasmvm.x86_64.so + # get out of binaries directory cd $HOME # check versions axelard version +axelard q wasm libwasmvm-version tofnd --help ``` @@ -70,7 +76,7 @@ axelard keys add validator tofnd -m create ``` -To recover exsiting keys +To recover existing keys ```bash axelard keys add broadcaster --recover @@ -107,7 +113,11 @@ echo export BROADCASTER_ADDRESS=$BROADCASTER_ADDRESS >> $HOME/.profile ``` - Protect your keyring password: The following instructions instruct you to store your keyring plaintext password in a file on disk. This instruction is safe only if you can prevent unauthorized access to the file. Use your discretion---substitute your own preferred method for securing your keyring password. + Protect your keyring password: The following instructions instruct you to + store your keyring plaintext password in a file on disk. This instruction is + safe only if you can prevent unauthorized access to the file. Use your + discretion---substitute your own preferred method for securing your keyring + password. Choose a secret `{KEYRING_PASSWORD}` and add the following line to `$HOME/.profile`: @@ -137,8 +147,10 @@ wget https://axelar-mainnet.s3.us-east-2.amazonaws.com/genesis.json -O $HOME/.ax wget https://raw.githubusercontent.com/axelarnetwork/axelarate-community/main/resources/mainnet/seeds.toml -O $HOME/.axelar/config/seeds.toml # set external ip to your config.json file + sed -i.bak 's/external_address = \"\"/external_address = \"'"$(curl -4 ifconfig.co)"':26656\"/g' $HOME/.axelar/config/config.toml -``` + +```` @@ -151,7 +163,7 @@ wget https://raw.githubusercontent.com/axelarnetwork/axelarate-community/main/re # set external ip to your config.json file sed -i.bak 's/external_address = \"\"/external_address = \"'"$(curl -4 ifconfig.co)"':26656\"/g' $HOME/.axelar/config/config.toml -``` +```` @@ -172,7 +184,7 @@ cd $HOME ```bash - axelard tendermint unsafe-reset-all +axelard tendermint unsafe-reset-all URL=\`curl -L https://quicksync.io/axelar.json | jq -r '.[] |select(.file=="axelartestnet-lisbon-3-pruned")|.url'\` echo $URL cd $HOME/.axelar/ @@ -239,7 +251,7 @@ sudo systemctl enable tofnd sudo tee </dev/null /etc/systemd/system/vald.service [Unit] Description=Vald daemon -After=network-online.target +After=network-online.target tofnd.service [Service] User=$USER ExecStart=/usr/bin/sh -c 'echo $KEYRING_PASSWORD | /usr/bin/axelard vald-start --validator-addr $VALIDATOR_OPERATOR_ADDRESS --log_level debug --chain-id $CHAIN_ID --from broadcaster' @@ -316,7 +328,7 @@ axelard tx staking create-validator --yes \ ## Register external chains -See [Support external chains](../external-chains). +See [Support external chains](/validator/external-chains/overview/). ## Upgrade Process @@ -326,7 +338,7 @@ cd binaries # put the tag/version that we are upgrading to # set versions: the below is an example and the numbers should be replaced # AXELARD_RELEASE=v0.17.1 -# TOFND_RELEASE=v0.10.1 +# TOFND_RELEASE=v1.0.1 AXELARD_RELEASE= TOFND_RELEASE= # if we are upgrading tofnd too diff --git a/src/content/docs/validator/setup/overview.mdx b/src/content/docs/validator/setup/overview.mdx new file mode 100644 index 000000000..baf089e15 --- /dev/null +++ b/src/content/docs/validator/setup/overview.mdx @@ -0,0 +1,34 @@ +# Overview + +import { Callout } from "/src/components/callout"; + +An Axelar network validator participates in block creation, multi-party cryptography protocols, and voting. + +Convert your existing Axelar node into a validator by staking AXL tokens and attaching external EVM-compatible blockchains. + +## Prerequisites + +- **Hardware:** Minimum: 16 cores, 16GB RAM, 1.5 TB drive. Recommended: 32 cores, 32 GB RAM, 2 TB+ drive. +- You have downloaded the Axelar blockchain and are comfortable with [Basic node management](/node/basic/). + +MOVE: + +- Your Axelar node has an account named `validator` that you control. Let `{VALIDATOR_ADDR}` denote the address of your `validator` account. +- Backup your `validator` secret mnemonic and your Tendermint consensus secret key as per [Quick sync](/node/join). + +## Steps to become a validator + +1. [Configure companion processes](/validator/setup/config/) +2. [Create and backup accounts](/validator/setup/backup/) +3. [Launch companion processes](/validator/setup/vald-tofnd/) +4. [Register broadcaster proxy](/validator/setup/register-broadcaster/) +5. [Stake AXL tokens on the Axelar network](/resources/tokens/stake-axl/) +6. [Health check](/validator/status/health-check/) +7. [Set up external chains](/validator/external-chains/overview/) + +## Other setup-related tasks + +- [Troubleshoot start-up](/validator/troubleshoot/startup/) +- [Recover validator from mnemonic or secret keys](/validator/setup/manual/#generate-keys) +- [Leave as a validator](/validator/status/leave/) +- [Missed too many blocks](/validator/troubleshoot/missed-too-many-blocks/) diff --git a/src/pages/validator/setup/register-broadcaster.mdx b/src/content/docs/validator/setup/register-broadcaster.mdx similarity index 80% rename from src/pages/validator/setup/register-broadcaster.mdx rename to src/content/docs/validator/setup/register-broadcaster.mdx index b0ca2bbef..d0c23a79e 100644 --- a/src/pages/validator/setup/register-broadcaster.mdx +++ b/src/content/docs/validator/setup/register-broadcaster.mdx @@ -1,11 +1,14 @@ # Register broadcaster proxy -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Axelar validators exchange messages with one another via the Axelar blockchain. Each validator sends these messages from a separate `broadcaster` account. - Caution: A validator can only register one `broadcaster` address throughout its lifetime. This `broadcaster` address cannot be changed after it has been registered. If you need to register a different proxy address then you must also create an entirely new validator. + Caution: A validator can only register one `broadcaster` address throughout + its lifetime. This `broadcaster` address cannot be changed after it has been + registered. If you need to register a different proxy address then you must + also create an entirely new validator. ## Learn your broadcaster account address diff --git a/src/pages/validator/setup/vald-tofnd.mdx b/src/content/docs/validator/setup/vald-tofnd.mdx similarity index 96% rename from src/pages/validator/setup/vald-tofnd.mdx rename to src/content/docs/validator/setup/vald-tofnd.mdx index 3185c1c39..d287d22f4 100644 --- a/src/pages/validator/setup/vald-tofnd.mdx +++ b/src/content/docs/validator/setup/vald-tofnd.mdx @@ -34,7 +34,7 @@ Launch `vald`. Here are two ways to do it: $AXELARD_HOME/bin/axelard vald-start --validator-addr {VALOPER_ADDR} --chain-id $AXELARD_CHAIN_ID --log_level debug --home $AXELARD_HOME ``` -2. **Redirect logs to file.** The password prompt may not be visible because `stdout` is redirected to the log file. In this case you may wish to pipe in your keyring password. See [Keyring backend](../../node/keyring) for more info. +2. **Redirect logs to file.** The password prompt may not be visible because `stdout` is redirected to the log file. In this case you may wish to pipe in your keyring password. See [Keyring backend](/node/keyring/) for more info. ```bash echo $KEYRING_PASSWORD | $AXELARD_HOME/bin/axelard vald-start --validator-addr {VALOPER_ADDR} --chain-id $AXELARD_CHAIN_ID --log_level debug --home $AXELARD_HOME >> ${AXELARD_HOME}/logs/vald.log 2>&1 @@ -44,4 +44,4 @@ View your logs in real time (if you selected option 2 above): ```bash tail -f ${AXELARD_HOME}/logs/vald.log -``` \ No newline at end of file +``` diff --git a/src/pages/validator/setup/health-check.mdx b/src/content/docs/validator/status/health-check.mdx similarity index 95% rename from src/pages/validator/setup/health-check.mdx rename to src/content/docs/validator/status/health-check.mdx index a324d684b..31e073114 100644 --- a/src/pages/validator/setup/health-check.mdx +++ b/src/content/docs/validator/status/health-check.mdx @@ -1,6 +1,6 @@ # Health check -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; Check the status of your validator. @@ -26,4 +26,5 @@ operator check: passed Tip: If you do `axelard health-check` within 50 blocks after first becoming a validator then your validator will not yet post a `heartbeat` transaction. In this case, your heath check might return `stale_tss_heartbeat`. Wait 50 blocks for your validator to automatically post a heartbeat transaction and then try `health-check` again. + diff --git a/src/content/docs/validator/status/leave.mdx b/src/content/docs/validator/status/leave.mdx new file mode 100644 index 000000000..fcaff312e --- /dev/null +++ b/src/content/docs/validator/status/leave.mdx @@ -0,0 +1,49 @@ +import { Callout } from "../../../../components/callout"; + +# Leave the network as a validator + +{/* [TODO revise. 2 metrics: consensus bonded/active and tss bonded/active.] */} + +1. Deactivate your broadcaster account. + +```bash +axelard tx snapshot deactivate-proxy --from validator -y -b block +``` + +2. Query your network’s key‐rotation window and (optionally) opt out of future rotations. + +- Fetch the multisig module parameters and note the `activeEpochCount` +```bash +axelard query multisig params +``` + + + Note: Fetching the `activeEpochCount` ensures you know exactly how many rotation cycles you must wait before none of your keys remain active + + + +3. Wait for your keys to fully rotate out. + +- Key rotation runs roughly once per day. You must wait activeEpochCount full rotations (e.g. 5 days by default) after deactivating your proxy (and/or after opt-out) before no of your keys remain in the edge contract’s active list. Only then can you safely unbond + +4. Release your staked coins. + +```bash +axelard tx staking unbond [axelarvaloper address] [amount]uaxl --from validator -y -b block +``` + +eg: + +```bash +axelard tx staking unbond "$(axelard keys show validator --bech val -a)" 100000000uaxl --from validator -y -b block +``` + +`amount` refers to how many coins you wish to remove from the stake. You can change the amount. + +To preserve network stability, the staked coins are held for roughly 1 day starting from the unbond request before being unlocked and returned to the `validator` account. + + + + + If you are a Validator that received a delegation from the Axelar Foundation then you may need to reach out to the Foundation to assist with undelegating your staked AXL. You can reach-out at delegations@axelar.foundation. + \ No newline at end of file diff --git a/src/pages/learn/validators.mdx b/src/content/docs/validator/status/register-external-chains.mdx similarity index 98% rename from src/pages/learn/validators.mdx rename to src/content/docs/validator/status/register-external-chains.mdx index 3389b527c..1d3c00060 100644 --- a/src/pages/learn/validators.mdx +++ b/src/content/docs/validator/status/register-external-chains.mdx @@ -4,7 +4,7 @@ Learn about what happens when Axelar network adds support for new chains, and th ## Background -Axelar provides cross-chain interoperability across all supported chains. These supported chains currently belong under two broad categories, being either EVM based chains, or Cosmos IBC based chains.The next section describes what role validators play when Axelar onboards a new chain. +Axelar provides cross-chain interoperability across all supported chains. These supported chains currently belong under two broad categories, being either EVM based chains, or Cosmos IBC based chains.The next section describes what role validators play when Axelar onboards a new chain. When a new chain is onboarded into Axelar, it can access and communicate with all the other Axelar connected chains right away. This is possible because Axelar acts as a universal overlay network, similar to a “hub and spoke” model. Since Axelar is a blockchain network itself, it is able to use routing logic to act as the interoperability network’s hub. This architecture means it is fairly easy to onboard additional chains to the network, especially when compared to a “pairwise bridge model”, where adding a single new chain requires connections to be formed between each existing chain and the new one. @@ -14,7 +14,7 @@ Additionally, any validator is able to propose the addition of a new chain into Axelar network is built on top of the Cosmos SDK, meaning Axelar itself is a Cosmos-based chain. Within the Cosmos ecosystem, the Inter-Blockchain Communication (IBC) protocol allows cross-chain communication. Axelar uses IBC to onboard new Cosmos chains to the Axelar network, and give the onboarded chain access to all other Axelar connected chains, both Cosmos and EVM. Read the Cosmos SDK [IBC docs](https://ibc.cosmos.network/) to learn more about the protocol. -IBC is a permissionless protocol, meaning any Axelar validator can start the onboarding process for a new Cosmos chain, by setting up IBC channels between Axelar and the new chain. After a channel is established, Axelar validators are encouraged to support the channel. Axelar validators must run light clients between Axelar and the Cosmos chain, for each external cosmos chain they support. See the Axelar IBC info docs for more details. Having many validators supporting an IBC channel ensures decentralization. If one validator goes down, the IBC channel remains open and messages can still be relayed. +IBC is a permissionless protocol, meaning any Axelar validator can start the onboarding process for a new Cosmos chain, by setting up IBC channels between Axelar and the new chain. After a channel is established, Axelar validators are encouraged to support the channel. Axelar validators must run light clients between Axelar and the Cosmos chain, for each external cosmos chain they support. See the Axelar IBC info docs for more details. Having many validators supporting an IBC channel ensures decentralization. If one validator goes down, the IBC channel remains open and messages can still be relayed. Once an IBC channel is established, connecting the new chain to Axelar network with strong validator support, the Axelar network can register a path, connecting the IBC chain with all other chains supported by Axelar, both IBC and EVM. Incoming messages from the Cosmos chain to Axelar will be sent through the IBC channel, then processed and approved by Axelar validators, and executed on the destination chain. Outgoing messages from Axelar to the Cosmos chain will first be approved by Axelar validators, then executed on the Cosmos chain via the IBC channel. @@ -25,6 +25,3 @@ Cosmos chains benefit from having broad validator support; for EVM chains, it is The Axelar validator must obtain a secured and private RPC endpoint for the EVM chain. This is usually done by the validator running their own node for the EVM chain, and using their own RPC endpoint. After this is setup, the validator needs to inform Axelar about their support for this new chain, and submit a command to Axelar, registering their validator as a chain maintainer for the new EVM chain. If the amount of validators registering support for the new chain reaches a certain threshold, the EVM chain can be activated on the Axelar network layer, creating paths to and from the new chain and connecting it with every other Axelar supported chain, both IBC and EVM. Note that it is not required for all Axelar validators to support the new EVM chain. As long as a set threshold of validators register as a chain maintainer, the ability to enable the chain at the network level is supported. However, additional rewards are given out to validators for each additional EVM chain they support, which encourages validators to support as many chains as they can. - - - diff --git a/src/pages/validator/troubleshoot/missed-too-many-blocks.mdx b/src/content/docs/validator/troubleshoot/missed-too-many-blocks.mdx similarity index 68% rename from src/pages/validator/troubleshoot/missed-too-many-blocks.mdx rename to src/content/docs/validator/troubleshoot/missed-too-many-blocks.mdx index 4c50802fd..630eb065d 100644 --- a/src/pages/validator/troubleshoot/missed-too-many-blocks.mdx +++ b/src/content/docs/validator/troubleshoot/missed-too-many-blocks.mdx @@ -1,8 +1,8 @@ # "Missed too many blocks" status -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; -If your validator misses 6 or more of the last 100 blocks then your Axelar status becomes `missed_too_many_blocks` and your [health check](../setup/health-check) prints something like: +If your validator misses 6 or more of the last 100 blocks then your Axelar status becomes `missed_too_many_blocks` and your [health check](/validator/status/health-check/) prints something like: ```yaml tofnd check: passed @@ -13,5 +13,8 @@ operator check: failed (health check to operator MY_VALIDATOR_ADDRESS failed due You can restore your validator to healthy status simply by waiting --- `missed_too_many_blocks` is dropped automatically as soon as 100 blocks have passed in which you've missed 5 or fewer blocks. - Tip: If you missed 50 or more of the last 100 blocks then your validator status becomes `jailed`. In this case, see [Unjail](../troubleshoot/unjail) for instructions on how to restore your validator to healthy status. - \ No newline at end of file + Tip: If you missed 50 or more of the last 100 blocks then your validator + status becomes `jailed`. In this case, see + [Unjail](/validator/troubleshoot/unjail/) for instructions on how to restore + your validator to healthy status. + diff --git a/src/pages/validator/troubleshoot/startup.mdx b/src/content/docs/validator/troubleshoot/startup.mdx similarity index 97% rename from src/pages/validator/troubleshoot/startup.mdx rename to src/content/docs/validator/troubleshoot/startup.mdx index 9a7ae62c3..ad4e4053b 100644 --- a/src/pages/validator/troubleshoot/startup.mdx +++ b/src/content/docs/validator/troubleshoot/startup.mdx @@ -1,6 +1,6 @@ # Start-up issues -import { Callout } from "/src/components/callout" +import { Callout } from "/src/components/callout"; {/* [TODO revise] */} @@ -50,14 +50,15 @@ Now, start `vald`, providing the IP address and validator address: ```bash docker exec axelar-core axelard vald-start --tofnd-host {your tofnd IP Address} --validator-addr {your validator address} --node {your axelar-core IP address} ``` + eg: + ```bash docker exec axelar-core axelard vald-start --tofnd-host 172.17.0.2 --validator-addr axelarvaloper1y4vplrpdaqplje8q4p4j32t3cqqmea9830umwl ``` - - Your vald should be connected properly. Confirm this by running the following and looking for an `vald-start` entry. + ```bash docker exec axelar-core ps -``` \ No newline at end of file +``` diff --git a/src/pages/validator/troubleshoot/unjail.mdx b/src/content/docs/validator/troubleshoot/unjail.mdx similarity index 83% rename from src/pages/validator/troubleshoot/unjail.mdx rename to src/content/docs/validator/troubleshoot/unjail.mdx index 40f095999..46ec26cdf 100644 --- a/src/pages/validator/troubleshoot/unjail.mdx +++ b/src/content/docs/validator/troubleshoot/unjail.mdx @@ -4,8 +4,7 @@ **"Jail"** is a Tendermint/Cosmos concept --- it is not specific to Axelar. If your validator misses 50 or more of the last 100 blocks then your tendermint status becomes `jailed`. You can see your 'jailed' status via the Cosmos command `axelard q staking validators`. - -> Axelar-core currently uses the word "jail" to describe a different Axelar-specific status in the context of eligibility to participate in keygen/sign protocols. This terminology can be confusing and we intend to change it in future versions of axelar-core. To see whether your validator's has this Axelar-specific jail status use `axelard q snapshot validators`. +> Axelar-core currently uses the word "jail" to describe a different Axelar-specific status in the context of eligibility to participate in keygen/sign protocols. This terminology can be confusing and we intend to change it in future versions of axelar-core. To see whether your validator's has this Axelar-specific jail status use `axelard q snapshot validators`. The minimum duration for `jail` status is 10 minutes. After this period you can restore your validator to healthy status by posting a transaction to the Axelar blockchain as follows. @@ -20,5 +19,5 @@ axelard tx slashing unjail --from validator ## Binaries ```bash -~/.axelar_testnet/bin/axelard tx slashing unjail --from validator --home ~/.axelar_testnet/.core --chain-id axelar-testnet-toronto -``` \ No newline at end of file +~/.axelar_testnet/bin/axelard tx slashing unjail --from validator --home ~/.axelar_testnet/.core --chain-id axelar-testnet-lisbon-3 +``` diff --git a/src/data/cosmos_chains.json b/src/data/cosmos_chains.json index e09adfd07..7c6940581 100644 --- a/src/data/cosmos_chains.json +++ b/src/data/cosmos_chains.json @@ -1,11 +1,5 @@ { "mainnet": [ - { - "id": "acrechain", - "name": "Acrechain", - "network_id": "acre", - "image": "/images/chains/acrechain.svg" - }, { "id": "agoric", "name": "Agoric", @@ -16,13 +10,7 @@ "id": "archway", "name": "Archway", "network_id": "archway", - "image": "/images/chains/archway.svg" - }, - { - "id": "aura", - "name": "Aura", - "network_id": "aura", - "image": "/images/chains/aura.svg" + "image": "/images/assets/archway.svg" }, { "id": "axelarnet", @@ -30,6 +18,18 @@ "network_id": "axelarnet", "image": "/images/chains/axelar.svg" }, + { + "id": "bitsong", + "name": "Bitsong", + "network_id": "bitsong", + "image": "/images/chains/bitsong.svg" + }, + { + "id": "c4e", + "name": "C4E", + "network_id": "c4e", + "image": "/images/assets/c4e.svg" + }, { "id": "carbon", "name": "Carbon", @@ -42,6 +42,12 @@ "network_id": "celestia", "image": "/images/chains/celestia.svg" }, + { + "id": "chihuahua", + "name": "Chihuahua", + "network_id": "chihuahua", + "image": "/images/chains/chihuahua.svg" + }, { "id": "comdex", "name": "Comdex", @@ -60,6 +66,12 @@ "network_id": "crescent", "image": "/images/chains/crescent.svg" }, + { + "id": "dymension", + "name": "Dymension", + "network_id": "dymension", + "image": "/images/chains/dymension.svg" + }, { "id": "evmos", "name": "Evmos", @@ -88,7 +100,7 @@ "id": "injective", "name": "Injective", "network_id": "injective", - "image": "/images/chains/injective.svg" + "image": "/images/assets/injective.svg" }, { "id": "juno", @@ -108,6 +120,12 @@ "network_id": "kujira", "image": "/images/chains/kujira.svg" }, + { + "id": "lava", + "name": "Lava", + "network_id": "lava", + "image": "/images/chains/lava.svg" + }, { "id": "migaloo", "name": "Migaloo", @@ -120,6 +138,18 @@ "network_id": "neutron", "image": "/images/chains/neutron.svg" }, + { + "id": "nolus", + "name": "Nolus", + "network_id": "nolus", + "image": "/images/assets/nolus.svg" + }, + { + "id": "ojo", + "name": "Ojo", + "network_id": "ojo", + "image": "/images/chains/ojo.svg" + }, { "id": "osmosis", "name": "Osmosis", @@ -150,6 +180,12 @@ "network_id": "regen", "image": "/images/chains/regen.svg" }, + { + "id": "saga", + "name": "Saga", + "network_id": "saga", + "image": "/images/chains/saga.svg" + }, { "id": "secret-snip", "name": "Secret-SNIP", @@ -186,12 +222,6 @@ "network_id": "teritori", "image": "/images/chains/teritori.svg" }, - { - "id": "terra", - "name": "Terra", - "network_id": "terra-2", - "image": "/images/chains/terra.svg" - }, { "id": "terraclassic", "name": "Terra Classic", @@ -242,6 +272,18 @@ "network_id": "celestia", "image": "/images/chains/celestia.svg" }, + { + "id": "chain4energy", + "name": "Chain4Energy", + "network_id": "chain4energy", + "image": "/images/chains/chain4energy.svg" + }, + { + "id": "dymension", + "name": "Dymension", + "network_id": "dymension", + "image": "/images/chains/dymension.svg" + }, { "id": "elys", "name": "Elys", @@ -278,12 +320,30 @@ "network_id": "kujira", "image": "/images/chains/kujira.svg" }, + { + "id": "lava", + "name": "Lava", + "network_id": "lava", + "image": "/images/chains/lava.svg" + }, { "id": "neutron", "name": "Neutron", "network_id": "neutron", "image": "/images/chains/neutron.svg" }, + { + "id": "nibiru", + "name": "Nibiru", + "network_id": "nibiru", + "image": "/images/chains/nibiru.svg" + }, + { + "id": "nillion", + "name": "Nillion", + "network_id": "nillion", + "image": "/images/chains/nillion.svg" + }, { "id": "odin", "name": "Odin", @@ -332,10 +392,16 @@ "network_id": "sei-2", "image": "/images/chains/sei.svg" }, + { + "id": "sommelier", + "name": "Sommelier", + "network_id": "sommelier", + "image": "/images/chains/sommelier.svg" + }, { "id": "teritori", "name": "Teritori", - "network_id": "teritori", + "network_id": "teritori-2", "image": "/images/chains/teritori.svg" }, { @@ -344,17 +410,47 @@ "network_id": "terra-3", "image": "/images/chains/terra.svg" }, + { + "id": "warden", + "name": "Warden", + "network_id": "warden", + "image": "/images/chains/warden.svg" + }, { "id": "xpla", "name": "Xpla", "network_id": "xpla", "image": "/images/chains/xpla.svg" }, + { + "id": "fxcore", + "name": "fxCore", + "network_id": "fxcore", + "image": "/images/chains/fxcore.svg" + }, { "id": "provenance", "name": "provenance", "network_id": "provenance", "image": "/images/chains/provenance.svg" + }, + { + "id": "mantra", + "name": "Mantra", + "network_id": "mantra", + "image": "/images/chains/mantra.svg" + }, + { + "id": "zigchain", + "name": "Zigchain", + "network_id": "zigchain", + "image": "/images/chains/zigchain.svg" + }, + { + "id": "babylon", + "name": "Babylon", + "network_id": "babylon", + "image": "/images/chains/babylon.svg" } ] -} \ No newline at end of file +} diff --git a/src/data/evm_assets.json b/src/data/evm_assets.json index 1d885d399..dd7f5ccef 100644 --- a/src/data/evm_assets.json +++ b/src/data/evm_assets.json @@ -11,7 +11,7 @@ "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215", "symbol": "axlUSDC", "decimals": 6, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "avalanche", @@ -25,7 +25,7 @@ "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215", "symbol": "axlUSDC", "decimals": 6, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "binance", @@ -34,6 +34,13 @@ "decimals": 6, "transfer_fee": 1.5 }, + { + "chain": "blast", + "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215", + "symbol": "axlUSDC", + "decimals": 6, + "transfer_fee": 10.0 + }, { "chain": "celo", "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215", @@ -46,7 +53,7 @@ "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "symbol": "USDC", "decimals": 6, - "transfer_fee": 80.0 + "transfer_fee": 60.0 }, { "chain": "fantom", @@ -62,6 +69,20 @@ "decimals": 6, "transfer_fee": 1.5 }, + { + "chain": "fraxtal", + "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215", + "symbol": "axlUSDC", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "immutable", + "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215", + "symbol": "axlUSDC", + "decimals": 6, + "transfer_fee": 1.5 + }, { "chain": "kava", "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215", @@ -74,14 +95,14 @@ "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215", "symbol": "axlUSDC", "decimals": 6, - "transfer_fee": 1.5 + "transfer_fee": 10.0 }, { "chain": "mantle", "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215", "symbol": "axlUSDC", "decimals": 6, - "transfer_fee": 1.5 + "transfer_fee": 10.0 }, { "chain": "moonbeam", @@ -95,7 +116,7 @@ "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215", "symbol": "axlUSDC", "decimals": 6, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "polygon", @@ -109,7 +130,7 @@ "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215", "symbol": "axlUSDC", "decimals": 6, - "transfer_fee": 1.5 + "transfer_fee": 10.0 } ] }, @@ -124,105 +145,119 @@ "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 10.0 + "transfer_fee": 1.7 }, { "chain": "avalanche", "address": "0x44c784266cf024a60e8acF2427b9857Ace194C5d", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.25 }, { "chain": "base", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 10.0 + "transfer_fee": 1.7 }, { "chain": "binance", "address": "0x8b1f4432F943c465A973FeDC6d7aa50Fc96f1f65", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.25 + }, + { + "chain": "blast", + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", + "symbol": "wAXL", + "decimals": 6, + "transfer_fee": 1.7 }, { "chain": "celo", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.25 }, { "chain": "ethereum", "address": "0x467719aD09025FcC6cF6F8311755809d45a5E5f3", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 160.0 + "transfer_fee": 10.0 }, { "chain": "fantom", "address": "0x8b1f4432F943c465A973FeDC6d7aa50Fc96f1f65", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.25 }, { "chain": "filecoin", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.25 + }, + { + "chain": "fraxtal", + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", + "symbol": "wAXL", + "decimals": 6, + "transfer_fee": 1.7 }, { "chain": "kava", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.25 }, { "chain": "linea", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 1.7 }, { "chain": "mantle", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 1.7 }, { "chain": "moonbeam", "address": "0x467719aD09025FcC6cF6F8311755809d45a5E5f3", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.25 }, { "chain": "optimism", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 10.0 + "transfer_fee": 1.7 }, { "chain": "polygon", "address": "0x6e4E624106Cb12E168E6533F8ec7c82263358940", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.25 }, { "chain": "scroll", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 1.7 } ] }, @@ -237,7 +272,7 @@ "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7", "symbol": "axlDAI", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "avalanche", @@ -251,7 +286,7 @@ "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7", "symbol": "axlDAI", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "binance", @@ -260,6 +295,13 @@ "decimals": 18, "transfer_fee": 1.5 }, + { + "chain": "blast", + "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7", + "symbol": "axlDAI", + "decimals": 18, + "transfer_fee": 10.0 + }, { "chain": "celo", "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7", @@ -272,7 +314,7 @@ "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", "symbol": "DAI", "decimals": 18, - "transfer_fee": 80.0 + "transfer_fee": 60.0 }, { "chain": "fantom", @@ -288,6 +330,13 @@ "decimals": 18, "transfer_fee": 1.5 }, + { + "chain": "fraxtal", + "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7", + "symbol": "axlDAI", + "decimals": 18, + "transfer_fee": 10.0 + }, { "chain": "kava", "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7", @@ -300,14 +349,14 @@ "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7", "symbol": "axlDAI", "decimals": 18, - "transfer_fee": 1.5 + "transfer_fee": 10.0 }, { "chain": "mantle", "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7", "symbol": "axlDAI", "decimals": 18, - "transfer_fee": 1.5 + "transfer_fee": 10.0 }, { "chain": "moonbeam", @@ -321,7 +370,7 @@ "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7", "symbol": "axlDAI", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "polygon", @@ -335,7 +384,7 @@ "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7", "symbol": "axlDAI", "decimals": 18, - "transfer_fee": 1.5 + "transfer_fee": 10.0 } ] }, @@ -350,7 +399,7 @@ "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6", "symbol": "axlUSDT", "decimals": 6, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "avalanche", @@ -364,7 +413,7 @@ "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6", "symbol": "axlUSDT", "decimals": 6, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "binance", @@ -373,6 +422,13 @@ "decimals": 6, "transfer_fee": 1.5 }, + { + "chain": "blast", + "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6", + "symbol": "axlUSDT", + "decimals": 6, + "transfer_fee": 10.0 + }, { "chain": "celo", "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6", @@ -385,7 +441,7 @@ "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", "symbol": "USDT", "decimals": 6, - "transfer_fee": 80.0 + "transfer_fee": 60.0 }, { "chain": "fantom", @@ -401,6 +457,13 @@ "decimals": 6, "transfer_fee": 1.5 }, + { + "chain": "fraxtal", + "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6", + "symbol": "axlUSDT", + "decimals": 6, + "transfer_fee": 10.0 + }, { "chain": "kava", "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6", @@ -413,14 +476,14 @@ "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6", "symbol": "axlUSDT", "decimals": 6, - "transfer_fee": 1.5 + "transfer_fee": 10.0 }, { "chain": "mantle", "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6", "symbol": "axlUSDT", "decimals": 6, - "transfer_fee": 1.5 + "transfer_fee": 10.0 }, { "chain": "moonbeam", @@ -434,7 +497,7 @@ "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6", "symbol": "axlUSDT", "decimals": 6, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "polygon", @@ -448,7 +511,7 @@ "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6", "symbol": "axlUSDT", "decimals": 6, - "transfer_fee": 1.5 + "transfer_fee": 10.0 } ] }, @@ -463,105 +526,119 @@ "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 0.00021 + "transfer_fee": 0.00017 }, { "chain": "avalanche", "address": "0xa6220B4209353dFeF03B6cE410c8F01105515f94", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 6.2e-05 + "transfer_fee": 2.5e-5 }, { "chain": "base", "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 0.00021 + "transfer_fee": 0.00017 }, { "chain": "binance", "address": "0x448d59B4302aB5d2dadf9611bED9457491926c8e", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 6.2e-05 + "transfer_fee": 2.5e-5 + }, + { + "chain": "blast", + "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad", + "symbol": "axlWBTC", + "decimals": 8, + "transfer_fee": 0.00017 }, { "chain": "celo", "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 6.2e-05 + "transfer_fee": 2.5e-5 }, { "chain": "ethereum", "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", "symbol": "WBTC", "decimals": 8, - "transfer_fee": 0.0033 + "transfer_fee": 0.001 }, { "chain": "fantom", "address": "0x448d59B4302aB5d2dadf9611bED9457491926c8e", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 6.2e-05 + "transfer_fee": 2.5e-5 }, { "chain": "filecoin", "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 6.2e-05 + "transfer_fee": 2.5e-5 + }, + { + "chain": "fraxtal", + "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad", + "symbol": "axlWBTC", + "decimals": 8, + "transfer_fee": 0.00017 }, { "chain": "kava", "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 6.2e-05 + "transfer_fee": 2.5e-5 }, { "chain": "linea", "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 6.2e-05 + "transfer_fee": 0.00017 }, { "chain": "mantle", "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 6.2e-05 + "transfer_fee": 0.00017 }, { "chain": "moonbeam", "address": "0x8e9a09bc94689c157Cd7f6aB5d4577ED6f44Ba1E", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 6.2e-05 + "transfer_fee": 2.5e-5 }, { "chain": "optimism", "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 0.00021 + "transfer_fee": 0.00017 }, { "chain": "polygon", "address": "0x779661872e9C891027099C9E3fd101DCc8B96433", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 6.2e-05 + "transfer_fee": 2.5e-5 }, { "chain": "scroll", "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad", "symbol": "axlWBTC", "decimals": 8, - "transfer_fee": 6.2e-05 + "transfer_fee": 0.00017 } ] }, @@ -576,105 +653,119 @@ "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.0031 + "transfer_fee": 0.0032 }, { "chain": "avalanche", "address": "0x42A62eb3Fd2a05eD499117F128de8a3192B49EBB", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.00094 + "transfer_fee": 0.00048 }, { "chain": "base", "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.0031 + "transfer_fee": 0.0032 }, { "chain": "binance", "address": "0xfe7eDa5F2c56160d406869A8aA4B2F365d544C7B", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.00094 + "transfer_fee": 0.00048 + }, + { + "chain": "blast", + "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D", + "symbol": "axlETH", + "decimals": 18, + "transfer_fee": 0.0032 }, { "chain": "celo", "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.00094 + "transfer_fee": 0.00048 }, { "chain": "ethereum", "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "symbol": "WETH", "decimals": 18, - "transfer_fee": 0.05 + "transfer_fee": 0.019 }, { "chain": "fantom", "address": "0xfe7eDa5F2c56160d406869A8aA4B2F365d544C7B", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.00094 + "transfer_fee": 0.00048 }, { "chain": "filecoin", "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.00094 + "transfer_fee": 0.00048 + }, + { + "chain": "fraxtal", + "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D", + "symbol": "axlETH", + "decimals": 18, + "transfer_fee": 0.0032 }, { "chain": "kava", "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.00094 + "transfer_fee": 0.00048 }, { "chain": "linea", "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.00094 + "transfer_fee": 0.0032 }, { "chain": "mantle", "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.00094 + "transfer_fee": 0.0032 }, { "chain": "moonbeam", "address": "0x85a8B472d116585E2cc10eB1e0e3E3127E1f5D3f", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.00094 + "transfer_fee": 0.00048 }, { "chain": "optimism", "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.0031 + "transfer_fee": 0.0032 }, { "chain": "polygon", "address": "0x1280830F690D0E65195B3c61b028244C3A49f26D", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.00094 + "transfer_fee": 0.00048 }, { "chain": "scroll", "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D", "symbol": "axlETH", "decimals": 18, - "transfer_fee": 0.00094 + "transfer_fee": 0.0032 } ] }, @@ -689,7 +780,7 @@ "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb", "symbol": "axlWMAI", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "avalanche", @@ -703,7 +794,7 @@ "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb", "symbol": "axlWMAI", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "binance", @@ -712,6 +803,13 @@ "decimals": 18, "transfer_fee": 1.5 }, + { + "chain": "blast", + "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb", + "symbol": "axlWMAI", + "decimals": 18, + "transfer_fee": 10.0 + }, { "chain": "celo", "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb", @@ -724,7 +822,7 @@ "address": "0x05770332D4410b6D7f07Fd497E4c00F8F7bFb74A", "symbol": "WMAI", "decimals": 18, - "transfer_fee": 80.0 + "transfer_fee": 60.0 }, { "chain": "fantom", @@ -740,6 +838,13 @@ "decimals": 18, "transfer_fee": 1.5 }, + { + "chain": "fraxtal", + "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb", + "symbol": "axlWMAI", + "decimals": 18, + "transfer_fee": 10.0 + }, { "chain": "kava", "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb", @@ -752,14 +857,14 @@ "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb", "symbol": "axlWMAI", "decimals": 18, - "transfer_fee": 1.5 + "transfer_fee": 10.0 }, { "chain": "mantle", "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb", "symbol": "axlWMAI", "decimals": 18, - "transfer_fee": 1.5 + "transfer_fee": 10.0 }, { "chain": "moonbeam", @@ -773,7 +878,7 @@ "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb", "symbol": "axlWMAI", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "polygon", @@ -787,7 +892,7 @@ "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb", "symbol": "axlWMAI", "decimals": 18, - "transfer_fee": 1.5 + "transfer_fee": 10.0 } ] }, @@ -817,21 +922,28 @@ "address": "0x4D84E25cEa9447581867fE9f2329B972f532Da2c", "symbol": "axlBUSD", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "ethereum", "address": "0x4Fabb145d64652a948d72533023f6E7A623C7C53", "symbol": "BUSD", "decimals": 18, - "transfer_fee": 80.0 + "transfer_fee": 60.0 }, { - "chain": "linea", + "chain": "kava", "address": "0x4D84E25cEa9447581867fE9f2329B972f532Da2c", "symbol": "axlBUSD", "decimals": 18, "transfer_fee": 1.5 + }, + { + "chain": "linea", + "address": "0x4D84E25cEa9447581867fE9f2329B972f532Da2c", + "symbol": "axlBUSD", + "decimals": 18, + "transfer_fee": 10.0 } ] }, @@ -846,28 +958,92 @@ "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4", "symbol": "axl-wstETH", "decimals": 18, - "transfer_fee": 0.0028 + "transfer_fee": 0.0029 + }, + { + "chain": "avalanche", + "address": "0x74c6b86A89fE77B48952Bc3a9Db74a307B202e97", + "symbol": "axl-wstETH", + "decimals": 18, + "transfer_fee": 0.00044 + }, + { + "chain": "base", + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4", + "symbol": "axl-wstETH", + "decimals": 18, + "transfer_fee": 0.0029 + }, + { + "chain": "binance", + "address": "0xb306669D6C024B3deA4ff3A35D50844289b2DCFC", + "symbol": "axl-wstETH", + "decimals": 18, + "transfer_fee": 0.00044 }, { "chain": "ethereum", "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", "symbol": "wstETH", "decimals": 18, - "transfer_fee": 0.045 + "transfer_fee": 0.018 + }, + { + "chain": "linea", + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4", + "symbol": "axl-wstETH", + "decimals": 18, + "transfer_fee": 0.0029 + }, + { + "chain": "mantle", + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4", + "symbol": "axl-wstETH", + "decimals": 18, + "transfer_fee": 0.0029 }, { "chain": "optimism", "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4", "symbol": "axl-wstETH", "decimals": 18, - "transfer_fee": 0.0028 + "transfer_fee": 0.0029 }, { "chain": "polygon", "address": "0xd7Bb095a60D7666D4A6f236423B47DDD6ae6Cfa7", "symbol": "axl-wstETH", "decimals": 18, - "transfer_fee": 0.00085 + "transfer_fee": 0.00044 + }, + { + "chain": "scroll", + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4", + "symbol": "axl-wstETH", + "decimals": 18, + "transfer_fee": 0.0029 + } + ] + }, + { + "id": "wusdm-wei", + "name": "wUSDM - Wrapped Mountain Protocol USD", + "symbol": "wUSDM", + "image": "/images/assets/wusdm.svg", + "contracts": [ + { + "chain": "celo", + "address": "0xa2B9e3a4c575aA54224dd202F2739F596Ea1ce7e", + "symbol": "wUSDM", + "decimals": 18, + "transfer_fee": 1.5 + }, + { + "chain": "ethereum", + "address": "0x57F5E098CaD7A3D1Eed53991D4d66C45C9AF7812", + "symbol": "wUSDM", + "decimals": 18, + "transfer_fee": 60.0 } ] }, @@ -889,7 +1065,7 @@ "address": "0x1aBaEA1f7C830bD89Acc67eC4af516284b1bC33c", "symbol": "EUROC", "decimals": 6, - "transfer_fee": 80.0 + "transfer_fee": 60.0 } ] }, @@ -904,7 +1080,7 @@ "address": "0x816E21c33fa5F8440EBcDF6e01D39314541BEA72", "symbol": "Lqdr", "decimals": 18, - "transfer_fee": 12.0 + "transfer_fee": 25.0 }, { "chain": "avalanche", @@ -925,7 +1101,7 @@ "address": "0x98504C8afa7c74c87a0641a7bb0F7968d4e8F471", "symbol": "axlLqdr", "decimals": 18, - "transfer_fee": 200.0 + "transfer_fee": 150.0 }, { "chain": "fantom", @@ -941,12 +1117,19 @@ "decimals": 18, "transfer_fee": 3.8 }, + { + "chain": "linea", + "address": "0x332c72dd7E77070740F01d2d35851c461585D5d0", + "symbol": "axlLqdr", + "decimals": 18, + "transfer_fee": 25.0 + }, { "chain": "optimism", "address": "0x332c72dd7E77070740F01d2d35851c461585D5d0", "symbol": "axlLqdr", "decimals": 18, - "transfer_fee": 12.0 + "transfer_fee": 25.0 }, { "chain": "polygon", @@ -968,7 +1151,7 @@ "address": "0xa334884bF6b0A066d553D19e507315E839409e62", "symbol": "ERN", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "avalanche", @@ -982,7 +1165,7 @@ "address": "0xa334884bF6b0A066d553D19e507315E839409e62", "symbol": "ERN", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "binance", @@ -991,12 +1174,19 @@ "decimals": 18, "transfer_fee": 1.5 }, + { + "chain": "blast", + "address": "0xa334884bF6b0A066d553D19e507315E839409e62", + "symbol": "ERN", + "decimals": 18, + "transfer_fee": 10.0 + }, { "chain": "ethereum", "address": "0x91A69021b0BaeF3445E51726458a0CE601471846", "symbol": "ERN", "decimals": 18, - "transfer_fee": 80.0 + "transfer_fee": 60.0 }, { "chain": "fantom", @@ -1005,6 +1195,13 @@ "decimals": 18, "transfer_fee": 1.5 }, + { + "chain": "fraxtal", + "address": "0xa334884bF6b0A066d553D19e507315E839409e62", + "symbol": "ERN", + "decimals": 18, + "transfer_fee": 10.0 + }, { "chain": "kava", "address": "0xa334884bF6b0A066d553D19e507315E839409e62", @@ -1017,21 +1214,21 @@ "address": "0xa334884bF6b0A066d553D19e507315E839409e62", "symbol": "ERN", "decimals": 18, - "transfer_fee": 1.5 + "transfer_fee": 10.0 }, { "chain": "mantle", "address": "0xa334884bF6b0A066d553D19e507315E839409e62", "symbol": "ERN", "decimals": 18, - "transfer_fee": 1.5 + "transfer_fee": 10.0 }, { "chain": "optimism", "address": "0xc5b001DC33727F8F26880B184090D3E252470D45", "symbol": "ERN", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "polygon", @@ -1045,7 +1242,7 @@ "address": "0xa334884bF6b0A066d553D19e507315E839409e62", "symbol": "ERN", "decimals": 18, - "transfer_fee": 1.5 + "transfer_fee": 10.0 } ] }, @@ -1060,7 +1257,7 @@ "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069", "symbol": "stERN", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "avalanche", @@ -1074,7 +1271,7 @@ "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069", "symbol": "stERN", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "binance", @@ -1083,12 +1280,19 @@ "decimals": 18, "transfer_fee": 1.5 }, + { + "chain": "blast", + "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069", + "symbol": "stERN", + "decimals": 18, + "transfer_fee": 10.0 + }, { "chain": "ethereum", "address": "0xeA0cFDC2667bE69ED724c8069d358502fF41cA18", "symbol": "stERN", "decimals": 18, - "transfer_fee": 80.0 + "transfer_fee": 60.0 }, { "chain": "fantom", @@ -1097,6 +1301,13 @@ "decimals": 18, "transfer_fee": 1.5 }, + { + "chain": "fraxtal", + "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069", + "symbol": "stERN", + "decimals": 18, + "transfer_fee": 10.0 + }, { "chain": "kava", "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069", @@ -1109,21 +1320,21 @@ "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069", "symbol": "stERN", "decimals": 18, - "transfer_fee": 1.5 + "transfer_fee": 10.0 }, { "chain": "mantle", "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069", "symbol": "stERN", "decimals": 18, - "transfer_fee": 1.5 + "transfer_fee": 10.0 }, { "chain": "optimism", "address": "0x3eE6107d9C93955acBb3f39871D32B02F82B78AB", "symbol": "stERN", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 10.0 }, { "chain": "polygon", @@ -1137,7 +1348,7 @@ "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069", "symbol": "stERN", "decimals": 18, - "transfer_fee": 1.5 + "transfer_fee": 10.0 } ] }, @@ -1152,7 +1363,7 @@ "address": "0x8aa9381b2544b48c26f3b850F6e07E2c5161EB3e", "symbol": "WDOGE", "decimals": 8, - "transfer_fee": 1100.0 + "transfer_fee": 860.0 } ] }, @@ -1171,6 +1382,133 @@ } ] }, + { + "id": "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn", + "name": "LVN - Levana Governance Token", + "symbol": "LVN", + "image": "/images/assets/lvn.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 56.0 + }, + { + "chain": "avalanche", + "address": "0xC0E4AA1bfCc292250d8E4E3bEFFfA943b3C6617d", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 8.3 + }, + { + "chain": "base", + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 56.0 + }, + { + "chain": "binance", + "address": "0xeB3e10979280aDd77f3E59cf220885646A852784", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 8.3 + }, + { + "chain": "blast", + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 56.0 + }, + { + "chain": "celo", + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 8.3 + }, + { + "chain": "ethereum", + "address": "0xbBd788E2873d391F9eE7E965D9ef93305909Da3E", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 330.0 + }, + { + "chain": "fantom", + "address": "0xeB3e10979280aDd77f3E59cf220885646A852784", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 8.3 + }, + { + "chain": "filecoin", + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 8.3 + }, + { + "chain": "fraxtal", + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 56.0 + }, + { + "chain": "kava", + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 8.3 + }, + { + "chain": "linea", + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 56.0 + }, + { + "chain": "mantle", + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 56.0 + }, + { + "chain": "moonbeam", + "address": "0xbBd788E2873d391F9eE7E965D9ef93305909Da3E", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 8.3 + }, + { + "chain": "optimism", + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 56.0 + }, + { + "chain": "polygon", + "address": "0x59BE025398162d0B911E0b9D8a6FEB52dF64637f", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 8.3 + }, + { + "chain": "scroll", + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5", + "symbol": "LVN", + "decimals": 6, + "transfer_fee": 56.0 + } + ] + }, { "id": "cusd-wei", "name": "cUSD - Celo Dollar", @@ -1197,14 +1535,28 @@ "address": "0x3A18dcC9745eDcD1Ef33ecB93b0b6eBA5671e7Ca", "symbol": "KUJI", "decimals": 6, - "transfer_fee": 10.0 + "transfer_fee": 2.9 + }, + { + "chain": "binance", + "address": "0x073690e6CE25bE816E68F32dCA3e11067c9FB5Cc", + "symbol": "KUJI", + "decimals": 6, + "transfer_fee": 0.43 + }, + { + "chain": "ethereum", + "address": "0x5e354e4f52D14FF07662CF0493d0d588d38a44A6", + "symbol": "KUJI", + "decimals": 6, + "transfer_fee": 17.0 }, { "chain": "optimism", "address": "0x3A18dcC9745eDcD1Ef33ecB93b0b6eBA5671e7Ca", "symbol": "KUJI", "decimals": 6, - "transfer_fee": 10.0 + "transfer_fee": 2.9 } ] }, @@ -1219,7 +1571,7 @@ "address": "0xBe9895146f7AF43049ca1c1AE358B0541Ea49704", "symbol": "cbETH", "decimals": 18, - "transfer_fee": 0.05 + "transfer_fee": 0.019 } ] }, @@ -1230,1876 +1582,4550 @@ "image": "/images/assets/sfrxeth.svg", "contracts": [ { - "chain": "ethereum", - "address": "0xac3E018457B222d93114458476f3E3416Abbe38F", + "chain": "arbitrum", + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283", "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 0.045 - } - ] - }, - { - "id": "reth-wei", - "name": "rETH - Rocket Pool ETH", - "symbol": "rETH", - "image": "/images/assets/reth.svg", - "contracts": [ + "transfer_fee": 0.0029 + }, { - "chain": "ethereum", - "address": "0xae78736Cd615f374D3085123A210448E74Fc6393", - "symbol": "rETH", + "chain": "avalanche", + "address": "0x9428DCF8F77bFb504917A333d0b8030EBA6af8AB", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 0.045 - } - ] - }, - { - "id": "arb-wei", - "name": "ARB - Arbitrum", - "symbol": "ARB", - "image": "/images/assets/arb.svg", - "contracts": [ + "transfer_fee": 0.00044 + }, { - "chain": "arbitrum", - "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", - "symbol": "ARB", + "chain": "base", + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 3.8 + "transfer_fee": 0.0029 }, { - "chain": "base", - "address": "0x87b6c94c435F6e49789ad34FAf0d048F2D9043a2", - "symbol": "axlARB", + "chain": "binance", + "address": "0x4E30B1B79bfF30840755FafafD9ce8e408131552", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 3.8 + "transfer_fee": 0.00044 }, { - "chain": "linea", - "address": "0x87b6c94c435F6e49789ad34FAf0d048F2D9043a2", - "symbol": "axlARB", + "chain": "blast", + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 1.1 - } - ] - }, - { - "id": "mpx-wei", - "name": "MPX - MPX", - "symbol": "MPX", - "image": "/images/assets/mpx.svg", - "contracts": [ + "transfer_fee": 0.0029 + }, { - "chain": "base", - "address": "0xa5325A8EBBbdb12CAF6b76218a7375a71f9f3b41", - "symbol": "MPX", + "chain": "celo", + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 36.0 + "transfer_fee": 0.00044 }, { - "chain": "binance", - "address": "0x94C6B279b5df54b335aE51866d6E2A56BF5Ef9b7", - "symbol": "MPX", + "chain": "ethereum", + "address": "0xac3E018457B222d93114458476f3E3416Abbe38F", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 11.0 + "transfer_fee": 0.018 }, { "chain": "fantom", - "address": "0x66eEd5FF1701E6ed8470DC391F05e27B1d0657eb", - "symbol": "MPX", + "address": "0x4E30B1B79bfF30840755FafafD9ce8e408131552", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 11.0 + "transfer_fee": 0.00044 }, { - "chain": "linea", - "address": "0xa5325A8EBBbdb12CAF6b76218a7375a71f9f3b41", - "symbol": "MPX", + "chain": "filecoin", + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 11.0 - } - ] - }, - { - "id": "bal-wei", - "name": "BAL - Balancer", - "symbol": "BAL", - "image": "/images/assets/bal.svg", - "contracts": [ + "transfer_fee": 0.00044 + }, { - "chain": "arbitrum", - "address": "0x11C1879227D463b60db18C17c20aE739aE8E961a", - "symbol": "axlBAL", + "chain": "fraxtal", + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 1.6 + "transfer_fee": 0.0029 }, { - "chain": "base", - "address": "0x11C1879227D463b60db18C17c20aE739aE8E961a", - "symbol": "axlBAL", + "chain": "kava", + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 1.6 + "transfer_fee": 0.00044 }, { - "chain": "ethereum", - "address": "0xba100000625a3754423978a60c9317c58a424e3D", - "symbol": "BAL", + "chain": "linea", + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 25.0 + "transfer_fee": 0.0029 + }, + { + "chain": "mantle", + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283", + "symbol": "sfrxETH", + "decimals": 18, + "transfer_fee": 0.0029 + }, + { + "chain": "moonbeam", + "address": "0xa30d75990F80eC49944D5fC30157D43Fc28777b3", + "symbol": "sfrxETH", + "decimals": 18, + "transfer_fee": 0.00044 }, { "chain": "optimism", - "address": "0x11C1879227D463b60db18C17c20aE739aE8E961a", - "symbol": "axlBAL", + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 1.6 + "transfer_fee": 0.0029 }, { "chain": "polygon", - "address": "0xA8e417f73D68A239cE7E7FbD73b8081BE419767B", - "symbol": "axlBAL", + "address": "0x6013ee0C255d00BB885Fed03A3e1F1Ec3aD548AC", + "symbol": "sfrxETH", "decimals": 18, - "transfer_fee": 0.47 + "transfer_fee": 0.00044 + }, + { + "chain": "scroll", + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283", + "symbol": "sfrxETH", + "decimals": 18, + "transfer_fee": 0.0029 } ] }, { - "id": "ktc-wei", - "name": "KTC - KTX Community Token", - "symbol": "KTC", - "image": "/images/assets/ktc.svg", + "id": "frxeth-wei", + "name": "frxETH - Frax Ether", + "symbol": "frxETH", + "image": "/images/assets/frxeth.svg", "contracts": [ { "chain": "arbitrum", - "address": "0x01C5ED019A1Bc07d3A320a09C83C398d91f8fd5D", - "symbol": "KTC", + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 10.0 + "transfer_fee": 0.0032 }, { - "chain": "binance", - "address": "0x545356d4d69d8cD1213Ee7e339867574738751CA", - "symbol": "KTC", + "chain": "avalanche", + "address": "0x939b1a17C0d0Aa3fEA634Ad9157c88245A53C713", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 3.0 + "transfer_fee": 0.00048 }, { - "chain": "mantle", - "address": "0x01C5ED019A1Bc07d3A320a09C83C398d91f8fd5D", - "symbol": "KTC", + "chain": "base", + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 3.0 - } - ] - }, - { - "id": "vext-wei", - "name": "VEXT - Veloce", - "symbol": "VEXT", - "image": "/images/assets/vext.svg", - "contracts": [ + "transfer_fee": 0.0032 + }, { - "chain": "ethereum", - "address": "0x593Dc8C08387c9F4C8d522B49C76dD18518F4d7e", - "symbol": "VEXT", + "chain": "binance", + "address": "0x39Db1A30122031751e803Fabf329C44efBBfBf4B", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 1100.0 + "transfer_fee": 0.00048 }, { - "chain": "polygon", - "address": "0x27842334C55c01DDFE81Bf687425F906816c5141", - "symbol": "VEXT", + "chain": "blast", + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 21.0 - } - ] - }, - { - "id": "ovn-wei", - "name": "OVN - OVN", - "symbol": "OVN", - "image": "/images/assets/ovn.svg", - "contracts": [ + "transfer_fee": 0.0032 + }, { - "chain": "arbitrum", - "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396", - "symbol": "OVN", + "chain": "celo", + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 50.0 + "transfer_fee": 0.00048 }, { - "chain": "base", - "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396", - "symbol": "OVN", + "chain": "ethereum", + "address": "0x5E8422345238F34275888049021821E8E08CAa1f", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 50.0 + "transfer_fee": 0.019 }, { - "chain": "binance", - "address": "0x259B30C916e440FB79747cD559207FfdaBBae057", - "symbol": "OVN", + "chain": "fantom", + "address": "0x39Db1A30122031751e803Fabf329C44efBBfBf4B", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 15.0 + "transfer_fee": 0.00048 }, { - "chain": "linea", - "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396", - "symbol": "OVN", + "chain": "filecoin", + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 15.0 + "transfer_fee": 0.00048 }, { - "chain": "optimism", - "address": "0x3b08fcd15280e7B5A6e404c4abb87F7C774D1B2e", - "symbol": "OVN", + "chain": "fraxtal", + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 50.0 - } - ] - }, - { - "id": "vela-wei", - "name": "VELA - VelaToken", - "symbol": "VELA", - "image": "/images/assets/vela.svg", - "contracts": [ + "transfer_fee": 0.0032 + }, { - "chain": "arbitrum", - "address": "0x088cd8f5eF3652623c22D48b1605DCfE860Cd704", - "symbol": "VELA", + "chain": "kava", + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 0.00048 }, { - "chain": "base", - "address": "0x5A76A56ad937335168b30dF3AA1327277421C6Ae", - "symbol": "VELA", + "chain": "linea", + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 5.0 - } - ] - }, - { - "id": "arx-wei", - "name": "ARX - ArbiDex Token", - "symbol": "ARX", - "image": "/images/assets/arx.svg", - "contracts": [ + "transfer_fee": 0.0032 + }, { - "chain": "arbitrum", - "address": "0xD5954c3084a1cCd70B4dA011E67760B8e78aeE84", - "symbol": "ARX", + "chain": "mantle", + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 20.0 + "transfer_fee": 0.0032 }, { - "chain": "base", - "address": "0x58Ed4FD0C3d930b674BA50a293f03ef6cD7dE7a3", - "symbol": "ARX", + "chain": "moonbeam", + "address": "0x29C795559e4Db87054Ba70fafC454214c20aDbD4", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 20.0 - } - ] - }, - { - "id": "hzn-wei", - "name": "HZN - Horizon", - "symbol": "HZN", - "image": "/images/assets/hzn.svg", - "contracts": [ + "transfer_fee": 0.00048 + }, { - "chain": "base", - "address": "0x081AD949deFe648774C3B8deBe0E4F28a80716dc", - "symbol": "HZN", + "chain": "optimism", + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 50.0 + "transfer_fee": 0.0032 }, { - "chain": "linea", - "address": "0x0B1A02A7309dFbfAD1Cd4adC096582C87e8A3Ac1", - "symbol": "HZN", + "chain": "polygon", + "address": "0x01e91A094f5559f211e4ad4bED01468aBb64Bde3", + "symbol": "frxETH", "decimals": 18, - "transfer_fee": 15.0 + "transfer_fee": 0.00048 + }, + { + "chain": "scroll", + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D", + "symbol": "frxETH", + "decimals": 18, + "transfer_fee": 0.0032 } ] }, { - "id": "oath-wei", - "name": "OATH - Oath Token", - "symbol": "OATH", - "image": "/images/assets/oath.svg", + "id": "sfrax-wei", + "name": "sFRAX - Staked FRAX", + "symbol": "sFRAX", + "image": "/images/assets/sfrax.svg", "contracts": [ { "chain": "arbitrum", - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", - "symbol": "OATH", + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 120.0 + "transfer_fee": 9.9 }, { "chain": "avalanche", - "address": "0xAD090976CE846935DCfF1dEd852668beeD912916", - "symbol": "OATH", + "address": "0x70643975D408949044b8949Eba62f695FE12E348", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 38.0 + "transfer_fee": 1.5 }, { "chain": "base", - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", - "symbol": "OATH", + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 120.0 + "transfer_fee": 9.9 }, { "chain": "binance", - "address": "0x73f4C95AF5C2892253c068850B8C9a753636f58d", - "symbol": "OATH", + "address": "0xa0F18d6Cc2BBE1Da31DE214389BBEfb73a0C836b", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 38.0 + "transfer_fee": 1.5 + }, + { + "chain": "blast", + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3", + "symbol": "sFRAX", + "decimals": 18, + "transfer_fee": 9.9 }, { "chain": "celo", - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", - "symbol": "OATH", + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 38.0 + "transfer_fee": 1.5 }, { "chain": "ethereum", - "address": "0xd20523b39fAF1D6e9023a4D6085f87B7b0DE7926", - "symbol": "OATH", + "address": "0xA663B02CF0a4b149d2aD41910CB81e23e1c41c32", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 2000.0 + "transfer_fee": 59.0 }, { "chain": "fantom", - "address": "0x21Ada0D2aC28C3A5Fa3cD2eE30882dA8812279B6", - "symbol": "OATH", + "address": "0xa0F18d6Cc2BBE1Da31DE214389BBEfb73a0C836b", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 38.0 + "transfer_fee": 1.5 }, { "chain": "filecoin", - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", - "symbol": "OATH", + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 38.0 + "transfer_fee": 1.5 + }, + { + "chain": "fraxtal", + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3", + "symbol": "sFRAX", + "decimals": 18, + "transfer_fee": 9.9 }, { "chain": "kava", - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", - "symbol": "OATH", + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 38.0 + "transfer_fee": 1.5 }, { "chain": "linea", - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", - "symbol": "OATH", + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 38.0 + "transfer_fee": 9.9 }, { "chain": "mantle", - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", - "symbol": "OATH", + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 38.0 + "transfer_fee": 9.9 }, { "chain": "moonbeam", - "address": "0xd20523b39fAF1D6e9023a4D6085f87B7b0DE7926", - "symbol": "OATH", + "address": "0x481Fbf0d866b777e817bbC3f96970B44fc929Ba7", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 38.0 + "transfer_fee": 1.5 }, { "chain": "optimism", - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", - "symbol": "OATH", + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 120.0 + "transfer_fee": 9.9 }, { "chain": "polygon", - "address": "0x7c603C3C0C97a565cf202c94AB5298bF8510f7dc", - "symbol": "OATH", + "address": "0x1ED2B2b097E92B2Fe95a172dd29840c71294F1d6", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 38.0 + "transfer_fee": 1.5 }, { "chain": "scroll", - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", - "symbol": "OATH", + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3", + "symbol": "sFRAX", "decimals": 18, - "transfer_fee": 38.0 + "transfer_fee": 9.9 } ] }, { - "id": "pols-wei", - "name": "POLS - PolkastarterToken", - "symbol": "POLS", - "image": "/images/assets/pols.svg", + "id": "fxs-wei", + "name": "FXS - Frax Share", + "symbol": "FXS", + "image": "/images/assets/fxs.svg", "contracts": [ { - "chain": "binance", - "address": "0x7117e08b0734e1D643bf29B523F41ff89a1A1367", - "symbol": "POLS", + "chain": "arbitrum", + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 5.0 + "transfer_fee": 1.1 }, { - "chain": "ethereum", - "address": "0x83e6f1E41cdd28eAcEB20Cb649155049Fac3D5Aa", - "symbol": "POLS", + "chain": "avalanche", + "address": "0xb890Aa48D0C4DDa49F24F56187633C7a9b9a9c65", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 270.0 - } - ] - }, - { - "id": "ring-wei", - "name": "RING - OneRing", - "symbol": "RING", - "image": "/images/assets/ring.svg", - "contracts": [ + "transfer_fee": 0.17 + }, { - "chain": "arbitrum", - "address": "0x259c1C2ED264402b5ed2f02bc7dC25A15C680c18", - "symbol": "RING", + "chain": "base", + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 1700.0 + "transfer_fee": 1.1 }, { - "chain": "fantom", - "address": "0x582423C10c9e83387a96d00A69bA3D11ee47B7b5", - "symbol": "RING", + "chain": "binance", + "address": "0x05E7857Cb748F0018C0CBCe3dfd575B0d8677aeF", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 500.0 + "transfer_fee": 0.17 }, { - "chain": "optimism", - "address": "0x259c1C2ED264402b5ed2f02bc7dC25A15C680c18", - "symbol": "RING", + "chain": "blast", + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 1700.0 - } - ] - }, - { - "id": "zyb-wei", - "name": "ZYB - Zyber Token", - "symbol": "ZYB", - "image": "/images/assets/zyb.svg", - "contracts": [ + "transfer_fee": 1.1 + }, { - "chain": "arbitrum", - "address": "0x3B475F6f2f41853706afc9Fa6a6b8C5dF1a2724c", - "symbol": "ZYB", + "chain": "celo", + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 62.0 + "transfer_fee": 0.17 }, { - "chain": "optimism", - "address": "0xb4F2cF13b262C9f0ddB9B2A9143af753EF184E98", - "symbol": "ZYB", + "chain": "ethereum", + "address": "0x3432B6A60D23Ca0dFCa7761B7ab56459D9C964D0", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 62.0 - } - ] - }, - { - "id": "knc-wei", - "name": "KNC - Kyber Network Crystal v2", - "symbol": "KNC", - "image": "/images/assets/knc.svg", - "contracts": [ + "transfer_fee": 6.9 + }, { - "chain": "arbitrum", - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", - "symbol": "axlKNC", + "chain": "fantom", + "address": "0x05E7857Cb748F0018C0CBCe3dfd575B0d8677aeF", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 8.3 + "transfer_fee": 0.17 }, { - "chain": "avalanche", - "address": "0x22FA75d747320ae5D14cC625F696487C83243CD3", - "symbol": "axlKNC", + "chain": "filecoin", + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 2.5 + "transfer_fee": 0.17 }, { - "chain": "base", - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", - "symbol": "axlKNC", - "decimals": 18, - "transfer_fee": 8.3 - }, - { - "chain": "binance", - "address": "0xDF34bE7f242EE338644d8d1a1f4D11a807b4Da5f", - "symbol": "axlKNC", - "decimals": 18, - "transfer_fee": 2.5 - }, - { - "chain": "celo", - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", - "symbol": "axlKNC", - "decimals": 18, - "transfer_fee": 2.5 - }, - { - "chain": "ethereum", - "address": "0xdeFA4e8a7bcBA345F687a2f1456F5Edd9CE97202", - "symbol": "KNC", - "decimals": 18, - "transfer_fee": 130.0 - }, - { - "chain": "fantom", - "address": "0xDF34bE7f242EE338644d8d1a1f4D11a807b4Da5f", - "symbol": "axlKNC", - "decimals": 18, - "transfer_fee": 2.5 - }, - { - "chain": "filecoin", - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", - "symbol": "axlKNC", + "chain": "fraxtal", + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 2.5 + "transfer_fee": 1.1 }, { "chain": "kava", - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", - "symbol": "axlKNC", + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 2.5 + "transfer_fee": 0.17 }, { "chain": "linea", - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", - "symbol": "axlKNC", + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 2.5 + "transfer_fee": 1.1 }, { "chain": "mantle", - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", - "symbol": "axlKNC", + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 2.5 + "transfer_fee": 1.1 }, { "chain": "moonbeam", - "address": "0x5Ac3aD1acC0A3EFd6fB89791967656128e86d8C5", - "symbol": "axlKNC", + "address": "0x151904806a266EEe52700E195D2937891fb8eD59", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 2.5 + "transfer_fee": 0.17 }, { "chain": "optimism", - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", - "symbol": "axlKNC", + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 8.3 + "transfer_fee": 1.1 }, { "chain": "polygon", - "address": "0x46371C90fcCE4D7367a61CB43eA7922406bC707a", - "symbol": "axlKNC", + "address": "0x75b33EAA41DBc1Aae041d718AdfA4D446dD35ACC", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 2.5 + "transfer_fee": 0.17 }, { "chain": "scroll", - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", - "symbol": "axlKNC", + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721", + "symbol": "FXS", "decimals": 18, - "transfer_fee": 2.5 + "transfer_fee": 1.1 } ] }, { - "id": "orbs-wei", - "name": "ORBS - Orbs", - "symbol": "ORBS", - "image": "/images/assets/orbs.svg", + "id": "reth-wei", + "name": "rETH - Rocket Pool ETH", + "symbol": "rETH", + "image": "/images/assets/reth.svg", "contracts": [ { - "chain": "arbitrum", - "address": "0xf3C091ed43de9c270593445163a41A876A0bb3dd", - "symbol": "ORBS", + "chain": "ethereum", + "address": "0xae78736Cd615f374D3085123A210448E74Fc6393", + "symbol": "rETH", "decimals": 18, - "transfer_fee": 200.0 - }, + "transfer_fee": 0.018 + } + ] + }, + { + "id": "arb-wei", + "name": "ARB - Arbitrum", + "symbol": "ARB", + "image": "/images/assets/arb.svg", + "contracts": [ { - "chain": "avalanche", - "address": "0x3Ab1C9aDb065F3FcA0059652Cd7A52B05C98f9a9", - "symbol": "ORBS", + "chain": "arbitrum", + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", "decimals": 18, - "transfer_fee": 60.0 + "transfer_fee": 7.6 }, { - "chain": "binance", - "address": "0x43a8cab15D06d3a5fE5854D714C37E7E9246F170", - "symbol": "ORBS", + "chain": "base", + "address": "0x87b6c94c435F6e49789ad34FAf0d048F2D9043a2", + "symbol": "axlARB", "decimals": 18, - "transfer_fee": 60.0 + "transfer_fee": 7.6 }, { - "chain": "ethereum", - "address": "0xff56Cc6b1E6dEd347aA0B7676C85AB0B3D08B0FA", - "symbol": "ORBS", + "chain": "linea", + "address": "0x87b6c94c435F6e49789ad34FAf0d048F2D9043a2", + "symbol": "axlARB", "decimals": 18, - "transfer_fee": 3200.0 - }, + "transfer_fee": 7.6 + } + ] + }, + { + "id": "op-wei", + "name": "OP - Optimism", + "symbol": "OP", + "image": "/images/assets/op.svg", + "contracts": [ { - "chain": "fantom", - "address": "0x43a8cab15D06d3a5fE5854D714C37E7E9246F170", - "symbol": "ORBS", + "chain": "base", + "address": "0x994ac01750047B9d35431a7Ae4Ed312ee955E030", + "symbol": "axlOP", "decimals": 18, - "transfer_fee": 60.0 + "transfer_fee": 2.6 }, { - "chain": "kava", - "address": "0xf3C091ed43de9c270593445163a41A876A0bb3dd", - "symbol": "ORBS", + "chain": "optimism", + "address": "0x4200000000000000000000000000000000000042", + "symbol": "OP", "decimals": 18, - "transfer_fee": 60.0 + "transfer_fee": 2.6 } ] }, { - "id": "gdx-wei", - "name": "GDX - Gridex", - "symbol": "GDX", - "image": "/images/assets/gdx.svg", + "id": "mpx-wei", + "name": "MPX - MPX", + "symbol": "MPX", + "image": "/images/assets/mpx.svg", "contracts": [ - { - "chain": "arbitrum", - "address": "0x2F27118E3D2332aFb7d165140Cf1bB127eA6975d", - "symbol": "GDX", - "decimals": 18, - "transfer_fee": 250.0 - }, { "chain": "base", - "address": "0x91c415FEcD651F11D24aC4b72Ed08dbEb9868D43", - "symbol": "GDX", + "address": "0xa5325A8EBBbdb12CAF6b76218a7375a71f9f3b41", + "symbol": "MPX", "decimals": 18, - "transfer_fee": 250.0 + "transfer_fee": 71.0 }, { "chain": "binance", - "address": "0x4E11B45E4Ae94eE8c32760Dd3286836BDfe47524", - "symbol": "GDX", + "address": "0x94C6B279b5df54b335aE51866d6E2A56BF5Ef9b7", + "symbol": "MPX", "decimals": 18, - "transfer_fee": 75.0 + "transfer_fee": 11.0 }, { - "chain": "ethereum", - "address": "0x89901994b5Ed81cbbcBC4E5A7e0cC4e7F58e5458", - "symbol": "GDX", + "chain": "fantom", + "address": "0x66eEd5FF1701E6ed8470DC391F05e27B1d0657eb", + "symbol": "MPX", "decimals": 18, - "transfer_fee": 4000.0 + "transfer_fee": 11.0 }, { "chain": "linea", - "address": "0x91c415FEcD651F11D24aC4b72Ed08dbEb9868D43", - "symbol": "GDX", - "decimals": 18, - "transfer_fee": 75.0 - }, - { - "chain": "optimism", - "address": "0x91c415FEcD651F11D24aC4b72Ed08dbEb9868D43", - "symbol": "GDX", - "decimals": 18, - "transfer_fee": 250.0 - }, - { - "chain": "polygon", - "address": "0xB0684AEb24b70A8973F2459DB4AB83a4be9139fB", - "symbol": "GDX", + "address": "0xa5325A8EBBbdb12CAF6b76218a7375a71f9f3b41", + "symbol": "MPX", "decimals": 18, - "transfer_fee": 75.0 + "transfer_fee": 71.0 } ] }, { - "id": "deus-wei", - "name": "DEUS - DEUS", - "symbol": "DEUS", - "image": "/images/assets/deus.svg", + "id": "bal-wei", + "name": "BAL - Balancer", + "symbol": "BAL", + "image": "/images/assets/bal.svg", "contracts": [ { "chain": "arbitrum", - "address": "0xDE5ed76E7c05eC5e4572CfC88d1ACEA165109E44", - "symbol": "DEUS", - "decimals": 18, - "transfer_fee": 0.2 - }, - { - "chain": "avalanche", - "address": "0xf9617c66cD8a4193A4DE0a101e16D73B71828810", - "symbol": "axlDEUS", + "address": "0x11C1879227D463b60db18C17c20aE739aE8E961a", + "symbol": "axlBAL", "decimals": 18, - "transfer_fee": 0.06 + "transfer_fee": 3.1 }, { "chain": "base", - "address": "0xebD4A18034C78A415088DF8508f102421eD693b1", - "symbol": "axlDEUS", - "decimals": 18, - "transfer_fee": 0.2 - }, - { - "chain": "binance", - "address": "0x912922e25ac79D524734d8eC0C882B035c5b356f", - "symbol": "axlDEUS", + "address": "0x11C1879227D463b60db18C17c20aE739aE8E961a", + "symbol": "axlBAL", "decimals": 18, - "transfer_fee": 0.06 + "transfer_fee": 3.1 }, { "chain": "ethereum", - "address": "0x69e557b926F4eEf6d9400e36DBBFEb9600Af2880", - "symbol": "axlDEUS", - "decimals": 18, - "transfer_fee": 3.2 - }, - { - "chain": "fantom", - "address": "0x912922e25ac79D524734d8eC0C882B035c5b356f", - "symbol": "axlDEUS", - "decimals": 18, - "transfer_fee": 0.06 - }, - { - "chain": "kava", - "address": "0xebD4A18034C78A415088DF8508f102421eD693b1", - "symbol": "axlDEUS", + "address": "0xba100000625a3754423978a60c9317c58a424e3D", + "symbol": "BAL", "decimals": 18, - "transfer_fee": 0.06 + "transfer_fee": 19.0 }, { "chain": "optimism", - "address": "0xebD4A18034C78A415088DF8508f102421eD693b1", - "symbol": "axlDEUS", + "address": "0x11C1879227D463b60db18C17c20aE739aE8E961a", + "symbol": "axlBAL", "decimals": 18, - "transfer_fee": 0.2 + "transfer_fee": 3.1 }, { "chain": "polygon", - "address": "0x12A80A285DfaBd23FC1DFe6c515F034A22d9cdCE", - "symbol": "axlDEUS", + "address": "0xA8e417f73D68A239cE7E7FbD73b8081BE419767B", + "symbol": "axlBAL", "decimals": 18, - "transfer_fee": 0.06 + "transfer_fee": 0.47 } ] }, { - "id": "sonne-wei", - "name": "SONNE - Sonne", - "symbol": "SONNE", - "image": "/images/assets/sonne.svg", + "id": "ktc-wei", + "name": "KTC - KTX Community Token", + "symbol": "KTC", + "image": "/images/assets/ktc.svg", "contracts": [ { - "chain": "base", - "address": "0x22a2488fE295047Ba13BD8cCCdBC8361DBD8cf7c", - "symbol": "SONNE", + "chain": "arbitrum", + "address": "0x01C5ED019A1Bc07d3A320a09C83C398d91f8fd5D", + "symbol": "KTC", "decimals": 18, - "transfer_fee": 33.0 + "transfer_fee": 20.0 }, { - "chain": "optimism", - "address": "0x1DB2466d9F5e10D7090E7152B68d62703a2245F0", - "symbol": "SONNE", + "chain": "binance", + "address": "0x545356d4d69d8cD1213Ee7e339867574738751CA", + "symbol": "KTC", "decimals": 18, - "transfer_fee": 33.0 - } - ] + "transfer_fee": 3.0 + }, + { + "chain": "mantle", + "address": "0x01C5ED019A1Bc07d3A320a09C83C398d91f8fd5D", + "symbol": "KTC", + "decimals": 18, + "transfer_fee": 20.0 + } + ] + }, + { + "id": "vext-wei", + "name": "VEXT - Veloce", + "symbol": "VEXT", + "image": "/images/assets/vext.svg", + "contracts": [ + { + "chain": "ethereum", + "address": "0x593Dc8C08387c9F4C8d522B49C76dD18518F4d7e", + "symbol": "VEXT", + "decimals": 18, + "transfer_fee": 860.0 + }, + { + "chain": "polygon", + "address": "0x27842334C55c01DDFE81Bf687425F906816c5141", + "symbol": "VEXT", + "decimals": 18, + "transfer_fee": 21.0 + } + ] + }, + { + "id": "ovn-wei", + "name": "OVN - OVN", + "symbol": "OVN", + "image": "/images/assets/ovn.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396", + "symbol": "OVN", + "decimals": 18, + "transfer_fee": 100.0 + }, + { + "chain": "base", + "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396", + "symbol": "OVN", + "decimals": 18, + "transfer_fee": 100.0 + }, + { + "chain": "binance", + "address": "0x259B30C916e440FB79747cD559207FfdaBBae057", + "symbol": "OVN", + "decimals": 18, + "transfer_fee": 15.0 + }, + { + "chain": "blast", + "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396", + "symbol": "OVN", + "decimals": 18, + "transfer_fee": 100.0 + }, + { + "chain": "linea", + "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396", + "symbol": "OVN", + "decimals": 18, + "transfer_fee": 100.0 + }, + { + "chain": "optimism", + "address": "0x3b08fcd15280e7B5A6e404c4abb87F7C774D1B2e", + "symbol": "OVN", + "decimals": 18, + "transfer_fee": 100.0 + } + ] + }, + { + "id": "vela-wei", + "name": "VELA - VelaToken", + "symbol": "VELA", + "image": "/images/assets/vela.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x088cd8f5eF3652623c22D48b1605DCfE860Cd704", + "symbol": "VELA", + "decimals": 18, + "transfer_fee": 10.0 + }, + { + "chain": "base", + "address": "0x5A76A56ad937335168b30dF3AA1327277421C6Ae", + "symbol": "VELA", + "decimals": 18, + "transfer_fee": 10.0 + } + ] + }, + { + "id": "arx-wei", + "name": "ARX - ArbiDex Token", + "symbol": "ARX", + "image": "/images/assets/arx.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0xD5954c3084a1cCd70B4dA011E67760B8e78aeE84", + "symbol": "ARX", + "decimals": 18, + "transfer_fee": 40.0 + }, + { + "chain": "base", + "address": "0x58Ed4FD0C3d930b674BA50a293f03ef6cD7dE7a3", + "symbol": "ARX", + "decimals": 18, + "transfer_fee": 40.0 + } + ] + }, + { + "id": "hzn-wei", + "name": "HZN - Horizon", + "symbol": "HZN", + "image": "/images/assets/hzn.svg", + "contracts": [ + { + "chain": "base", + "address": "0x081AD949deFe648774C3B8deBe0E4F28a80716dc", + "symbol": "HZN", + "decimals": 18, + "transfer_fee": 100.0 + }, + { + "chain": "linea", + "address": "0x0B1A02A7309dFbfAD1Cd4adC096582C87e8A3Ac1", + "symbol": "HZN", + "decimals": 18, + "transfer_fee": 100.0 + } + ] + }, + { + "id": "oath-wei", + "name": "OATH - Oath Token", + "symbol": "OATH", + "image": "/images/assets/oath.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 250.0 + }, + { + "chain": "avalanche", + "address": "0xAD090976CE846935DCfF1dEd852668beeD912916", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 38.0 + }, + { + "chain": "base", + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 250.0 + }, + { + "chain": "binance", + "address": "0x73f4C95AF5C2892253c068850B8C9a753636f58d", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 38.0 + }, + { + "chain": "blast", + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 250.0 + }, + { + "chain": "celo", + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 38.0 + }, + { + "chain": "ethereum", + "address": "0xd20523b39fAF1D6e9023a4D6085f87B7b0DE7926", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 1500.0 + }, + { + "chain": "fantom", + "address": "0x21Ada0D2aC28C3A5Fa3cD2eE30882dA8812279B6", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 38.0 + }, + { + "chain": "filecoin", + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 38.0 + }, + { + "chain": "fraxtal", + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 250.0 + }, + { + "chain": "kava", + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 38.0 + }, + { + "chain": "linea", + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 250.0 + }, + { + "chain": "mantle", + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 250.0 + }, + { + "chain": "moonbeam", + "address": "0xd20523b39fAF1D6e9023a4D6085f87B7b0DE7926", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 38.0 + }, + { + "chain": "optimism", + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 250.0 + }, + { + "chain": "polygon", + "address": "0x7c603C3C0C97a565cf202c94AB5298bF8510f7dc", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 38.0 + }, + { + "chain": "scroll", + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A", + "symbol": "OATH", + "decimals": 18, + "transfer_fee": 250.0 + } + ] + }, + { + "id": "pols-wei", + "name": "POLS - PolkastarterToken", + "symbol": "POLS", + "image": "/images/assets/pols.svg", + "contracts": [ + { + "chain": "binance", + "address": "0x7117e08b0734e1D643bf29B523F41ff89a1A1367", + "symbol": "POLS", + "decimals": 18, + "transfer_fee": 5.0 + }, + { + "chain": "ethereum", + "address": "0x83e6f1E41cdd28eAcEB20Cb649155049Fac3D5Aa", + "symbol": "POLS", + "decimals": 18, + "transfer_fee": 200.0 + } + ] + }, + { + "id": "ring-wei", + "name": "RING - OneRing", + "symbol": "RING", + "image": "/images/assets/ring.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x259c1C2ED264402b5ed2f02bc7dC25A15C680c18", + "symbol": "RING", + "decimals": 18, + "transfer_fee": 3300.0 + }, + { + "chain": "fantom", + "address": "0x582423C10c9e83387a96d00A69bA3D11ee47B7b5", + "symbol": "RING", + "decimals": 18, + "transfer_fee": 500.0 + }, + { + "chain": "optimism", + "address": "0x259c1C2ED264402b5ed2f02bc7dC25A15C680c18", + "symbol": "RING", + "decimals": 18, + "transfer_fee": 3300.0 + } + ] + }, + { + "id": "zyb-wei", + "name": "ZYB - Zyber Token", + "symbol": "ZYB", + "image": "/images/assets/zyb.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x3B475F6f2f41853706afc9Fa6a6b8C5dF1a2724c", + "symbol": "ZYB", + "decimals": 18, + "transfer_fee": 120.0 + }, + { + "chain": "optimism", + "address": "0xb4F2cF13b262C9f0ddB9B2A9143af753EF184E98", + "symbol": "ZYB", + "decimals": 18, + "transfer_fee": 120.0 + } + ] + }, + { + "id": "knc-wei", + "name": "KNC - Kyber Network Crystal v2", + "symbol": "KNC", + "image": "/images/assets/knc.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 17.0 + }, + { + "chain": "avalanche", + "address": "0x22FA75d747320ae5D14cC625F696487C83243CD3", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 2.5 + }, + { + "chain": "base", + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 17.0 + }, + { + "chain": "binance", + "address": "0xDF34bE7f242EE338644d8d1a1f4D11a807b4Da5f", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 2.5 + }, + { + "chain": "blast", + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 17.0 + }, + { + "chain": "celo", + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 2.5 + }, + { + "chain": "ethereum", + "address": "0xdeFA4e8a7bcBA345F687a2f1456F5Edd9CE97202", + "symbol": "KNC", + "decimals": 18, + "transfer_fee": 100.0 + }, + { + "chain": "fantom", + "address": "0xDF34bE7f242EE338644d8d1a1f4D11a807b4Da5f", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 2.5 + }, + { + "chain": "filecoin", + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 2.5 + }, + { + "chain": "fraxtal", + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 17.0 + }, + { + "chain": "kava", + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 2.5 + }, + { + "chain": "linea", + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 17.0 + }, + { + "chain": "mantle", + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 17.0 + }, + { + "chain": "moonbeam", + "address": "0x5Ac3aD1acC0A3EFd6fB89791967656128e86d8C5", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 2.5 + }, + { + "chain": "optimism", + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 17.0 + }, + { + "chain": "polygon", + "address": "0x46371C90fcCE4D7367a61CB43eA7922406bC707a", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 2.5 + }, + { + "chain": "scroll", + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df", + "symbol": "axlKNC", + "decimals": 18, + "transfer_fee": 17.0 + } + ] + }, + { + "id": "orbs-wei", + "name": "ORBS - Orbs", + "symbol": "ORBS", + "image": "/images/assets/orbs.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0xf3C091ed43de9c270593445163a41A876A0bb3dd", + "symbol": "ORBS", + "decimals": 18, + "transfer_fee": 400.0 + }, + { + "chain": "avalanche", + "address": "0x3Ab1C9aDb065F3FcA0059652Cd7A52B05C98f9a9", + "symbol": "ORBS", + "decimals": 18, + "transfer_fee": 60.0 + }, + { + "chain": "binance", + "address": "0x43a8cab15D06d3a5fE5854D714C37E7E9246F170", + "symbol": "ORBS", + "decimals": 18, + "transfer_fee": 60.0 + }, + { + "chain": "ethereum", + "address": "0xff56Cc6b1E6dEd347aA0B7676C85AB0B3D08B0FA", + "symbol": "ORBS", + "decimals": 18, + "transfer_fee": 2400.0 + }, + { + "chain": "fantom", + "address": "0x43a8cab15D06d3a5fE5854D714C37E7E9246F170", + "symbol": "ORBS", + "decimals": 18, + "transfer_fee": 60.0 + }, + { + "chain": "kava", + "address": "0xf3C091ed43de9c270593445163a41A876A0bb3dd", + "symbol": "ORBS", + "decimals": 18, + "transfer_fee": 60.0 + } + ] + }, + { + "id": "gdx-wei", + "name": "GDX - Gridex", + "symbol": "GDX", + "image": "/images/assets/gdx.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x2F27118E3D2332aFb7d165140Cf1bB127eA6975d", + "symbol": "GDX", + "decimals": 18, + "transfer_fee": 500.0 + }, + { + "chain": "base", + "address": "0x91c415FEcD651F11D24aC4b72Ed08dbEb9868D43", + "symbol": "GDX", + "decimals": 18, + "transfer_fee": 500.0 + }, + { + "chain": "binance", + "address": "0x4E11B45E4Ae94eE8c32760Dd3286836BDfe47524", + "symbol": "GDX", + "decimals": 18, + "transfer_fee": 75.0 + }, + { + "chain": "ethereum", + "address": "0x89901994b5Ed81cbbcBC4E5A7e0cC4e7F58e5458", + "symbol": "GDX", + "decimals": 18, + "transfer_fee": 3000.0 + }, + { + "chain": "linea", + "address": "0x91c415FEcD651F11D24aC4b72Ed08dbEb9868D43", + "symbol": "GDX", + "decimals": 18, + "transfer_fee": 500.0 + }, + { + "chain": "optimism", + "address": "0x91c415FEcD651F11D24aC4b72Ed08dbEb9868D43", + "symbol": "GDX", + "decimals": 18, + "transfer_fee": 500.0 + }, + { + "chain": "polygon", + "address": "0xB0684AEb24b70A8973F2459DB4AB83a4be9139fB", + "symbol": "GDX", + "decimals": 18, + "transfer_fee": 75.0 + } + ] + }, + { + "id": "deus-wei", + "name": "DEUS - DEUS", + "symbol": "DEUS", + "image": "/images/assets/deus.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0xDE5ed76E7c05eC5e4572CfC88d1ACEA165109E44", + "symbol": "DEUS", + "decimals": 18, + "transfer_fee": 0.4 + }, + { + "chain": "avalanche", + "address": "0xf9617c66cD8a4193A4DE0a101e16D73B71828810", + "symbol": "axlDEUS", + "decimals": 18, + "transfer_fee": 0.06 + }, + { + "chain": "base", + "address": "0xebD4A18034C78A415088DF8508f102421eD693b1", + "symbol": "axlDEUS", + "decimals": 18, + "transfer_fee": 0.4 + }, + { + "chain": "binance", + "address": "0x912922e25ac79D524734d8eC0C882B035c5b356f", + "symbol": "axlDEUS", + "decimals": 18, + "transfer_fee": 0.06 + }, + { + "chain": "blast", + "address": "0xebD4A18034C78A415088DF8508f102421eD693b1", + "symbol": "axlDEUS", + "decimals": 18, + "transfer_fee": 0.4 + }, + { + "chain": "ethereum", + "address": "0x69e557b926F4eEf6d9400e36DBBFEb9600Af2880", + "symbol": "axlDEUS", + "decimals": 18, + "transfer_fee": 2.4 + }, + { + "chain": "fantom", + "address": "0x912922e25ac79D524734d8eC0C882B035c5b356f", + "symbol": "axlDEUS", + "decimals": 18, + "transfer_fee": 0.06 + }, + { + "chain": "kava", + "address": "0xebD4A18034C78A415088DF8508f102421eD693b1", + "symbol": "axlDEUS", + "decimals": 18, + "transfer_fee": 0.06 + }, + { + "chain": "optimism", + "address": "0xebD4A18034C78A415088DF8508f102421eD693b1", + "symbol": "axlDEUS", + "decimals": 18, + "transfer_fee": 0.4 + }, + { + "chain": "polygon", + "address": "0x12A80A285DfaBd23FC1DFe6c515F034A22d9cdCE", + "symbol": "axlDEUS", + "decimals": 18, + "transfer_fee": 0.06 + } + ] + }, + { + "id": "sonne-wei", + "name": "SONNE - Sonne", + "symbol": "SONNE", + "image": "/images/assets/sonne.svg", + "contracts": [ + { + "chain": "base", + "address": "0x22a2488fE295047Ba13BD8cCCdBC8361DBD8cf7c", + "symbol": "SONNE", + "decimals": 18, + "transfer_fee": 67.0 + }, + { + "chain": "optimism", + "address": "0x1DB2466d9F5e10D7090E7152B68d62703a2245F0", + "symbol": "SONNE", + "decimals": 18, + "transfer_fee": 67.0 + } + ] + }, + { + "id": "uumee", + "name": "UMEE - Umee native token", + "symbol": "UMEE", + "image": "/images/assets/umee.svg", + "contracts": [ + { + "chain": "ethereum", + "address": "0x923e030f951A2401426a3407a9bcc7EB715d9a0b", + "symbol": "UMEE", + "decimals": 6, + "transfer_fee": 15000.0 + } + ] + }, + { + "id": "stuatom", + "name": "stATOM - Stride Staked Atom", + "symbol": "stATOM", + "image": "/images/assets/statom.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "avalanche", + "address": "0x2fFFE7f113FDB41fc8Ffd3B67E7b7eFA2b3a030d", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "base", + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "binance", + "address": "0x4Bd3231E7eFc193F13a89b23ED6970776a91CF63", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "blast", + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "celo", + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "ethereum", + "address": "0x2924894E7886C6B9018179946EE389bb06534021", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 5.0 + }, + { + "chain": "fantom", + "address": "0x4Bd3231E7eFc193F13a89b23ED6970776a91CF63", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "fraxtal", + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "linea", + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "mantle", + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "moonbeam", + "address": "0x2924894E7886C6B9018179946EE389bb06534021", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "optimism", + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "polygon", + "address": "0x9132ab3B9EcA438184588b8887CeD9dE0FCA19AE", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "scroll", + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", + "symbol": "stATOM", + "decimals": 6, + "transfer_fee": 0.83 + } + ] + }, + { + "id": "stutia", + "name": "stTIA - Stride Staked Tia", + "symbol": "stTIA", + "image": "/images/assets/sttia.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.63 + }, + { + "chain": "avalanche", + "address": "0x86ae86e42286BC37e502fB26d2f7DD2813dADCd1", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.094 + }, + { + "chain": "base", + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.63 + }, + { + "chain": "binance", + "address": "0x3Ef52A56Ce63f9d22F5ACdDA4e5Bd8b0c65C37a5", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.094 + }, + { + "chain": "blast", + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.63 + }, + { + "chain": "celo", + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.094 + }, + { + "chain": "ethereum", + "address": "0xF84131c858EB4C51cda2ccF0Eb614994c456c9E7", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 3.8 + }, + { + "chain": "fantom", + "address": "0x3Ef52A56Ce63f9d22F5ACdDA4e5Bd8b0c65C37a5", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.094 + }, + { + "chain": "filecoin", + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.094 + }, + { + "chain": "fraxtal", + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.63 + }, + { + "chain": "kava", + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.094 + }, + { + "chain": "linea", + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.63 + }, + { + "chain": "mantle", + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.63 + }, + { + "chain": "moonbeam", + "address": "0xF84131c858EB4C51cda2ccF0Eb614994c456c9E7", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.094 + }, + { + "chain": "optimism", + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.63 + }, + { + "chain": "polygon", + "address": "0xd2df01598512F7cf6E0ec54beFc439f923e0dd32", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.094 + }, + { + "chain": "scroll", + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61", + "symbol": "stTIA.axl", + "decimals": 6, + "transfer_fee": 0.63 + } + ] + }, + { + "id": "stkbnb-wei", + "name": "stkBNB - Staked BNB", + "symbol": "stkBNB", + "image": "/images/assets/stkbnb.svg", + "contracts": [ + { + "chain": "binance", + "address": "0xc2E9d07F66A89c44062459A47a0D2Dc038E4fb16", + "symbol": "stkBNB", + "decimals": 18, + "transfer_fee": 0.0065 + } + ] + }, + { + "id": "ustrd", + "name": "STRD - Stride", + "symbol": "STRD", + "image": "/images/assets/strd.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 20.0 + }, + { + "chain": "avalanche", + "address": "0x24562dd9D02f7ECE43B947e61E313778273F140b", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 3.0 + }, + { + "chain": "base", + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 20.0 + }, + { + "chain": "binance", + "address": "0x922946A8A2FAE7a8b4506bd54Ea361482Eff95dD", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 3.0 + }, + { + "chain": "blast", + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 20.0 + }, + { + "chain": "celo", + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 3.0 + }, + { + "chain": "ethereum", + "address": "0x85eBBf7253295d37C5FC98bE5Aac87CA4378c2e2", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 120.0 + }, + { + "chain": "fantom", + "address": "0x922946A8A2FAE7a8b4506bd54Ea361482Eff95dD", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 3.0 + }, + { + "chain": "fraxtal", + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 20.0 + }, + { + "chain": "linea", + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 20.0 + }, + { + "chain": "mantle", + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 20.0 + }, + { + "chain": "moonbeam", + "address": "0x85eBBf7253295d37C5FC98bE5Aac87CA4378c2e2", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 3.0 + }, + { + "chain": "optimism", + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 20.0 + }, + { + "chain": "polygon", + "address": "0x1D9b7C028e5018c7057c6F57366a1350c9CeADE5", + "symbol": "STRD", + "decimals": 6, + "transfer_fee": 3.0 + } + ] + }, + { + "id": "wmatic-wei", + "name": "WMATIC - Wrapped Matic", + "symbol": "WMATIC", + "image": "/images/assets/wmatic.svg", + "contracts": [ + { + "chain": "base", + "address": "0xE3ce47AC96d8502824627d7cBCFDA49414beDa9C", + "symbol": "axlMATIC", + "decimals": 18, + "transfer_fee": 14.0 + }, + { + "chain": "linea", + "address": "0xE3ce47AC96d8502824627d7cBCFDA49414beDa9C", + "symbol": "axlMATIC", + "decimals": 18, + "transfer_fee": 14.0 + }, + { + "chain": "polygon", + "address": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", + "symbol": "WMATIC", + "decimals": 18, + "transfer_fee": 2.1 + } + ] + }, + { + "id": "wavax-wei", + "name": "WAVAX - Wrapped AVAX", + "symbol": "WAVAX", + "image": "/images/assets/wavax.svg", + "contracts": [ + { + "chain": "avalanche", + "address": "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7", + "symbol": "WAVAX", + "decimals": 18, + "transfer_fee": 0.045 + }, + { + "chain": "base", + "address": "0x6E76A241Ae6fcaD51C064Ac70fe6e676502b91c5", + "symbol": "axlAVAX", + "decimals": 18, + "transfer_fee": 0.3 + }, + { + "chain": "fantom", + "address": "0x879e73005C36d9a549fFb9846851fe5d1d91b681", + "symbol": "axlAVAX", + "decimals": 18, + "transfer_fee": 0.045 + }, + { + "chain": "linea", + "address": "0x6E76A241Ae6fcaD51C064Ac70fe6e676502b91c5", + "symbol": "axlAVAX", + "decimals": 18, + "transfer_fee": 0.3 + } + ] + }, + { + "id": "wglmr-wei", + "name": "WGLMR - Wrapped GLMR", + "symbol": "WGLMR", + "image": "/images/assets/wglmr.svg", + "contracts": [ + { + "chain": "moonbeam", + "address": "0xAcc15dC74880C9944775448304B263D191c6077F", + "symbol": "WGLMR", + "decimals": 18, + "transfer_fee": 4.3 + } + ] + }, + { + "id": "wbnb-wei", + "name": "WBNB - Wrapped BNB", + "symbol": "WBNB", + "image": "/images/assets/wbnb.svg", + "contracts": [ + { + "chain": "base", + "address": "0x23A6486099f740B7688A0bb7AED7C912015cA2F0", + "symbol": "axlBNB", + "decimals": 18, + "transfer_fee": 0.018 + }, + { + "chain": "binance", + "address": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "symbol": "WBNB", + "decimals": 18, + "transfer_fee": 0.0027 + }, + { + "chain": "kava", + "address": "0x23A6486099f740B7688A0bb7AED7C912015cA2F0", + "symbol": "axlBNB", + "decimals": 18, + "transfer_fee": 0.0027 + }, + { + "chain": "linea", + "address": "0x23A6486099f740B7688A0bb7AED7C912015cA2F0", + "symbol": "axlBNB", + "decimals": 18, + "transfer_fee": 0.018 + } + ] + }, + { + "id": "wftm-wei", + "name": "WFTM - Wrapped Fantom", + "symbol": "WFTM", + "image": "/images/assets/wftm.svg", + "contracts": [ + { + "chain": "avalanche", + "address": "0xbB72a453a9280864C330Fa23fFABff73991119A0", + "symbol": "axlFTM", + "decimals": 18, + "transfer_fee": 2.2 + }, + { + "chain": "base", + "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8", + "symbol": "axlFTM", + "decimals": 18, + "transfer_fee": 15.0 + }, + { + "chain": "fantom", + "address": "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83", + "symbol": "WFTM", + "decimals": 18, + "transfer_fee": 2.2 + }, + { + "chain": "linea", + "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8", + "symbol": "axlFTM", + "decimals": 18, + "transfer_fee": 15.0 + }, + { + "chain": "mantle", + "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8", + "symbol": "axlFTM", + "decimals": 18, + "transfer_fee": 15.0 + }, + { + "chain": "scroll", + "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8", + "symbol": "axlFTM", + "decimals": 18, + "transfer_fee": 15.0 + } + ] + }, + { + "id": "uatom", + "name": "ATOM - Cosmoshub staking ATOM", + "symbol": "ATOM", + "image": "/images/assets/atom.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "avalanche", + "address": "0x80D18b1c9Ab0c9B5D6A6d5173575417457d00a12", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "base", + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "binance", + "address": "0x3966001bEb78FD309665EA78FF8a4dA2E7E13180", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "blast", + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "celo", + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "ethereum", + "address": "0x27292cf0016E5dF1d8b37306B2A98588aCbD6fCA", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 5.0 + }, + { + "chain": "fantom", + "address": "0x3bB68cb55Fc9C22511467c18E42D14E8c959c4dA", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "filecoin", + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "fraxtal", + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "kava", + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "linea", + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "mantle", + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "moonbeam", + "address": "0x27292cf0016E5dF1d8b37306B2A98588aCbD6fCA", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "optimism", + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.83 + }, + { + "chain": "polygon", + "address": "0x33F8a5029264BcFB66e39157aF3FeA3E2a8a5067", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.12 + }, + { + "chain": "scroll", + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", + "symbol": "axlATOM", + "decimals": 6, + "transfer_fee": 0.83 + } + ] + }, + { + "id": "usomm", + "name": "SOMM - Axelar Wrapped SOMM", + "symbol": "SOMM", + "image": "/images/assets/somm.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x4e914bbDCDE0f455A8aC9d59d3bF739c46287Ed2", + "symbol": "axlSOMM", + "decimals": 6, + "transfer_fee": 67.0 + }, + { + "chain": "avalanche", + "address": "0x421CC964D5A3FEf29c6839c54C40E9d1D554aFA4", + "symbol": "axlSOMM", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "base", + "address": "0x4e914bbDCDE0f455A8aC9d59d3bF739c46287Ed2", + "symbol": "axlSOMM", + "decimals": 6, + "transfer_fee": 67.0 + }, + { + "chain": "binance", + "address": "0xBa0651622b11110Ef1F04cE7c78f10ca0AF997bD", + "symbol": "axlSOMM", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "mantle", + "address": "0x4e914bbDCDE0f455A8aC9d59d3bF739c46287Ed2", + "symbol": "axlSOMM", + "decimals": 6, + "transfer_fee": 67.0 + }, + { + "chain": "optimism", + "address": "0x4e914bbDCDE0f455A8aC9d59d3bF739c46287Ed2", + "symbol": "axlSOMM", + "decimals": 6, + "transfer_fee": 67.0 + }, + { + "chain": "polygon", + "address": "0xDd96E9c50f5dA40180e3848e712D349Ad2511D57", + "symbol": "axlSOMM", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "scroll", + "address": "0x4e914bbDCDE0f455A8aC9d59d3bF739c46287Ed2", + "symbol": "axlSOMM", + "decimals": 6, + "transfer_fee": 67.0 + } + ] + }, + { + "id": "utia", + "name": "TIA - Axelar Wrapped TIA", + "symbol": "TIA", + "image": "/images/assets/tia.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97", + "symbol": "axlTIA", + "decimals": 6, + "transfer_fee": 5.0 + }, + { + "chain": "base", + "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97", + "symbol": "axlTIA", + "decimals": 6, + "transfer_fee": 5.0 + }, + { + "chain": "binance", + "address": "0x420eEEd09Cbc6e8416decD28857fF3C7D991Fc46", + "symbol": "axlTIA", + "decimals": 6, + "transfer_fee": 0.75 + }, + { + "chain": "ethereum", + "address": "0x65e3fA51C4ce0af1B9CD5CBC7C5fDb80a09D431D", + "symbol": "axlTIA", + "decimals": 6, + "transfer_fee": 30.0 + }, + { + "chain": "linea", + "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97", + "symbol": "axlTIA", + "decimals": 6, + "transfer_fee": 5.0 + }, + { + "chain": "optimism", + "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97", + "symbol": "axlTIA", + "decimals": 6, + "transfer_fee": 5.0 + }, + { + "chain": "scroll", + "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97", + "symbol": "axlTIA", + "decimals": 6, + "transfer_fee": 5.0 + } + ] + }, + { + "id": "pepe-wei", + "name": "PEPE - Pepe", + "symbol": "PEPE", + "image": "/images/assets/pepe.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x13DF72A0F6824293F5324123cD356d9C4F827271", + "symbol": "axlPEPE", + "decimals": 18, + "transfer_fee": 5000000.0 + }, + { + "chain": "binance", + "address": "0xE3a4277eFBe777B6B17CB7fFB7fEAf8C92cBE65A", + "symbol": "axlPEPE", + "decimals": 18, + "transfer_fee": 750000.0 + }, + { + "chain": "ethereum", + "address": "0x6982508145454Ce325dDbE47a25d4ec3d2311933", + "symbol": "PEPE", + "decimals": 18, + "transfer_fee": 30000000.0 + }, + { + "chain": "fantom", + "address": "0xE3a4277eFBe777B6B17CB7fFB7fEAf8C92cBE65A", + "symbol": "axlPEPE", + "decimals": 18, + "transfer_fee": 750000.0 + }, + { + "chain": "moonbeam", + "address": "0xd67eB3e8eb74F5Ea6A1A9E87B4a6AE433AD829EC", + "symbol": "axlPEPE", + "decimals": 18, + "transfer_fee": 750000.0 + }, + { + "chain": "polygon", + "address": "0x8baE3F5Eb10F39663E57Be19741FD9ccEF0E113a", + "symbol": "axlPEPE", + "decimals": 18, + "transfer_fee": 750000.0 + } + ] + }, + { + "id": "uluna", + "name": "LUNC - Axelar Wrapped LUNC", + "symbol": "LUNC", + "image": "/images/assets/lunc.svg", + "contracts": [ + { + "chain": "avalanche", + "address": "0x120AD3e5A7c796349e591F1570D9f7980F4eA9cb", + "symbol": "LUNC", + "decimals": 6, + "transfer_fee": 15000.0 + }, + { + "chain": "binance", + "address": "0x07aB0f18EA886fbbEcF52902E5F086D9363410a5", + "symbol": "LUNC", + "decimals": 6, + "transfer_fee": 15000.0 + }, + { + "chain": "ethereum", + "address": "0x31DAB3430f3081dfF3Ccd80F17AD98583437B213", + "symbol": "LUNC", + "decimals": 6, + "transfer_fee": 600000.0 + }, + { + "chain": "fantom", + "address": "0x5e3C572A97D898Fe359a2Cea31c7D46ba5386895", + "symbol": "LUNC", + "decimals": 6, + "transfer_fee": 15000.0 + }, + { + "chain": "moonbeam", + "address": "0x31DAB3430f3081dfF3Ccd80F17AD98583437B213", + "symbol": "LUNC", + "decimals": 6, + "transfer_fee": 15000.0 + }, + { + "chain": "polygon", + "address": "0xa17927fB75E9faEA10C08259902d0468b3DEad88", + "symbol": "LUNC", + "decimals": 6, + "transfer_fee": 15000.0 + } + ] + }, + { + "id": "uusd", + "name": "USTC - Axelar Wrapped USTC", + "symbol": "USTC", + "image": "/images/assets/ustc.svg", + "contracts": [ + { + "chain": "avalanche", + "address": "0x260Bbf5698121EB85e7a74f2E45E16Ce762EbE11", + "symbol": "USTC", + "decimals": 6, + "transfer_fee": 75.0 + }, + { + "chain": "ethereum", + "address": "0x085416975fe14C2A731a97eC38B9bF8135231F62", + "symbol": "USTC", + "decimals": 6, + "transfer_fee": 3000.0 + }, + { + "chain": "fantom", + "address": "0x2B9d3F168905067D88d93F094C938BACEe02b0cB", + "symbol": "USTC", + "decimals": 6, + "transfer_fee": 75.0 + }, + { + "chain": "moonbeam", + "address": "0x085416975fe14C2A731a97eC38B9bF8135231F62", + "symbol": "USTC", + "decimals": 6, + "transfer_fee": 75.0 + }, + { + "chain": "polygon", + "address": "0xeDDc6eDe8F3AF9B4971e1Fa9639314905458bE87", + "symbol": "USTC", + "decimals": 6, + "transfer_fee": 75.0 + } + ] + }, + { + "id": "rai-wei", + "name": "RAI - Rai Reflex Index", + "symbol": "RAI", + "image": "/images/assets/rai.svg", + "contracts": [ + { + "chain": "ethereum", + "address": "0x03ab458634910AaD20eF5f1C8ee96F1D6ac54919", + "symbol": "RAI", + "decimals": 18, + "transfer_fee": 21.0 + } + ] + }, + { + "id": "link-wei", + "name": "LINK - ChainLink Token", + "symbol": "LINK", + "image": "/images/assets/link.svg", + "contracts": [ + { + "chain": "ethereum", + "address": "0x514910771AF9Ca656af840dff83E8264EcF986CA", + "symbol": "LINK", + "decimals": 18, + "transfer_fee": 4.4 + } + ] + }, + { + "id": "frax-wei", + "name": "FRAX - Frax", + "symbol": "FRAX", + "image": "/images/assets/frax.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 10.0 + }, + { + "chain": "avalanche", + "address": "0x4914886dBb8aAd7A7456D471EAab10b06d42348D", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 1.5 + }, + { + "chain": "base", + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 10.0 + }, + { + "chain": "binance", + "address": "0x3FF4cb8EC5EC5eBBfD3424401D962F0627a67Cac", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 1.5 + }, + { + "chain": "blast", + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 10.0 + }, + { + "chain": "celo", + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 1.5 + }, + { + "chain": "ethereum", + "address": "0x853d955aCEf822Db058eb8505911ED77F175b99e", + "symbol": "FRAX", + "decimals": 18, + "transfer_fee": 60.0 + }, + { + "chain": "fantom", + "address": "0xbE71e68fB36d14565F523C9c36ab2A8Be0c26D55", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 1.5 + }, + { + "chain": "filecoin", + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 1.5 + }, + { + "chain": "fraxtal", + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 10.0 + }, + { + "chain": "kava", + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 1.5 + }, + { + "chain": "linea", + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 10.0 + }, + { + "chain": "mantle", + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 10.0 + }, + { + "chain": "moonbeam", + "address": "0x61C82805453a989E99B544DFB7031902e9bac448", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 1.5 + }, + { + "chain": "optimism", + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 10.0 + }, + { + "chain": "polygon", + "address": "0x53Adc464b488bE8C5d7269B9ABBCe8bA74195C3a", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 1.5 + }, + { + "chain": "scroll", + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", + "symbol": "axlFRAX", + "decimals": 18, + "transfer_fee": 10.0 + } + ] + }, + { + "id": "fpi-wei", + "name": "FPI - Frax Price Index", + "symbol": "FPI", + "image": "/images/assets/fpi.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 9.1 + }, + { + "chain": "avalanche", + "address": "0xcaC839c0E82A1A0470B6b78123A239Bb9f17Cbfd", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 1.4 + }, + { + "chain": "base", + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 9.1 + }, + { + "chain": "binance", + "address": "0x78d24B91F0988F79AB9f370D607Ffc820d0779B8", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 1.4 + }, + { + "chain": "blast", + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 9.1 + }, + { + "chain": "celo", + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 1.4 + }, + { + "chain": "ethereum", + "address": "0x5Ca135cB8527d76e932f34B5145575F9d8cbE08E", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 55.0 + }, + { + "chain": "fantom", + "address": "0x78d24B91F0988F79AB9f370D607Ffc820d0779B8", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 1.4 + }, + { + "chain": "filecoin", + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 1.4 + }, + { + "chain": "fraxtal", + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 9.1 + }, + { + "chain": "kava", + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 1.4 + }, + { + "chain": "linea", + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 9.1 + }, + { + "chain": "mantle", + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 9.1 + }, + { + "chain": "moonbeam", + "address": "0xFA3fd4CDAf85f65849A13a6Af9c3e5c20f71aD60", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 1.4 + }, + { + "chain": "optimism", + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 9.1 + }, + { + "chain": "polygon", + "address": "0x72eC87f05CC5eBC4D24Fddba84c179d5e216016B", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 1.4 + }, + { + "chain": "scroll", + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f", + "symbol": "FPI", + "decimals": 18, + "transfer_fee": 9.1 + } + ] + }, + { + "id": "mkr-wei", + "name": "MKR - Maker", + "symbol": "MKR", + "image": "/images/assets/mkr.svg", + "contracts": [ + { + "chain": "ethereum", + "address": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", + "symbol": "MKR", + "decimals": 18, + "transfer_fee": 0.08 + } + ] + }, + { + "id": "uni-wei", + "name": "UNI - Uniswap", + "symbol": "UNI", + "image": "/images/assets/uni.svg", + "contracts": [ + { + "chain": "ethereum", + "address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", + "symbol": "UNI", + "decimals": 18, + "transfer_fee": 12.0 + } + ] + }, + { + "id": "shib-wei", + "name": "SHIB - SHIBA INU", + "symbol": "SHIB", + "image": "/images/assets/shib.svg", + "contracts": [ + { + "chain": "ethereum", + "address": "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE", + "symbol": "SHIB", + "decimals": 18, + "transfer_fee": 6000000.0 + } + ] + }, + { + "id": "wfil-wei", + "name": "WFIL - Wrapped FIL", + "symbol": "WFIL", + "image": "/images/assets/wfil.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 2.0 + }, + { + "chain": "avalanche", + "address": "0xF3bcB00146d1123dD19974De758F83D01E26D3F1", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 0.3 + }, + { + "chain": "base", + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 2.0 + }, + { + "chain": "binance", + "address": "0x49517abB880359eb873bDc08d09eBc0c478d3CA2", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 0.3 + }, + { + "chain": "blast", + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 2.0 + }, + { + "chain": "celo", + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 0.3 + }, + { + "chain": "ethereum", + "address": "0x6A7b717aE5Ed65F85BA25403D5063D368239828e", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 12.0 + }, + { + "chain": "fantom", + "address": "0x49517abB880359eb873bDc08d09eBc0c478d3CA2", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 0.3 + }, + { + "chain": "filecoin", + "address": "0x60E1773636CF5E4A227d9AC24F20fEca034ee25A", + "symbol": "WFIL", + "decimals": 18, + "transfer_fee": 0.3 + }, + { + "chain": "fraxtal", + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 2.0 + }, + { + "chain": "kava", + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 0.3 + }, + { + "chain": "linea", + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 2.0 + }, + { + "chain": "mantle", + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 2.0 + }, + { + "chain": "moonbeam", + "address": "0x6A7b717aE5Ed65F85BA25403D5063D368239828e", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 0.3 + }, + { + "chain": "optimism", + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 2.0 + }, + { + "chain": "polygon", + "address": "0xE440dc07b23faafF3a76bdbcf783221406eb00F1", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 0.3 + }, + { + "chain": "scroll", + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", + "symbol": "axlFIL", + "decimals": 18, + "transfer_fee": 2.0 + } + ] + }, + { + "id": "polygon-uusdc", + "name": "USDC - Polygon USDC", + "symbol": "USDC", + "image": "/images/assets/usdc.svg", + "contracts": [ + { + "chain": "polygon", + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "symbol": "USDC", + "decimals": 6, + "transfer_fee": 1.5 + } + ] + }, + { + "id": "avalanche-uusdc", + "name": "USDC - Avalanche USDC", + "symbol": "USDC", + "image": "/images/assets/usdc.svg", + "contracts": [ + { + "chain": "avalanche", + "address": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", + "symbol": "USDC", + "decimals": 6, + "transfer_fee": 1.5 + } + ] + }, + { + "id": "yieldusd-wei", + "name": "YieldUSD - Real Yield USD", + "symbol": "YieldUSD", + "image": "/images/assets/yieldusd.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x0cfD82F3910b3A5faf3a0417Fb0063953D6B911b", + "symbol": "axlYieldUSD", + "decimals": 18, + "transfer_fee": 10.0 + }, + { + "chain": "ethereum", + "address": "0x97e6E0a40a3D02F12d1cEC30ebfbAE04e37C119E", + "symbol": "YieldUSD", + "decimals": 18, + "transfer_fee": 60.0 + } + ] + }, + { + "id": "yieldeth-wei", + "name": "YieldETH - Real Yield ETH", + "symbol": "YieldETH", + "image": "/images/assets/yieldeth.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0xA9AF51A55F275503a3876077a08Ae6540835EF8C", + "symbol": "axlYieldETH", + "decimals": 18, + "transfer_fee": 0.0062 + }, + { + "chain": "ethereum", + "address": "0xb5b29320d2Dde5BA5BAFA1EbcD270052070483ec", + "symbol": "YieldETH", + "decimals": 18, + "transfer_fee": 0.038 + } + ] + }, + { + "id": "utori", + "name": "TORI - Teritori", + "symbol": "TORI", + "image": "/images/assets/tori.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x809c55916bb542c1419724022B3F0162087E3C88", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 280.0 + }, + { + "chain": "avalanche", + "address": "0xc13c0d723e01B02984499C672e205D5Ec9c05d10", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 42.0 + }, + { + "chain": "base", + "address": "0x809c55916bb542c1419724022B3F0162087E3C88", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 280.0 + }, + { + "chain": "binance", + "address": "0x11eDFA12d70e8AC9e94DE019eBa278430873f8C3", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 42.0 + }, + { + "chain": "blast", + "address": "0x809c55916bb542c1419724022B3F0162087E3C88", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 280.0 + }, + { + "chain": "celo", + "address": "0x809c55916bb542c1419724022B3F0162087E3C88", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 42.0 + }, + { + "chain": "ethereum", + "address": "0x010cddfA5518f74c43Efe911db29Af71b44b4E1C", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 1700.0 + }, + { + "chain": "fantom", + "address": "0x11eDFA12d70e8AC9e94DE019eBa278430873f8C3", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 42.0 + }, + { + "chain": "filecoin", + "address": "0x809c55916bb542c1419724022B3F0162087E3C88", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 42.0 + }, + { + "chain": "fraxtal", + "address": "0x809c55916bb542c1419724022B3F0162087E3C88", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 280.0 + }, + { + "chain": "kava", + "address": "0x809c55916bb542c1419724022B3F0162087E3C88", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 42.0 + }, + { + "chain": "linea", + "address": "0x809c55916bb542c1419724022B3F0162087E3C88", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 280.0 + }, + { + "chain": "mantle", + "address": "0x809c55916bb542c1419724022B3F0162087E3C88", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 280.0 + }, + { + "chain": "moonbeam", + "address": "0x010cddfA5518f74c43Efe911db29Af71b44b4E1C", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 42.0 + }, + { + "chain": "optimism", + "address": "0x809c55916bb542c1419724022B3F0162087E3C88", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 280.0 + }, + { + "chain": "polygon", + "address": "0x69deD9B7658507ca8C5A6f1F6ff53276802ec228", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 42.0 + }, + { + "chain": "scroll", + "address": "0x809c55916bb542c1419724022B3F0162087E3C88", + "symbol": "TORI", + "decimals": 6, + "transfer_fee": 280.0 + } + ] + }, + { + "id": "usdy-wei", + "name": "USDY - Ondo U.S. Dollar Yield", + "symbol": "USDY", + "image": "/images/assets/usdy.svg", + "contracts": [ + { + "chain": "ethereum", + "address": "0x96F6eF951840721AdBF46Ac996b59E0235CB985C", + "symbol": "USDY", + "decimals": 18, + "transfer_fee": 60.0 + } + ] + }, + { + "id": "uhuahua", + "name": "HUAHUA - Chihuahua native asset", + "symbol": "HUAHUA", + "image": "/images/assets/huahua.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 43000.0 + }, + { + "chain": "avalanche", + "address": "0x82057f44aFE6660B177c32fB724aDb5b6aC19e4A", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 6500.0 + }, + { + "chain": "base", + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 43000.0 + }, + { + "chain": "binance", + "address": "0x9fD470124903957f299a1C90fEdA9043A4619cc6", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 6500.0 + }, + { + "chain": "blast", + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 43000.0 + }, + { + "chain": "celo", + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 6500.0 + }, + { + "chain": "ethereum", + "address": "0xF7C79FfDa0d13b68081761BB0a5a66cFC48D97f5", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 260000.0 + }, + { + "chain": "fantom", + "address": "0x9fD470124903957f299a1C90fEdA9043A4619cc6", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 6500.0 + }, + { + "chain": "filecoin", + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 6500.0 + }, + { + "chain": "fraxtal", + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 43000.0 + }, + { + "chain": "kava", + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 6500.0 + }, + { + "chain": "linea", + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 43000.0 + }, + { + "chain": "mantle", + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 43000.0 + }, + { + "chain": "moonbeam", + "address": "0xF7C79FfDa0d13b68081761BB0a5a66cFC48D97f5", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 6500.0 + }, + { + "chain": "optimism", + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 43000.0 + }, + { + "chain": "polygon", + "address": "0xfecB6d3A5d3FdA8A37A072D5b9018709f690873b", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 6500.0 + }, + { + "chain": "scroll", + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B", + "symbol": "HUAHUA", + "decimals": 6, + "transfer_fee": 43000.0 + } + ] }, { - "id": "uumee", - "name": "UMEE - Umee native token", - "symbol": "UMEE", - "image": "/images/assets/umee.svg", + "id": "factory/sei10hud5e5er4aul2l7sp2u9qp2lag5u4xf8mvyx38cnjvqhlgsrcls5qn5ke/seilor", + "name": "SEILOR - Axelar Wrapped SEILOR", + "symbol": "SEILOR", + "image": "/images/assets/seilor.svg", "contracts": [ + { + "chain": "binance", + "address": "0x518960F5d12eb192F89A73C2AE9b2BD369c73D40", + "symbol": "axlSEILOR", + "decimals": 6, + "transfer_fee": 25.0 + }, { "chain": "ethereum", - "address": "0x923e030f951A2401426a3407a9bcc7EB715d9a0b", - "symbol": "UMEE", + "address": "0xdb4AFBA424b624068D3d63F565C55D5D79543245", + "symbol": "axlSEILOR", "decimals": 6, - "transfer_fee": 20000.0 + "transfer_fee": 1000.0 } ] }, { - "id": "stuatom", - "name": "stATOM - Stride Staked Atom", - "symbol": "stATOM", - "image": "/images/assets/statom.svg", + "id": "uscrt", + "name": "SCRT - Secret native asset", + "symbol": "SCRT", + "image": "/images/assets/scrt.svg", "contracts": [ { "chain": "arbitrum", - "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", - "symbol": "stATOM", + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 0.42 + "transfer_fee": 26.0 }, { "chain": "avalanche", - "address": "0x2fFFE7f113FDB41fc8Ffd3B67E7b7eFA2b3a030d", - "symbol": "stATOM", + "address": "0x1DF5F036497898F62AF6A2C7085f1f2e75B23500", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 3.9 }, { "chain": "base", - "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", - "symbol": "stATOM", + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 0.42 + "transfer_fee": 26.0 }, { "chain": "binance", - "address": "0x4Bd3231E7eFc193F13a89b23ED6970776a91CF63", - "symbol": "stATOM", + "address": "0x57FeE7e92887d7A4792b5917354D2ce557aa63e9", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 3.9 + }, + { + "chain": "blast", + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5", + "symbol": "SCRT", + "decimals": 6, + "transfer_fee": 26.0 }, { "chain": "celo", - "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", - "symbol": "stATOM", + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 3.9 }, { "chain": "ethereum", - "address": "0x2924894E7886C6B9018179946EE389bb06534021", - "symbol": "stATOM", + "address": "0xBA09B04F38310aCF7f098DaC6017D1AFcfB6411d", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 6.7 + "transfer_fee": 160.0 }, { "chain": "fantom", - "address": "0x4Bd3231E7eFc193F13a89b23ED6970776a91CF63", - "symbol": "stATOM", + "address": "0x57FeE7e92887d7A4792b5917354D2ce557aa63e9", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 3.9 + }, + { + "chain": "filecoin", + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5", + "symbol": "SCRT", + "decimals": 6, + "transfer_fee": 3.9 + }, + { + "chain": "fraxtal", + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5", + "symbol": "SCRT", + "decimals": 6, + "transfer_fee": 26.0 + }, + { + "chain": "kava", + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5", + "symbol": "SCRT", + "decimals": 6, + "transfer_fee": 3.9 }, { "chain": "linea", - "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", - "symbol": "stATOM", + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 26.0 }, { "chain": "mantle", - "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", - "symbol": "stATOM", + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 26.0 }, { "chain": "moonbeam", - "address": "0x2924894E7886C6B9018179946EE389bb06534021", - "symbol": "stATOM", + "address": "0xBA09B04F38310aCF7f098DaC6017D1AFcfB6411d", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 3.9 }, { "chain": "optimism", - "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", - "symbol": "stATOM", + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 0.42 + "transfer_fee": 26.0 }, { "chain": "polygon", - "address": "0x9132ab3B9EcA438184588b8887CeD9dE0FCA19AE", - "symbol": "stATOM", + "address": "0x290540d1E1EdFabD31315dF4f6a9d6638966d54F", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 3.9 }, { "chain": "scroll", - "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b", - "symbol": "stATOM", + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5", + "symbol": "SCRT", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 26.0 } ] }, { - "id": "stkbnb-wei", - "name": "stkBNB - Staked BNB", - "symbol": "stkBNB", - "image": "/images/assets/stkbnb.svg", + "id": "ox-wei", + "name": "OX - Open Exchange Token", + "symbol": "OX", + "image": "/images/assets/ox.svg", "contracts": [ { - "chain": "binance", - "address": "0xc2E9d07F66A89c44062459A47a0D2Dc038E4fb16", - "symbol": "stkBNB", + "chain": "ethereum", + "address": "0x78a0A62Fba6Fb21A83FE8a3433d44C73a4017A6f", + "symbol": "OX", "decimals": 18, - "transfer_fee": 0.0065 + "transfer_fee": 3000.0 } ] }, { - "id": "ustrd", - "name": "STRD - Stride", - "symbol": "STRD", - "image": "/images/assets/strd.svg", + "id": "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA", + "name": "milkTIA - milkTIA", + "symbol": "milkTIA", + "image": "/images/assets/milktia.svg", "contracts": [ { "chain": "arbitrum", - "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", - "symbol": "STRD", + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6", + "symbol": "milkTIA", "decimals": 6, - "transfer_fee": 10.0 + "transfer_fee": 0.52 }, { "chain": "avalanche", - "address": "0x24562dd9D02f7ECE43B947e61E313778273F140b", - "symbol": "STRD", + "address": "0xCeC30da703eec439Cc0b7C43611C84cE9ab3eE9a", + "symbol": "milkTIA", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.078 }, { "chain": "base", - "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", - "symbol": "STRD", + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6", + "symbol": "milkTIA", "decimals": 6, - "transfer_fee": 10.0 + "transfer_fee": 0.52 }, { "chain": "binance", - "address": "0x922946A8A2FAE7a8b4506bd54Ea361482Eff95dD", - "symbol": "STRD", + "address": "0xfc59C4212122CBb52C9b22c9D59830Ab5b8E9c71", + "symbol": "milkTIA", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.078 + }, + { + "chain": "blast", + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6", + "symbol": "milkTIA", + "decimals": 6, + "transfer_fee": 0.52 }, { "chain": "celo", - "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", - "symbol": "STRD", + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6", + "symbol": "milkTIA", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.078 }, { "chain": "ethereum", - "address": "0x85eBBf7253295d37C5FC98bE5Aac87CA4378c2e2", - "symbol": "STRD", + "address": "0x0Fd8d9F028d1594ff24697a10035D6EC265769b0", + "symbol": "milkTIA", "decimals": 6, - "transfer_fee": 160.0 + "transfer_fee": 3.1 }, { "chain": "fantom", - "address": "0x922946A8A2FAE7a8b4506bd54Ea361482Eff95dD", - "symbol": "STRD", + "address": "0xfc59C4212122CBb52C9b22c9D59830Ab5b8E9c71", + "symbol": "milkTIA", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.078 + }, + { + "chain": "filecoin", + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6", + "symbol": "milkTIA", + "decimals": 6, + "transfer_fee": 0.078 + }, + { + "chain": "fraxtal", + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6", + "symbol": "milkTIA", + "decimals": 6, + "transfer_fee": 0.52 + }, + { + "chain": "kava", + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6", + "symbol": "milkTIA", + "decimals": 6, + "transfer_fee": 0.078 }, { "chain": "linea", - "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", - "symbol": "STRD", + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6", + "symbol": "milkTIA", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.52 }, { "chain": "mantle", - "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", - "symbol": "STRD", + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6", + "symbol": "milkTIA", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.52 }, { "chain": "moonbeam", - "address": "0x85eBBf7253295d37C5FC98bE5Aac87CA4378c2e2", - "symbol": "STRD", + "address": "0x0Fd8d9F028d1594ff24697a10035D6EC265769b0", + "symbol": "milkTIA", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.078 }, { "chain": "optimism", - "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F", - "symbol": "STRD", + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6", + "symbol": "milkTIA", "decimals": 6, - "transfer_fee": 10.0 + "transfer_fee": 0.52 }, { "chain": "polygon", - "address": "0x1D9b7C028e5018c7057c6F57366a1350c9CeADE5", - "symbol": "STRD", + "address": "0x91835b32f5249d863b63dA22e32E6200004Fe76a", + "symbol": "milkTIA", "decimals": 6, - "transfer_fee": 3.0 + "transfer_fee": 0.078 + }, + { + "chain": "scroll", + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6", + "symbol": "milkTIA", + "decimals": 6, + "transfer_fee": 0.52 } ] }, { - "id": "wmatic-wei", - "name": "WMATIC - Wrapped Matic", - "symbol": "WMATIC", - "image": "/images/assets/wmatic.svg", + "id": "aISLM", + "name": "ISLM - Islamic Coin", + "symbol": "ISLM", + "image": "/images/assets/islm.svg", "contracts": [ + { + "chain": "arbitrum", + "address": "0x2a98d978817949D45a5528013850772E762B7F12", + "symbol": "ISLM", + "decimals": 18, + "transfer_fee": 120.0 + }, + { + "chain": "avalanche", + "address": "0xB5D8c52B65c24B020c51736D22F8bd961A281909", + "symbol": "ISLM", + "decimals": 18, + "transfer_fee": 19.0 + }, { "chain": "base", - "address": "0xE3ce47AC96d8502824627d7cBCFDA49414beDa9C", - "symbol": "axlMATIC", + "address": "0x2a98d978817949D45a5528013850772E762B7F12", + "symbol": "ISLM", + "decimals": 18, + "transfer_fee": 120.0 + }, + { + "chain": "binance", + "address": "0xB208C4451bc3DE576a836406bD785951b939503E", + "symbol": "ISLM", + "decimals": 18, + "transfer_fee": 19.0 + }, + { + "chain": "blast", + "address": "0x2a98d978817949D45a5528013850772E762B7F12", + "symbol": "ISLM", "decimals": 18, - "transfer_fee": 7.1 + "transfer_fee": 120.0 + }, + { + "chain": "celo", + "address": "0x2a98d978817949D45a5528013850772E762B7F12", + "symbol": "ISLM", + "decimals": 18, + "transfer_fee": 19.0 + }, + { + "chain": "ethereum", + "address": "0xF10c41cA085FC8d9326a65408D14Dae28A3E69a5", + "symbol": "ISLM", + "decimals": 18, + "transfer_fee": 750.0 + }, + { + "chain": "fantom", + "address": "0xB208C4451bc3DE576a836406bD785951b939503E", + "symbol": "ISLM", + "decimals": 18, + "transfer_fee": 19.0 + }, + { + "chain": "filecoin", + "address": "0x2a98d978817949D45a5528013850772E762B7F12", + "symbol": "ISLM", + "decimals": 18, + "transfer_fee": 19.0 + }, + { + "chain": "fraxtal", + "address": "0x2a98d978817949D45a5528013850772E762B7F12", + "symbol": "ISLM", + "decimals": 18, + "transfer_fee": 120.0 + }, + { + "chain": "kava", + "address": "0x2a98d978817949D45a5528013850772E762B7F12", + "symbol": "ISLM", + "decimals": 18, + "transfer_fee": 19.0 }, { "chain": "linea", - "address": "0xE3ce47AC96d8502824627d7cBCFDA49414beDa9C", - "symbol": "axlMATIC", + "address": "0x2a98d978817949D45a5528013850772E762B7F12", + "symbol": "ISLM", "decimals": 18, - "transfer_fee": 2.1 + "transfer_fee": 120.0 }, { - "chain": "polygon", - "address": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", - "symbol": "WMATIC", + "chain": "mantle", + "address": "0x2a98d978817949D45a5528013850772E762B7F12", + "symbol": "ISLM", "decimals": 18, - "transfer_fee": 2.1 - } - ] - }, - { - "id": "wavax-wei", - "name": "WAVAX - Wrapped AVAX", - "symbol": "WAVAX", - "image": "/images/assets/wavax.svg", - "contracts": [ + "transfer_fee": 120.0 + }, { - "chain": "avalanche", - "address": "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7", - "symbol": "WAVAX", + "chain": "moonbeam", + "address": "0xF10c41cA085FC8d9326a65408D14Dae28A3E69a5", + "symbol": "ISLM", "decimals": 18, - "transfer_fee": 0.15 + "transfer_fee": 19.0 }, { - "chain": "base", - "address": "0x6E76A241Ae6fcaD51C064Ac70fe6e676502b91c5", - "symbol": "axlAVAX", + "chain": "optimism", + "address": "0x2a98d978817949D45a5528013850772E762B7F12", + "symbol": "ISLM", "decimals": 18, - "transfer_fee": 0.5 + "transfer_fee": 120.0 }, { - "chain": "fantom", - "address": "0x879e73005C36d9a549fFb9846851fe5d1d91b681", - "symbol": "axlAVAX", + "chain": "polygon", + "address": "0x4E7A6031B7282431ff9cBC016dA2E7e50e0C54A4", + "symbol": "ISLM", "decimals": 18, - "transfer_fee": 0.15 + "transfer_fee": 19.0 }, { - "chain": "linea", - "address": "0x6E76A241Ae6fcaD51C064Ac70fe6e676502b91c5", - "symbol": "axlAVAX", + "chain": "scroll", + "address": "0x2a98d978817949D45a5528013850772E762B7F12", + "symbol": "ISLM", "decimals": 18, - "transfer_fee": 0.15 + "transfer_fee": 120.0 } ] }, { - "id": "wglmr-wei", - "name": "WGLMR - Wrapped GLMR", - "symbol": "WGLMR", - "image": "/images/assets/wglmr.svg", + "id": "wmnt-wei", + "name": "WMNT - Wrapped Mantle", + "symbol": "WMNT", + "image": "/images/assets/wmnt.svg", "contracts": [ { - "chain": "moonbeam", - "address": "0xAcc15dC74880C9944775448304B263D191c6077F", - "symbol": "WGLMR", + "chain": "mantle", + "address": "0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8", + "symbol": "WMNT", "decimals": 18, - "transfer_fee": 2.8 + "transfer_fee": 16.0 } ] }, { - "id": "wbnb-wei", - "name": "WBNB - Wrapped BNB", - "symbol": "WBNB", - "image": "/images/assets/wbnb.svg", + "id": "ustars", + "name": "STARS - Axelar Wrapped STARS", + "symbol": "STARS", + "image": "/images/assets/stars.svg", "contracts": [ + { + "chain": "arbitrum", + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 210.0 + }, + { + "chain": "avalanche", + "address": "0xACfEB61b0c22bcBBe4cEb7BB41122D272D79F9bF", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 32.0 + }, { "chain": "base", - "address": "0x23A6486099f740B7688A0bb7AED7C912015cA2F0", - "symbol": "axlBNB", - "decimals": 18, - "transfer_fee": 0.02 + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 210.0 }, { "chain": "binance", - "address": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", - "symbol": "WBNB", - "decimals": 18, - "transfer_fee": 0.006 + "address": "0xC3CAC4AE38cCf6985EF9039ACC1abBc874DdcBB0", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 32.0 }, { - "chain": "linea", - "address": "0x23A6486099f740B7688A0bb7AED7C912015cA2F0", - "symbol": "axlBNB", - "decimals": 18, - "transfer_fee": 0.006 - } - ] - }, - { - "id": "wftm-wei", - "name": "WFTM - Wrapped Fantom", - "symbol": "WFTM", - "image": "/images/assets/wftm.svg", - "contracts": [ + "chain": "blast", + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 210.0 + }, { - "chain": "avalanche", - "address": "0xbB72a453a9280864C330Fa23fFABff73991119A0", - "symbol": "axlFTM", - "decimals": 18, - "transfer_fee": 5.4 + "chain": "celo", + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 32.0 }, { - "chain": "base", - "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8", - "symbol": "axlFTM", - "decimals": 18, - "transfer_fee": 18.0 + "chain": "ethereum", + "address": "0xF2605EaB29c67d06E71372CA9dfA8aDfd2d34BbF", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 1300.0 }, { "chain": "fantom", - "address": "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83", - "symbol": "WFTM", - "decimals": 18, - "transfer_fee": 5.4 + "address": "0xC3CAC4AE38cCf6985EF9039ACC1abBc874DdcBB0", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 32.0 + }, + { + "chain": "filecoin", + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 32.0 + }, + { + "chain": "fraxtal", + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 210.0 + }, + { + "chain": "kava", + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 32.0 }, { "chain": "linea", - "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8", - "symbol": "axlFTM", - "decimals": 18, - "transfer_fee": 5.4 + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 210.0 }, { "chain": "mantle", - "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8", - "symbol": "axlFTM", - "decimals": 18, - "transfer_fee": 5.4 + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 210.0 + }, + { + "chain": "moonbeam", + "address": "0xF2605EaB29c67d06E71372CA9dfA8aDfd2d34BbF", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 32.0 + }, + { + "chain": "optimism", + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 210.0 + }, + { + "chain": "polygon", + "address": "0x422bAE7f5b67CA7FAde4577E965988130cAff672", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 32.0 }, { "chain": "scroll", - "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8", - "symbol": "axlFTM", - "decimals": 18, - "transfer_fee": 5.4 + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D", + "symbol": "axlSTARS", + "decimals": 6, + "transfer_fee": 210.0 } ] }, { - "id": "uatom", - "name": "ATOM - Cosmoshub staking ATOM", - "symbol": "ATOM", - "image": "/images/assets/atom.svg", + "id": "uc4e", + "name": "C4E - C4E native asset", + "symbol": "C4E", + "image": "/images/assets/c4e.svg", "contracts": [ { "chain": "arbitrum", - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", - "symbol": "axlATOM", + "address": "0x520391D410314451E12A85D79970a61915Bc315D", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.42 + "transfer_fee": 170.0 }, { "chain": "avalanche", - "address": "0x80D18b1c9Ab0c9B5D6A6d5173575417457d00a12", - "symbol": "axlATOM", + "address": "0x26b0783269ff93C49ae0Fb9F65AC05e27005e9b4", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 25.0 }, { "chain": "base", - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", - "symbol": "axlATOM", + "address": "0x520391D410314451E12A85D79970a61915Bc315D", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.42 + "transfer_fee": 170.0 }, { "chain": "binance", - "address": "0x3966001bEb78FD309665EA78FF8a4dA2E7E13180", - "symbol": "axlATOM", + "address": "0x27443B27dfDf632390521C0b8A6fDaFe07d8f79f", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 25.0 + }, + { + "chain": "blast", + "address": "0x520391D410314451E12A85D79970a61915Bc315D", + "symbol": "C4E", + "decimals": 6, + "transfer_fee": 170.0 }, { "chain": "celo", - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", - "symbol": "axlATOM", + "address": "0x520391D410314451E12A85D79970a61915Bc315D", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 25.0 }, { "chain": "ethereum", - "address": "0x27292cf0016E5dF1d8b37306B2A98588aCbD6fCA", - "symbol": "axlATOM", + "address": "0x24a6f525636d75eF3e4E090b44B75FeB440e9697", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 6.7 + "transfer_fee": 1000.0 }, { "chain": "fantom", - "address": "0x3bB68cb55Fc9C22511467c18E42D14E8c959c4dA", - "symbol": "axlATOM", + "address": "0x27443B27dfDf632390521C0b8A6fDaFe07d8f79f", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 25.0 }, { "chain": "filecoin", - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", - "symbol": "axlATOM", + "address": "0x520391D410314451E12A85D79970a61915Bc315D", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 25.0 + }, + { + "chain": "fraxtal", + "address": "0x520391D410314451E12A85D79970a61915Bc315D", + "symbol": "C4E", + "decimals": 6, + "transfer_fee": 170.0 }, { "chain": "kava", - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", - "symbol": "axlATOM", + "address": "0x520391D410314451E12A85D79970a61915Bc315D", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 25.0 }, { "chain": "linea", - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", - "symbol": "axlATOM", + "address": "0x520391D410314451E12A85D79970a61915Bc315D", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 170.0 }, { "chain": "mantle", - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", - "symbol": "axlATOM", + "address": "0x520391D410314451E12A85D79970a61915Bc315D", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 170.0 }, { "chain": "moonbeam", - "address": "0x27292cf0016E5dF1d8b37306B2A98588aCbD6fCA", - "symbol": "axlATOM", + "address": "0x24a6f525636d75eF3e4E090b44B75FeB440e9697", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 25.0 }, { "chain": "optimism", - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", - "symbol": "axlATOM", + "address": "0x520391D410314451E12A85D79970a61915Bc315D", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.42 + "transfer_fee": 170.0 }, { "chain": "polygon", - "address": "0x33F8a5029264BcFB66e39157aF3FeA3E2a8a5067", - "symbol": "axlATOM", + "address": "0x0043E8eAC1810e30636f38BF3a140287Fadb6B4c", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 25.0 }, { "chain": "scroll", - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff", - "symbol": "axlATOM", + "address": "0x520391D410314451E12A85D79970a61915Bc315D", + "symbol": "C4E", "decimals": 6, - "transfer_fee": 0.12 + "transfer_fee": 170.0 } ] }, { - "id": "usomm", - "name": "SOMM - Axelar Wrapped SOMM", - "symbol": "SOMM", - "image": "/images/assets/somm.svg", + "id": "yum-wei", + "name": "YUM - Yum", + "symbol": "YUM", + "image": "/images/assets/yum.svg", "contracts": [ { "chain": "arbitrum", - "address": "0x4e914bbDCDE0f455A8aC9d59d3bF739c46287Ed2", - "symbol": "axlSOMM", + "address": "0x9F41b34f42058a7b74672055a5fae22c4b113Fd1", + "symbol": "YUM", + "decimals": 18, + "transfer_fee": 250.0 + }, + { + "chain": "base", + "address": "0x9F41b34f42058a7b74672055a5fae22c4b113Fd1", + "symbol": "YUM", + "decimals": 18, + "transfer_fee": 250.0 + }, + { + "chain": "ethereum", + "address": "0xcE682c89C63d2850Cb2ca898E44D6c7c30d897a6", + "symbol": "YUM", + "decimals": 18, + "transfer_fee": 1500.0 + }, + { + "chain": "optimism", + "address": "0x9F41b34f42058a7b74672055a5fae22c4b113Fd1", + "symbol": "YUM", + "decimals": 18, + "transfer_fee": 250.0 + } + ] + }, + { + "id": "unls", + "name": "NLS - NLS native asset", + "symbol": "NLS", + "image": "/images/assets/nls.svg", + "contracts": [ + { + "chain": "ethereum", + "address": "0xb34e17562e4f1f63A2D4cF684eD8bC124e519771", + "symbol": "NLS", "decimals": 6, - "transfer_fee": 33.0 + "transfer_fee": 1500.0 + } + ] + }, + { + "id": "metal-wei", + "name": "METAL - METAL", + "symbol": "METAL", + "image": "/images/assets/metal.svg", + "contracts": [ + { + "chain": "binance", + "address": "0x6238825dcb3F6EcCf22A468faf36393753191043", + "symbol": "METAL", + "decimals": 18, + "transfer_fee": 40.0 + }, + { + "chain": "ethereum", + "address": "0x27C1D5925852c40ee712A089112E62A68d0cfFC0", + "symbol": "METAL", + "decimals": 18, + "transfer_fee": 1600.0 + }, + { + "chain": "immutable", + "address": "0x2A644D2d996820ce5Ca4256cc68E53F4DE29B444", + "symbol": "METAL", + "decimals": 18, + "transfer_fee": 40.0 }, + { + "chain": "polygon", + "address": "0x200C234721b5e549c3693CCc93cF191f90dC2aF9", + "symbol": "METAL", + "decimals": 18, + "transfer_fee": 40.0 + } + ] + }, + { + "id": "mee-wei", + "name": "MEE - MEE Governance Token", + "symbol": "MEE", + "image": "/images/assets/mee.svg", + "contracts": [ { "chain": "avalanche", - "address": "0x421CC964D5A3FEf29c6839c54C40E9d1D554aFA4", - "symbol": "axlSOMM", - "decimals": 6, - "transfer_fee": 10.0 + "address": "0x38CF645DEE7d0c0E36A0f020c418405101955C7d", + "symbol": "MEE", + "decimals": 18, + "transfer_fee": 64.0 + }, + { + "chain": "ethereum", + "address": "0xB468Fd557B9F996D0fc89952e94D0F8491279DBf", + "symbol": "MEE", + "decimals": 18, + "transfer_fee": 2500.0 + }, + { + "chain": "immutable", + "address": "0x9f6884b94c36cb32519440F0497E12a8F0dE7130", + "symbol": "MEE", + "decimals": 18, + "transfer_fee": 64.0 + }, + { + "chain": "polygon", + "address": "0xEB7eaB87837f4Dad1bb80856db9E4506Fc441f3D", + "symbol": "MEE", + "decimals": 18, + "transfer_fee": 64.0 } ] }, { - "id": "utia", - "name": "TIA - Axelar Wrapped TIA", - "symbol": "TIA", - "image": "/images/assets/tia.svg", + "id": "uxprt", + "name": "XPRT - XPRT native asset", + "symbol": "XPRT", + "image": "/images/assets/xprt.svg", "contracts": [ { "chain": "arbitrum", - "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97", - "symbol": "axlTIA", + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8", + "symbol": "XPRT", "decimals": 6, - "transfer_fee": 2.5 + "transfer_fee": 42.0 + }, + { + "chain": "avalanche", + "address": "0xe9ED8e918A20937E2C6B6f9d9a249dc6E99D3D3e", + "symbol": "XPRT", + "decimals": 6, + "transfer_fee": 6.2 }, { "chain": "base", - "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97", - "symbol": "axlTIA", + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8", + "symbol": "XPRT", "decimals": 6, - "transfer_fee": 2.5 + "transfer_fee": 42.0 }, { "chain": "binance", - "address": "0x420eEEd09Cbc6e8416decD28857fF3C7D991Fc46", - "symbol": "axlTIA", + "address": "0xd060040976a02f0e330d3ADFEb5dc418f41Da80A", + "symbol": "XPRT", "decimals": 6, - "transfer_fee": 0.75 + "transfer_fee": 6.2 + }, + { + "chain": "blast", + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8", + "symbol": "XPRT", + "decimals": 6, + "transfer_fee": 42.0 + }, + { + "chain": "celo", + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8", + "symbol": "XPRT", + "decimals": 6, + "transfer_fee": 6.2 }, { "chain": "ethereum", - "address": "0x65e3fA51C4ce0af1B9CD5CBC7C5fDb80a09D431D", - "symbol": "axlTIA", + "address": "0xD454b59f16D42667Be2fA55292d16647E27f40C4", + "symbol": "XPRT", "decimals": 6, - "transfer_fee": 40.0 + "transfer_fee": 250.0 + }, + { + "chain": "fantom", + "address": "0xd060040976a02f0e330d3ADFEb5dc418f41Da80A", + "symbol": "XPRT", + "decimals": 6, + "transfer_fee": 6.2 + }, + { + "chain": "filecoin", + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8", + "symbol": "XPRT", + "decimals": 6, + "transfer_fee": 6.2 + }, + { + "chain": "fraxtal", + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8", + "symbol": "XPRT", + "decimals": 6, + "transfer_fee": 42.0 + }, + { + "chain": "kava", + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8", + "symbol": "XPRT", + "decimals": 6, + "transfer_fee": 6.2 }, { "chain": "linea", - "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97", - "symbol": "axlTIA", + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8", + "symbol": "XPRT", "decimals": 6, - "transfer_fee": 0.75 + "transfer_fee": 42.0 + }, + { + "chain": "mantle", + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8", + "symbol": "XPRT", + "decimals": 6, + "transfer_fee": 42.0 + }, + { + "chain": "moonbeam", + "address": "0xD454b59f16D42667Be2fA55292d16647E27f40C4", + "symbol": "XPRT", + "decimals": 6, + "transfer_fee": 6.2 }, { "chain": "optimism", - "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97", - "symbol": "axlTIA", + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8", + "symbol": "XPRT", "decimals": 6, - "transfer_fee": 2.5 + "transfer_fee": 42.0 + }, + { + "chain": "polygon", + "address": "0xc690C48E3a64d8b59E54aD4202DF3cb95a85dB79", + "symbol": "XPRT", + "decimals": 6, + "transfer_fee": 6.2 }, { "chain": "scroll", - "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97", - "symbol": "axlTIA", + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8", + "symbol": "XPRT", "decimals": 6, - "transfer_fee": 0.75 + "transfer_fee": 42.0 } ] }, { - "id": "pepe-wei", - "name": "PEPE - Pepe", - "symbol": "PEPE", - "image": "/images/assets/pepe.svg", + "id": "nftl-wei", + "name": "NFTL - Nifty League", + "symbol": "NFTL", + "image": "/images/assets/nftl.svg", "contracts": [ - { - "chain": "arbitrum", - "address": "0x13DF72A0F6824293F5324123cD356d9C4F827271", - "symbol": "axlPEPE", - "decimals": 18, - "transfer_fee": 2500000.0 - }, - { - "chain": "binance", - "address": "0xE3a4277eFBe777B6B17CB7fFB7fEAf8C92cBE65A", - "symbol": "axlPEPE", - "decimals": 18, - "transfer_fee": 750000.0 - }, { "chain": "ethereum", - "address": "0x6982508145454Ce325dDbE47a25d4ec3d2311933", - "symbol": "PEPE", + "address": "0x3c8D2FCE49906e11e71cB16Fa0fFeB2B16C29638", + "symbol": "NFTL", "decimals": 18, - "transfer_fee": 40000000.0 - }, + "transfer_fee": 30000.0 + } + ] + }, + { + "id": "arbitrum-weth-wei", + "name": "WETH - Wrapped Ether", + "symbol": "WETH", + "image": "/images/assets/weth.svg", + "contracts": [ { - "chain": "fantom", - "address": "0xE3a4277eFBe777B6B17CB7fFB7fEAf8C92cBE65A", - "symbol": "axlPEPE", + "chain": "arbitrum", + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", "decimals": 18, - "transfer_fee": 750000.0 - }, + "transfer_fee": 0.0032 + } + ] + }, + { + "id": "base-weth-wei", + "name": "WETH - Wrapped Ether", + "symbol": "WETH", + "image": "/images/assets/weth.svg", + "contracts": [ { - "chain": "moonbeam", - "address": "0xd67eB3e8eb74F5Ea6A1A9E87B4a6AE433AD829EC", - "symbol": "axlPEPE", + "chain": "base", + "address": "0x4200000000000000000000000000000000000006", + "symbol": "WETH", "decimals": 18, - "transfer_fee": 750000.0 - }, + "transfer_fee": 0.0032 + } + ] + }, + { + "id": "polygon-weth-wei", + "name": "WETH - Wrapped Ether", + "symbol": "WETH", + "image": "/images/assets/weth.svg", + "contracts": [ { "chain": "polygon", - "address": "0x8baE3F5Eb10F39663E57Be19741FD9ccEF0E113a", - "symbol": "axlPEPE", + "address": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619", + "symbol": "WETH", "decimals": 18, - "transfer_fee": 750000.0 + "transfer_fee": 0.00048 } ] }, { - "id": "uluna", - "name": "LUNC - Axelar Wrapped LUNC", - "symbol": "LUNC", - "image": "/images/assets/lunc.svg", + "id": "ubtsg", + "name": "BTSG - BTSG native asset", + "symbol": "BTSG", + "image": "/images/assets/btsg.svg", "contracts": [ + { + "chain": "arbitrum", + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7", + "symbol": "BTSG", + "decimals": 6, + "transfer_fee": 1000.0 + }, { "chain": "avalanche", - "address": "0x120AD3e5A7c796349e591F1570D9f7980F4eA9cb", - "symbol": "LUNC", + "address": "0x615d89C167A38afecA108c2AD9E1e65F09E2EE29", + "symbol": "BTSG", "decimals": 6, - "transfer_fee": 15000.0 + "transfer_fee": 150.0 + }, + { + "chain": "base", + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7", + "symbol": "BTSG", + "decimals": 6, + "transfer_fee": 1000.0 + }, + { + "chain": "binance", + "address": "0xceBd6A207FEFfc6140AE37a2D2B3b3818F1aF0Ad", + "symbol": "BTSG", + "decimals": 6, + "transfer_fee": 150.0 + }, + { + "chain": "blast", + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7", + "symbol": "BTSG", + "decimals": 6, + "transfer_fee": 1000.0 + }, + { + "chain": "celo", + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7", + "symbol": "BTSG", + "decimals": 6, + "transfer_fee": 150.0 }, { "chain": "ethereum", - "address": "0x31DAB3430f3081dfF3Ccd80F17AD98583437B213", - "symbol": "LUNC", + "address": "0x2140f9DD6253417389699f396CaFC0e47597410a", + "symbol": "BTSG", "decimals": 6, - "transfer_fee": 800000.0 + "transfer_fee": 6000.0 }, { "chain": "fantom", - "address": "0x5e3C572A97D898Fe359a2Cea31c7D46ba5386895", - "symbol": "LUNC", + "address": "0xceBd6A207FEFfc6140AE37a2D2B3b3818F1aF0Ad", + "symbol": "BTSG", "decimals": 6, - "transfer_fee": 15000.0 + "transfer_fee": 150.0 }, { - "chain": "moonbeam", - "address": "0x31DAB3430f3081dfF3Ccd80F17AD98583437B213", - "symbol": "LUNC", + "chain": "filecoin", + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7", + "symbol": "BTSG", "decimals": 6, - "transfer_fee": 15000.0 + "transfer_fee": 150.0 }, { - "chain": "polygon", - "address": "0xa17927fB75E9faEA10C08259902d0468b3DEad88", - "symbol": "LUNC", + "chain": "fraxtal", + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7", + "symbol": "BTSG", "decimals": 6, - "transfer_fee": 15000.0 - } - ] - }, - { - "id": "uusd", - "name": "USTC - Axelar Wrapped USTC", - "symbol": "USTC", - "image": "/images/assets/ustc.svg", - "contracts": [ + "transfer_fee": 1000.0 + }, { - "chain": "avalanche", - "address": "0x260Bbf5698121EB85e7a74f2E45E16Ce762EbE11", - "symbol": "USTC", + "chain": "kava", + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7", + "symbol": "BTSG", "decimals": 6, - "transfer_fee": 75.0 + "transfer_fee": 150.0 }, { - "chain": "ethereum", - "address": "0x085416975fe14C2A731a97eC38B9bF8135231F62", - "symbol": "USTC", + "chain": "linea", + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7", + "symbol": "BTSG", "decimals": 6, - "transfer_fee": 4000.0 + "transfer_fee": 1000.0 }, { - "chain": "fantom", - "address": "0x2B9d3F168905067D88d93F094C938BACEe02b0cB", - "symbol": "USTC", + "chain": "mantle", + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7", + "symbol": "BTSG", "decimals": 6, - "transfer_fee": 75.0 + "transfer_fee": 1000.0 }, { "chain": "moonbeam", - "address": "0x085416975fe14C2A731a97eC38B9bF8135231F62", - "symbol": "USTC", + "address": "0x2140f9DD6253417389699f396CaFC0e47597410a", + "symbol": "BTSG", "decimals": 6, - "transfer_fee": 75.0 + "transfer_fee": 150.0 }, { - "chain": "polygon", - "address": "0xeDDc6eDe8F3AF9B4971e1Fa9639314905458bE87", - "symbol": "USTC", + "chain": "optimism", + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7", + "symbol": "BTSG", "decimals": 6, - "transfer_fee": 75.0 - } - ] - }, - { - "id": "rai-wei", - "name": "RAI - Rai Reflex Index", - "symbol": "RAI", - "image": "/images/assets/rai.svg", - "contracts": [ + "transfer_fee": 1000.0 + }, { - "chain": "ethereum", - "address": "0x03ab458634910AaD20eF5f1C8ee96F1D6ac54919", - "symbol": "RAI", - "decimals": 18, - "transfer_fee": 29.0 - } - ] - }, - { - "id": "link-wei", - "name": "LINK - ChainLink Token", - "symbol": "LINK", - "image": "/images/assets/link.svg", - "contracts": [ + "chain": "polygon", + "address": "0x86C74A05e735eB72f81e4bb415AaF0e3d0c1c413", + "symbol": "BTSG", + "decimals": 6, + "transfer_fee": 150.0 + }, { - "chain": "ethereum", - "address": "0x514910771AF9Ca656af840dff83E8264EcF986CA", - "symbol": "LINK", - "decimals": 18, - "transfer_fee": 12.0 + "chain": "scroll", + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7", + "symbol": "BTSG", + "decimals": 6, + "transfer_fee": 1000.0 } ] }, { - "id": "frax-wei", - "name": "FRAX - Frax", - "symbol": "FRAX", - "image": "/images/assets/frax.svg", + "id": "usaga", + "name": "SAGA - Axelar Wrapped SAGA", + "symbol": "SAGA", + "image": "/images/assets/saga.svg", "contracts": [ { "chain": "arbitrum", - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 5.0 + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 7.2 }, { "chain": "avalanche", - "address": "0x4914886dBb8aAd7A7456D471EAab10b06d42348D", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 1.5 + "address": "0x3b3D6C857476Fc2f275906D39568d622B74d96a0", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 1.1 }, { "chain": "base", - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 5.0 + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 7.2 + }, + { + "chain": "binance", + "address": "0x15C6cadcc3B920D7D811c1Bbec96FA5e6f449eF9", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 1.1 }, { - "chain": "binance", - "address": "0x3FF4cb8EC5EC5eBBfD3424401D962F0627a67Cac", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 1.5 + "chain": "blast", + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 7.2 }, { "chain": "celo", - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 1.5 + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 1.1 }, { "chain": "ethereum", - "address": "0x853d955aCEf822Db058eb8505911ED77F175b99e", - "symbol": "FRAX", - "decimals": 18, - "transfer_fee": 80.0 + "address": "0xF42fCFfc27A5B8d0afEC45659407B82f9F32fA98", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 43.0 }, { "chain": "fantom", - "address": "0xbE71e68fB36d14565F523C9c36ab2A8Be0c26D55", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 1.5 + "address": "0x15C6cadcc3B920D7D811c1Bbec96FA5e6f449eF9", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 1.1 }, { "chain": "filecoin", - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 1.5 + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 1.1 + }, + { + "chain": "fraxtal", + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 7.2 }, { "chain": "kava", - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 1.5 + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 1.1 }, { "chain": "linea", - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 1.5 + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 7.2 }, { "chain": "mantle", - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 1.5 + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 7.2 }, { "chain": "moonbeam", - "address": "0x61C82805453a989E99B544DFB7031902e9bac448", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 1.5 + "address": "0xF42fCFfc27A5B8d0afEC45659407B82f9F32fA98", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 1.1 }, { "chain": "optimism", - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 5.0 + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 7.2 }, { "chain": "polygon", - "address": "0x53Adc464b488bE8C5d7269B9ABBCe8bA74195C3a", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 1.5 + "address": "0xfA23FDB1648534797165fe52dc09e4e7e25C737a", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 1.1 }, { "chain": "scroll", - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040", - "symbol": "axlFRAX", - "decimals": 18, - "transfer_fee": 1.5 - } - ] - }, - { - "id": "mkr-wei", - "name": "MKR - Maker", - "symbol": "MKR", - "image": "/images/assets/mkr.svg", - "contracts": [ - { - "chain": "ethereum", - "address": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", - "symbol": "MKR", - "decimals": 18, - "transfer_fee": 0.11 - } - ] - }, - { - "id": "uni-wei", - "name": "UNI - Uniswap", - "symbol": "UNI", - "image": "/images/assets/uni.svg", - "contracts": [ - { - "chain": "ethereum", - "address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", - "symbol": "UNI", - "decimals": 18, - "transfer_fee": 16.0 - } - ] - }, - { - "id": "shib-wei", - "name": "SHIB - SHIBA INU", - "symbol": "SHIB", - "image": "/images/assets/shib.svg", - "contracts": [ - { - "chain": "ethereum", - "address": "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE", - "symbol": "SHIB", - "decimals": 18, - "transfer_fee": 8000000.0 + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7", + "symbol": "axlSAGA", + "decimals": 6, + "transfer_fee": 7.2 } ] }, { - "id": "wfil-wei", - "name": "WFIL - Wrapped FIL", - "symbol": "WFIL", - "image": "/images/assets/wfil.svg", + "id": "ulava", + "name": "LAVA - Axelar Wrapped LAVA", + "symbol": "LAVA", + "image": "/images/assets/lava.svg", "contracts": [ { "chain": "arbitrum", - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 1.0 + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 10.0 }, { "chain": "avalanche", - "address": "0xF3bcB00146d1123dD19974De758F83D01E26D3F1", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 0.3 + "address": "0x654877D1C2ca16e417e99eF906Ca1Ba96B8cfE4C", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 1.5 }, { "chain": "base", - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 1.0 + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 10.0 }, { "chain": "binance", - "address": "0x49517abB880359eb873bDc08d09eBc0c478d3CA2", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 0.3 + "address": "0xFfeB8287dE7DC756067e171e9919c730f0636680", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 1.5 + }, + { + "chain": "blast", + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 10.0 }, { "chain": "celo", - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 0.3 + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 1.5 }, { "chain": "ethereum", - "address": "0x6A7b717aE5Ed65F85BA25403D5063D368239828e", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 16.0 + "address": "0x8b21c0E5672F8937177d9a74B0d87AD7974BDA5D", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 60.0 }, { "chain": "fantom", - "address": "0x49517abB880359eb873bDc08d09eBc0c478d3CA2", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 0.3 + "address": "0xFfeB8287dE7DC756067e171e9919c730f0636680", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 1.5 }, { "chain": "filecoin", - "address": "0x60E1773636CF5E4A227d9AC24F20fEca034ee25A", - "symbol": "WFIL", - "decimals": 18, - "transfer_fee": 0.3 + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 1.5 + }, + { + "chain": "fraxtal", + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 10.0 }, { "chain": "kava", - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 0.3 + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 1.5 }, { "chain": "linea", - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 0.3 + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 10.0 }, { "chain": "mantle", - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 0.3 + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 10.0 }, { "chain": "moonbeam", - "address": "0x6A7b717aE5Ed65F85BA25403D5063D368239828e", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 0.3 + "address": "0x8b21c0E5672F8937177d9a74B0d87AD7974BDA5D", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 1.5 }, { "chain": "optimism", - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 1.0 + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 10.0 }, { "chain": "polygon", - "address": "0xE440dc07b23faafF3a76bdbcf783221406eb00F1", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 0.3 + "address": "0x1da37a2B6e275e05A16859A4C070E82428Ef9Da5", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 1.5 }, { "chain": "scroll", - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73", - "symbol": "axlFIL", - "decimals": 18, - "transfer_fee": 0.3 + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF", + "symbol": "LAVA", + "decimals": 6, + "transfer_fee": 10.0 } ] }, { - "id": "polygon-uusdc", - "name": "USDC - Polygon USDC", - "symbol": "USDC", - "image": "/images/assets/usdc.svg", + "id": "cbbtc-satoshi", + "name": "cbBTC - Coinbase Wrapped BTC", + "symbol": "cbBTC", + "image": "/images/assets/cbbtc.svg", "contracts": [ { - "chain": "polygon", - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "symbol": "USDC", - "decimals": 6, - "transfer_fee": 1.5 + "chain": "base", + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "decimals": 8, + "transfer_fee": 0.00017 } ] }, { - "id": "avalanche-uusdc", - "name": "USDC - Avalanche USDC", - "symbol": "USDC", - "image": "/images/assets/usdc.svg", + "id": "fbtc-satoshi", + "name": "FBTC - Fire Bitcoin", + "symbol": "FBTC", + "image": "/images/assets/fbtc.svg", "contracts": [ { - "chain": "avalanche", - "address": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", - "symbol": "USDC", + "chain": "mantle", + "address": "0xC96dE26018A54D51c097160568752c4E3BD6C364", + "symbol": "FBTC", + "decimals": 8, + "transfer_fee": 0.00017 + } + ] + }, + { + "id": "lbtc-satoshi", + "name": "LBTC - Lombard Staked Bitcoin", + "symbol": "LBTC", + "image": "/images/assets/lbtc.svg", + "contracts": [ + { + "chain": "ethereum", + "address": "0x8236a87084f8B84306f72007F36F2618A5634494", + "symbol": "LBTC", + "decimals": 8, + "transfer_fee": 0.001 + } + ] + }, + { + "id": "arbitrum-uusdt", + "name": "USDT - Tether USD", + "symbol": "USDT", + "image": "/images/assets/usdt.svg", + "contracts": [ + { + "chain": "arbitrum", + "address": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", + "symbol": "USDT", "decimals": 6, - "transfer_fee": 1.5 + "transfer_fee": 10.0 } ] }, { - "id": "yieldusd-wei", - "name": "YieldUSD - Real Yield USD", - "symbol": "YieldUSD", - "image": "/images/assets/yieldusd.svg", + "id": "polygon-uusdt", + "name": "USDT - (PoS) Tether USD", + "symbol": "USDT", + "image": "/images/assets/usdt.svg", "contracts": [ { - "chain": "arbitrum", - "address": "0x0cfD82F3910b3A5faf3a0417Fb0063953D6B911b", - "symbol": "axlYieldUSD", - "decimals": 18, - "transfer_fee": 5.0 - }, - { - "chain": "ethereum", - "address": "0x97e6E0a40a3D02F12d1cEC30ebfbAE04e37C119E", - "symbol": "YieldUSD", - "decimals": 18, - "transfer_fee": 80.0 + "chain": "polygon", + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "symbol": "USDT", + "decimals": 6, + "transfer_fee": 1.5 } ] }, { - "id": "yieldeth-wei", - "name": "YieldETH - Real Yield ETH", - "symbol": "YieldETH", - "image": "/images/assets/yieldeth.svg", + "id": "optimism-uusdt", + "name": "USDT - Tether USD", + "symbol": "USDT", + "image": "/images/assets/usdt.svg", "contracts": [ { - "chain": "arbitrum", - "address": "0xA9AF51A55F275503a3876077a08Ae6540835EF8C", - "symbol": "axlYieldETH", - "decimals": 18, - "transfer_fee": 0.0031 - }, - { - "chain": "ethereum", - "address": "0xb5b29320d2Dde5BA5BAFA1EbcD270052070483ec", - "symbol": "YieldETH", - "decimals": 18, - "transfer_fee": 0.05 + "chain": "optimism", + "address": "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", + "symbol": "USDT", + "decimals": 6, + "transfer_fee": 10.0 } ] } @@ -3111,6 +6137,13 @@ "symbol": "aUSDC", "image": "/images/assets/ausdc.svg", "contracts": [ + { + "chain": "arbitrum-sepolia", + "address": "0xA2Ba06a76eC793d1Faf23Cc8220A887402b27331", + "symbol": "aUSDC", + "decimals": 6, + "transfer_fee": 0.1 + }, { "chain": "avalanche", "address": "0x57F1c63497AEe0bE305B8852b354CEc793da43bB", @@ -3119,7 +6152,7 @@ "transfer_fee": 0.1 }, { - "chain": "base", + "chain": "base-sepolia", "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A", "symbol": "aUSDC", "decimals": 6, @@ -3133,7 +6166,14 @@ "transfer_fee": 0.1 }, { - "chain": "ethereum", + "chain": "blast-sepolia", + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A", + "symbol": "aUSDC", + "decimals": 6, + "transfer_fee": 0.1 + }, + { + "chain": "ethereum-sepolia", "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A", "symbol": "aUSDC", "decimals": 6, @@ -3154,63 +6194,70 @@ "transfer_fee": 0.1 }, { - "chain": "linea", + "chain": "fraxtal", "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A", "symbol": "aUSDC", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "mantle", + "chain": "immutable", "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A", "symbol": "aUSDC", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "moonbeam", - "address": "0xD1633F7Fb3d716643125d6415d4177bC36b7186b", + "chain": "linea", + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A", "symbol": "aUSDC", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "optimism", + "chain": "linea-sepolia", "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A", "symbol": "aUSDC", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "polygon", - "address": "0x2c852e740B62308c46DD29B982FBb650D063Bd07", + "chain": "mantle-sepolia", + "address": "0xAa03872057AD496Bd6f3eE85b85e1e4DABdb1a5d", "symbol": "aUSDC", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "polygon-zkevm", - "address": "0xCb7996d51Ff923b2C6076d42C065a6ca000D32A1", + "chain": "moonbeam", + "address": "0xD1633F7Fb3d716643125d6415d4177bC36b7186b", "symbol": "aUSDC", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "scroll", + "chain": "optimism-sepolia", "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A", "symbol": "aUSDC", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "ethereum-sepolia", + "chain": "polygon", + "address": "0x2c852e740B62308c46DD29B982FBb650D063Bd07", + "symbol": "aUSDC", + "decimals": 6, + "transfer_fee": 0.1 + }, + { + "chain": "polygon-sepolia", "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A", "symbol": "aUSDC", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "arbitrum", + "chain": "scroll", "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A", "symbol": "aUSDC", "decimals": 6, @@ -3238,6 +6285,13 @@ "symbol": "AXL", "image": "/images/assets/axl.svg", "contracts": [ + { + "chain": "arbitrum-sepolia", + "address": "0x6822d8A56904A746C4812e3E54998295F4667e76", + "symbol": "wAXL", + "decimals": 6, + "transfer_fee": 0.1 + }, { "chain": "avalanche", "address": "0xa8B51e6517f9A6Ab7b247bF10b71b1A738eD8E50", @@ -3246,7 +6300,7 @@ "transfer_fee": 0.1 }, { - "chain": "base", + "chain": "base-sepolia", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, @@ -3260,7 +6314,14 @@ "transfer_fee": 0.1 }, { - "chain": "ethereum", + "chain": "blast-sepolia", + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", + "symbol": "wAXL", + "decimals": 6, + "transfer_fee": 0.1 + }, + { + "chain": "ethereum-sepolia", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, @@ -3281,63 +6342,63 @@ "transfer_fee": 0.1 }, { - "chain": "linea", + "chain": "fraxtal", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "mantle", + "chain": "linea", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "moonbeam", - "address": "0xB4D56B6AD4DD2B48e68D2a26C25A04dC1c0eE393", + "chain": "linea-sepolia", + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "optimism", - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", + "chain": "mantle-sepolia", + "address": "0xA3A2b6F3b34F513BA0084D504E8a6162bd7C7EE6", "symbol": "wAXL", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "polygon", - "address": "0x9c79782d2B13CAC0Fa2FB00D188104fe6f98E533", + "chain": "moonbeam", + "address": "0xB4D56B6AD4DD2B48e68D2a26C25A04dC1c0eE393", "symbol": "wAXL", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "polygon-zkevm", - "address": "0x68C07f87517F7300DdBC1793135362aFbfE65843", + "chain": "optimism-sepolia", + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "scroll", - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", + "chain": "polygon", + "address": "0x9c79782d2B13CAC0Fa2FB00D188104fe6f98E533", "symbol": "wAXL", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "ethereum-sepolia", + "chain": "polygon-sepolia", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, "transfer_fee": 0.1 }, { - "chain": "arbitrum", + "chain": "scroll", "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f", "symbol": "wAXL", "decimals": 6, @@ -3366,32 +6427,47 @@ "image": "/images/assets/wsteth.svg", "contracts": [ { - "chain": "ethereum", - "address": "0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f", + "chain": "polygon-sepolia", + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4", + "symbol": "axl-wstETH", + "decimals": 18, + "transfer_fee": 6e-5 + } + ] + }, + { + "id": "sepolia-wsteth-wei", + "name": "wstETH - Wrapped liquid staked Ether 2.0", + "symbol": "wstETH", + "image": "/images/assets/wsteth.svg", + "contracts": [ + { + "chain": "arbitrum-sepolia", + "address": "0xa190ff582011eFEa55A87209F85D6f411D07d052", "symbol": "wstETH", "decimals": 18, - "transfer_fee": 6e-05 + "transfer_fee": 6e-5 }, { - "chain": "optimism", - "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4", - "symbol": "axl-wstETH", + "chain": "ethereum-sepolia", + "address": "0xB82381A3fBD3FaFA77B3a7bE693342618240067b", + "symbol": "wstETH", "decimals": 18, - "transfer_fee": 6e-05 + "transfer_fee": 6e-5 }, { - "chain": "polygon", - "address": "0xb48D2ce84900ff4dFFaf53CbE5ea8Ec6195cb67b", - "symbol": "axl-wstETH", + "chain": "optimism-sepolia", + "address": "0x04f9c3c252B280C92530490c6E02a3DD06651C2F", + "symbol": "wstETH", "decimals": 18, - "transfer_fee": 6e-05 + "transfer_fee": 6e-5 }, { - "chain": "arbitrum", - "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4", - "symbol": "axl-wstETH", + "chain": "polygon-sepolia", + "address": "0x04f9c3c252B280C92530490c6E02a3DD06651C2F", + "symbol": "wstETH", "decimals": 18, - "transfer_fee": 6e-05 + "transfer_fee": 6e-5 } ] }, @@ -3410,139 +6486,19 @@ } ] }, - { - "id": "eth-wei", - "name": "WETH - Wrapped Ether", - "symbol": "WETH", - "image": "/images/assets/weth.svg", - "contracts": [ - { - "chain": "avalanche", - "address": "0xe840BE8D9aB1ACD5AfC7168b05EC350B7FD18709", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "base", - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "binance", - "address": "0x409A57A5Ee1F37FB58b3A3eB9717398F328da1eD", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "ethereum", - "address": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6", - "symbol": "WETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "fantom", - "address": "0xB17053aE763aCfD65A58e265aa9A4a59b25A7a87", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "filecoin", - "address": "0xcCDF43cC00A2d88c3A9D7B0e0BeD39E9B899F723", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "linea", - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "mantle", - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "moonbeam", - "address": "0x4faB8Ad67eF3173501c512B9367f0B0f62287fE7", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "optimism", - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "polygon", - "address": "0x786D82A436EA836A8669919D605FfeaEFa51744e", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "polygon-zkevm", - "address": "0xcCDF43cC00A2d88c3A9D7B0e0BeD39E9B899F723", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "scroll", - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "ethereum-sepolia", - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "arbitrum", - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "celo", - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - }, - { - "chain": "kava", - "address": "0x3F8a312113ED10833F27bbC1ee08A8cDB4df16B4", - "symbol": "axlWETH", - "decimals": 18, - "transfer_fee": 7e-05 - } - ] - }, { "id": "wmatic-wei", "name": "WMATIC - Wrapped Matic", "symbol": "WMATIC", "image": "/images/assets/wmatic.svg", "contracts": [ + { + "chain": "arbitrum-sepolia", + "address": "0xa98742504D7764b36aC2e3B62006f387d138b88B", + "symbol": "WMATIC", + "decimals": 18, + "transfer_fee": 0.07 + }, { "chain": "avalanche", "address": "0xB923E2374639D0605388D91CFedAfCeCE03Cfd8f", @@ -3551,7 +6507,7 @@ "transfer_fee": 0.07 }, { - "chain": "base", + "chain": "base-sepolia", "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380", "symbol": "WMATIC", "decimals": 18, @@ -3565,7 +6521,14 @@ "transfer_fee": 0.07 }, { - "chain": "ethereum", + "chain": "blast-sepolia", + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380", + "symbol": "WMATIC", + "decimals": 18, + "transfer_fee": 0.07 + }, + { + "chain": "ethereum-sepolia", "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380", "symbol": "WMATIC", "decimals": 18, @@ -3586,63 +6549,63 @@ "transfer_fee": 0.07 }, { - "chain": "linea", + "chain": "fraxtal", "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380", "symbol": "WMATIC", "decimals": 18, "transfer_fee": 0.07 }, { - "chain": "mantle", + "chain": "linea", "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380", "symbol": "WMATIC", "decimals": 18, "transfer_fee": 0.07 }, { - "chain": "moonbeam", - "address": "0xde3dB4FD7D7A5Cc7D8811b7BaFA4103FD90282f3", + "chain": "linea-sepolia", + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380", "symbol": "WMATIC", "decimals": 18, "transfer_fee": 0.07 }, - { - "chain": "optimism", - "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380", + { + "chain": "mantle-sepolia", + "address": "0x5e372F445C6afc91Aaca0d6C0Fa170d5f8F30f49", "symbol": "WMATIC", "decimals": 18, "transfer_fee": 0.07 }, { - "chain": "polygon", - "address": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", + "chain": "moonbeam", + "address": "0xde3dB4FD7D7A5Cc7D8811b7BaFA4103FD90282f3", "symbol": "WMATIC", "decimals": 18, "transfer_fee": 0.07 }, { - "chain": "polygon-zkevm", - "address": "0x08349ecC52e1Ba8351f2564117f3918BCbF90Ff0", + "chain": "optimism-sepolia", + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380", "symbol": "WMATIC", "decimals": 18, "transfer_fee": 0.07 }, { - "chain": "scroll", - "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380", + "chain": "polygon", + "address": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", "symbol": "WMATIC", "decimals": 18, "transfer_fee": 0.07 }, { - "chain": "ethereum-sepolia", + "chain": "polygon-sepolia", "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380", "symbol": "WMATIC", "decimals": 18, "transfer_fee": 0.07 }, { - "chain": "arbitrum", + "chain": "scroll", "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380", "symbol": "WMATIC", "decimals": 18, @@ -3670,6 +6633,13 @@ "symbol": "WAVAX", "image": "/images/assets/wavax.svg", "contracts": [ + { + "chain": "arbitrum-sepolia", + "address": "0x12e5E00075acd8dBfa00576Da30ea81b8c3038a0", + "symbol": "WAVAX", + "decimals": 18, + "transfer_fee": 0.001 + }, { "chain": "avalanche", "address": "0xd00ae08403B9bbb9124bB305C09058E32C39A48c", @@ -3678,7 +6648,7 @@ "transfer_fee": 0.001 }, { - "chain": "base", + "chain": "base-sepolia", "address": "0x2a87806561C550ba2dA9677c5323413E6e539740", "symbol": "WAVAX", "decimals": 18, @@ -3692,7 +6662,14 @@ "transfer_fee": 0.001 }, { - "chain": "ethereum", + "chain": "blast-sepolia", + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740", + "symbol": "WAVAX", + "decimals": 18, + "transfer_fee": 0.001 + }, + { + "chain": "ethereum-sepolia", "address": "0x2a87806561C550ba2dA9677c5323413E6e539740", "symbol": "WAVAX", "decimals": 18, @@ -3713,63 +6690,63 @@ "transfer_fee": 0.001 }, { - "chain": "linea", + "chain": "fraxtal", "address": "0x2a87806561C550ba2dA9677c5323413E6e539740", "symbol": "WAVAX", "decimals": 18, "transfer_fee": 0.001 }, { - "chain": "mantle", + "chain": "linea", "address": "0x2a87806561C550ba2dA9677c5323413E6e539740", "symbol": "WAVAX", "decimals": 18, "transfer_fee": 0.001 }, { - "chain": "moonbeam", - "address": "0x64aae6319934995Bf30e67EBBBA9750256E07283", + "chain": "linea-sepolia", + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740", "symbol": "WAVAX", "decimals": 18, "transfer_fee": 0.001 }, { - "chain": "optimism", - "address": "0x2a87806561C550ba2dA9677c5323413E6e539740", + "chain": "mantle-sepolia", + "address": "0xf3280d7a127Bb743918040fB99108728388e3c9e", "symbol": "WAVAX", "decimals": 18, "transfer_fee": 0.001 }, { - "chain": "polygon", - "address": "0x6DD60c05FdA1255A44Ffaa9A8200b5b179A578D6", + "chain": "moonbeam", + "address": "0x64aae6319934995Bf30e67EBBBA9750256E07283", "symbol": "WAVAX", "decimals": 18, "transfer_fee": 0.001 }, { - "chain": "polygon-zkevm", - "address": "0x0497Cae18E666A7d9cC13715DB0b5c13CE04C177", + "chain": "optimism-sepolia", + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740", "symbol": "WAVAX", "decimals": 18, "transfer_fee": 0.001 }, { - "chain": "scroll", - "address": "0x2a87806561C550ba2dA9677c5323413E6e539740", + "chain": "polygon", + "address": "0x6DD60c05FdA1255A44Ffaa9A8200b5b179A578D6", "symbol": "WAVAX", "decimals": 18, "transfer_fee": 0.001 }, { - "chain": "ethereum-sepolia", + "chain": "polygon-sepolia", "address": "0x2a87806561C550ba2dA9677c5323413E6e539740", "symbol": "WAVAX", "decimals": 18, "transfer_fee": 0.001 }, { - "chain": "arbitrum", + "chain": "scroll", "address": "0x2a87806561C550ba2dA9677c5323413E6e539740", "symbol": "WAVAX", "decimals": 18, @@ -3797,6 +6774,13 @@ "symbol": "WFTM", "image": "/images/assets/wftm.svg", "contracts": [ + { + "chain": "arbitrum-sepolia", + "address": "0x0075fBA58E4A23Fb1f6EAf43EBA88D0E64580a70", + "symbol": "WFTM", + "decimals": 18, + "transfer_fee": 0.08 + }, { "chain": "avalanche", "address": "0xeF721BaBf08A2eE5BCcfd2f2A34CbF4Dc9A56959", @@ -3805,7 +6789,7 @@ "transfer_fee": 0.08 }, { - "chain": "base", + "chain": "base-sepolia", "address": "0x594D8b81eC765410536ab59E98091700b99508D8", "symbol": "WFTM", "decimals": 18, @@ -3819,7 +6803,14 @@ "transfer_fee": 0.08 }, { - "chain": "ethereum", + "chain": "blast-sepolia", + "address": "0x594D8b81eC765410536ab59E98091700b99508D8", + "symbol": "WFTM", + "decimals": 18, + "transfer_fee": 0.08 + }, + { + "chain": "ethereum-sepolia", "address": "0x594D8b81eC765410536ab59E98091700b99508D8", "symbol": "WFTM", "decimals": 18, @@ -3840,63 +6831,63 @@ "transfer_fee": 0.08 }, { - "chain": "linea", + "chain": "fraxtal", "address": "0x594D8b81eC765410536ab59E98091700b99508D8", "symbol": "WFTM", "decimals": 18, "transfer_fee": 0.08 }, { - "chain": "mantle", + "chain": "linea", "address": "0x594D8b81eC765410536ab59E98091700b99508D8", "symbol": "WFTM", "decimals": 18, "transfer_fee": 0.08 }, { - "chain": "moonbeam", - "address": "0x40EebD34eC6CB4C0644a18494365171b1dcE97eb", + "chain": "linea-sepolia", + "address": "0x594D8b81eC765410536ab59E98091700b99508D8", "symbol": "WFTM", "decimals": 18, "transfer_fee": 0.08 }, { - "chain": "optimism", - "address": "0x594D8b81eC765410536ab59E98091700b99508D8", + "chain": "mantle-sepolia", + "address": "0xd7ba4DE2d9cDF1D34D0aE608F3725Aed1A32821E", "symbol": "WFTM", "decimals": 18, "transfer_fee": 0.08 }, { - "chain": "polygon", - "address": "0x62b6F2A4eE6a4801bfcD2056d19c6d71654D2582", + "chain": "moonbeam", + "address": "0x40EebD34eC6CB4C0644a18494365171b1dcE97eb", "symbol": "WFTM", "decimals": 18, "transfer_fee": 0.08 }, { - "chain": "polygon-zkevm", - "address": "0xa82783a70de6a47Fa0f4d664D2998cB5D5C5291C", + "chain": "optimism-sepolia", + "address": "0x594D8b81eC765410536ab59E98091700b99508D8", "symbol": "WFTM", "decimals": 18, "transfer_fee": 0.08 }, { - "chain": "scroll", - "address": "0x594D8b81eC765410536ab59E98091700b99508D8", + "chain": "polygon", + "address": "0x62b6F2A4eE6a4801bfcD2056d19c6d71654D2582", "symbol": "WFTM", "decimals": 18, "transfer_fee": 0.08 }, { - "chain": "ethereum-sepolia", + "chain": "polygon-sepolia", "address": "0x594D8b81eC765410536ab59E98091700b99508D8", "symbol": "WFTM", "decimals": 18, "transfer_fee": 0.08 }, { - "chain": "arbitrum", + "chain": "scroll", "address": "0x594D8b81eC765410536ab59E98091700b99508D8", "symbol": "WFTM", "decimals": 18, @@ -3924,6 +6915,13 @@ "symbol": "WBNB", "image": "/images/assets/wbnb.svg", "contracts": [ + { + "chain": "arbitrum-sepolia", + "address": "0x109E2C78C68F6388F6f50841C9A175BaC139B3d7", + "symbol": "WBNB", + "decimals": 18, + "transfer_fee": 0.0003 + }, { "chain": "avalanche", "address": "0xd020f566723e8402f925A891605c02ce7AF2477F", @@ -3932,7 +6930,7 @@ "transfer_fee": 0.0003 }, { - "chain": "base", + "chain": "base-sepolia", "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A", "symbol": "WBNB", "decimals": 18, @@ -3946,7 +6944,14 @@ "transfer_fee": 0.0003 }, { - "chain": "ethereum", + "chain": "blast-sepolia", + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A", + "symbol": "WBNB", + "decimals": 18, + "transfer_fee": 0.0003 + }, + { + "chain": "ethereum-sepolia", "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A", "symbol": "WBNB", "decimals": 18, @@ -3967,63 +6972,63 @@ "transfer_fee": 0.0003 }, { - "chain": "linea", + "chain": "fraxtal", "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A", "symbol": "WBNB", "decimals": 18, "transfer_fee": 0.0003 }, { - "chain": "mantle", + "chain": "linea", "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A", "symbol": "WBNB", "decimals": 18, "transfer_fee": 0.0003 }, { - "chain": "moonbeam", - "address": "0x8d0BBbA567Ae73a06A8678e53Dc7ADD0AF6b7039", + "chain": "linea-sepolia", + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A", "symbol": "WBNB", "decimals": 18, "transfer_fee": 0.0003 }, { - "chain": "optimism", - "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A", + "chain": "mantle-sepolia", + "address": "0x500c333DC86813F930299a68B990F57D1ca6e243", "symbol": "WBNB", "decimals": 18, "transfer_fee": 0.0003 }, { - "chain": "polygon", - "address": "0x55fDE07dEF3261a41fC59B783D27A6357e8A86Df", + "chain": "moonbeam", + "address": "0x8d0BBbA567Ae73a06A8678e53Dc7ADD0AF6b7039", "symbol": "WBNB", "decimals": 18, "transfer_fee": 0.0003 }, { - "chain": "polygon-zkevm", - "address": "0x0797715C25C31022c710DEce62A17AAE91281567", + "chain": "optimism-sepolia", + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A", "symbol": "WBNB", "decimals": 18, "transfer_fee": 0.0003 }, { - "chain": "scroll", - "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A", + "chain": "polygon", + "address": "0x55fDE07dEF3261a41fC59B783D27A6357e8A86Df", "symbol": "WBNB", "decimals": 18, "transfer_fee": 0.0003 }, { - "chain": "ethereum-sepolia", + "chain": "polygon-sepolia", "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A", "symbol": "WBNB", "decimals": 18, "transfer_fee": 0.0003 }, { - "chain": "arbitrum", + "chain": "scroll", "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A", "symbol": "WBNB", "decimals": 18, @@ -4051,6 +7056,13 @@ "symbol": "WDEV", "image": "/images/assets/wdev.svg", "contracts": [ + { + "chain": "arbitrum-sepolia", + "address": "0x757eFF1c2096cF0f95F699E6E72a6bf5Ff572664", + "symbol": "WDEV", + "decimals": 18, + "transfer_fee": 0.04 + }, { "chain": "avalanche", "address": "0xF58537d9061f7257e44442Fb7870A094AAE92B43", @@ -4059,7 +7071,7 @@ "transfer_fee": 0.04 }, { - "chain": "base", + "chain": "base-sepolia", "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9", "symbol": "WDEV", "decimals": 18, @@ -4073,7 +7085,14 @@ "transfer_fee": 0.04 }, { - "chain": "ethereum", + "chain": "blast-sepolia", + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9", + "symbol": "WDEV", + "decimals": 18, + "transfer_fee": 0.04 + }, + { + "chain": "ethereum-sepolia", "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9", "symbol": "WDEV", "decimals": 18, @@ -4094,63 +7113,63 @@ "transfer_fee": 0.04 }, { - "chain": "linea", + "chain": "fraxtal", "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9", "symbol": "WDEV", "decimals": 18, "transfer_fee": 0.04 }, { - "chain": "mantle", + "chain": "linea", "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9", "symbol": "WDEV", "decimals": 18, "transfer_fee": 0.04 }, { - "chain": "moonbeam", - "address": "0x1436aE0dF0A8663F18c0Ec51d7e2E46591730715", + "chain": "linea-sepolia", + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9", "symbol": "WDEV", "decimals": 18, "transfer_fee": 0.04 }, { - "chain": "optimism", - "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9", + "chain": "mantle-sepolia", + "address": "0xe9a3a0E5C9cFed51E1D60d57e10DeE4478415e52", "symbol": "WDEV", "decimals": 18, "transfer_fee": 0.04 }, { - "chain": "polygon", - "address": "0xb6a2f51C219A66866263Cb18DD41EE6C51B464cB", + "chain": "moonbeam", + "address": "0x1436aE0dF0A8663F18c0Ec51d7e2E46591730715", "symbol": "WDEV", "decimals": 18, "transfer_fee": 0.04 }, { - "chain": "polygon-zkevm", - "address": "0x3bA33A79504d5A9C398e2C6f284b61F182739aC7", + "chain": "optimism-sepolia", + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9", "symbol": "WDEV", "decimals": 18, "transfer_fee": 0.04 }, { - "chain": "scroll", - "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9", + "chain": "polygon", + "address": "0xb6a2f51C219A66866263Cb18DD41EE6C51B464cB", "symbol": "WDEV", "decimals": 18, "transfer_fee": 0.04 }, { - "chain": "ethereum-sepolia", + "chain": "polygon-sepolia", "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9", "symbol": "WDEV", "decimals": 18, "transfer_fee": 0.04 }, { - "chain": "arbitrum", + "chain": "scroll", "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9", "symbol": "WDEV", "decimals": 18, @@ -4171,6 +7190,150 @@ "transfer_fee": 0.04 } ] + }, + { + "id": "utsaga", + "name": "TSAGA - Axelar Wrapped TSAGA", + "symbol": "TSAGA", + "image": "/images/assets/tsaga.svg", + "contracts": [ + { + "chain": "avalanche", + "address": "0x66cB47913F450370460cB3CC8da151071e52Eff2", + "symbol": "axlTSAGA", + "decimals": 6, + "transfer_fee": 1.0 + } + ] + }, + { + "id": "uxion", + "name": "XION - Xion", + "symbol": "XION", + "image": "/images/assets/xion.svg", + "contracts": [ + { + "chain": "avalanche", + "address": "0xC5735208cFCb51d0dBAB277b6049A11DA2CbD755", + "symbol": "XION", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "binance", + "address": "0xBD67EDDDCf1f00dA4D6162a1Cd6f91db35d89370", + "symbol": "XION", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "fantom", + "address": "0xf22949a6A1F4CCb12e0160Dc8C363EC6ED67C1bf", + "symbol": "XION", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "filecoin", + "address": "0x72e3eC90781b8972C5f47ab0489940F89fC8AC49", + "symbol": "XION", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "linea", + "address": "0x08b7bC06e46C0cc11f29e1a6fc3d6e19965174bC", + "symbol": "XION", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "moonbeam", + "address": "0xeaCd938E14969900e5b364775c7d594B320c3b66", + "symbol": "XION", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "polygon", + "address": "0x08CFb75e4716e864449C57f6d16e1a2e9f5F713f", + "symbol": "XION", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "scroll", + "address": "0x08b7bC06e46C0cc11f29e1a6fc3d6e19965174bC", + "symbol": "XION", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "celo", + "address": "0x08b7bC06e46C0cc11f29e1a6fc3d6e19965174bC", + "symbol": "XION", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "chain": "kava", + "address": "0x74C792AA473443F6629b2c79f4f6760857211049", + "symbol": "XION", + "decimals": 6, + "transfer_fee": 10.0 + } + ] + }, + { + "id": "nftl-wei", + "name": "NFTL - Nifty League", + "symbol": "NFTL", + "image": "/images/assets/nftl.svg", + "contracts": [ + { + "chain": "ethereum-sepolia", + "address": "0x0d312E74ba71bff163A07DdD2b6847CefF49dD1e", + "symbol": "NFTL", + "decimals": 18, + "transfer_fee": 50.0 + } + ] + }, + { + "id": "sepolia-weth-wei", + "name": "WETH - Wrapped Ether", + "symbol": "WETH", + "image": "/images/assets/weth.svg", + "contracts": [ + { + "chain": "arbitrum-sepolia", + "address": "0x49E4D97AF0e05E5d1d6cB821918e5a00D69E91Af", + "symbol": "Sepolia axlETH", + "decimals": 18, + "transfer_fee": 7e-05 + }, + { + "chain": "ethereum-sepolia", + "address": "0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14", + "symbol": "WETH", + "decimals": 18, + "transfer_fee": 7e-05 + }, + { + "chain": "optimism-sepolia", + "address": "0x520863FA61Fe346687231477fe74867667F1423B", + "symbol": "Sepolia axlETH", + "decimals": 18, + "transfer_fee": 7e-05 + }, + { + "chain": "polygon-sepolia", + "address": "0x520863FA61Fe346687231477fe74867667F1423B", + "symbol": "Sepolia axlETH", + "decimals": 18, + "transfer_fee": 7e-05 + } + ] } ] -} \ No newline at end of file +} diff --git a/src/data/evm_chains.json b/src/data/evm_chains.json index 47d79b073..3cdab9e34 100644 --- a/src/data/evm_chains.json +++ b/src/data/evm_chains.json @@ -1,29 +1,70 @@ { "mainnet": [ { - "id": "ethereum", - "name": "Ethereum", - "chain_id": 1, - "network_id": "Ethereum", + "id": "arbitrum", + "name": "Arbitrum", + "chain_id": 42161, + "network_id": "arbitrum", "provider_params": [ { - "chainId": "0x1", - "chainName": "Ethereum", + "chainId": "0xA4B1", + "chainName": "Arbitrum", "rpcUrls": [ - "https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", - "https://rpc.ankr.com/eth" + "https://arb1.arbitrum.io/rpc", + "https://rpc.ankr.com/arbitrum" ], "nativeCurrency": { "name": "Ethereum", "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://etherscan.io/" - ] + "blockExplorerUrls": ["https://arbiscan.io/"] } ], - "image": "/images/chains/ethereum.svg" + "image": "/images/chains/arbitrum.svg" + }, + { + "id": "avalanche", + "name": "Avalanche", + "chain_id": 43114, + "network_id": "Avalanche", + "provider_params": [ + { + "chainId": "0xa86a", + "chainName": "Avalanche", + "rpcUrls": [ + "https://rpc.ankr.com/avalanche", + "https://api.avax.network/ext/bc/C/rpc" + ], + "nativeCurrency": { + "name": "Avalanche", + "symbol": "AVAX", + "decimals": 18 + }, + "blockExplorerUrls": ["https://snowtrace.io/"] + } + ], + "image": "/images/chains/avalanche.svg" + }, + { + "id": "base", + "name": "Base", + "chain_id": 8453, + "network_id": "base", + "provider_params": [ + { + "chainId": "0x2105", + "chainName": "Base", + "rpcUrls": ["https://developer-access-mainnet.base.org/"], + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + }, + "blockExplorerUrls": ["https://basescan.org/"] + } + ], + "image": "/images/chains/base.svg" }, { "id": "binance", @@ -34,243 +75,206 @@ { "chainId": "0x38", "chainName": "BNB Chain", - "rpcUrls": [ - "https://rpc.ankr.com/bsc", - "https://bscrpc.com/" - ], + "rpcUrls": ["https://rpc.ankr.com/bsc", "https://bscrpc.com/"], "nativeCurrency": { "name": "BNB", "symbol": "BNB", "decimals": 18 }, - "blockExplorerUrls": [ - "https://bscscan.com/" - ] + "blockExplorerUrls": ["https://bscscan.com/"] } ], "image": "/images/chains/binance.svg" }, { - "id": "polygon", - "name": "Polygon", - "chain_id": 137, - "network_id": "Polygon", + "id": "celo", + "name": "Celo", + "chain_id": 42220, + "network_id": "celo", "provider_params": [ { - "chainId": "0x89", - "chainName": "Polygon", - "rpcUrls": [ - "https://rpc.ankr.com/polygon", - "https://matic-mainnet.chainstacklabs.com/", - "https://polygon-rpc.com/" - ], + "chainId": "0xA4EC", + "chainName": "Celo", + "rpcUrls": ["https://forno.celo.org/", "https://rpc.ankr.com/celo"], "nativeCurrency": { - "name": "Polygon", - "symbol": "MATIC", + "name": "Celo", + "symbol": "CELO", "decimals": 18 }, - "blockExplorerUrls": [ - "https://polygonscan.com/" - ] + "blockExplorerUrls": ["https://celoscan.io/"] } ], - "image": "/images/chains/polygon.svg" + "image": "/images/chains/celo.svg" }, { - "id": "avalanche", - "name": "Avalanche", - "chain_id": 43114, - "network_id": "Avalanche", + "id": "centrifuge", + "name": "Centrifuge", + "chain_id": "2031", + "network_id": "centrifuge", "provider_params": [ { - "chainId": "0xa86a", - "chainName": "Avalanche", - "rpcUrls": [ - "https://rpc.ankr.com/avalanche", - "https://api.avax.network/ext/bc/C/rpc" - ], + "chainId": "0x7EF", + "chainName": "Centrifuge", + "rpcUrls": ["https://fullnode.parachain.centrifuge.io/"], "nativeCurrency": { - "name": "Avalanche", - "symbol": "AVAX", + "name": "Centrifuge", + "symbol": "CFG", "decimals": 18 }, - "blockExplorerUrls": [ - "https://snowtrace.io/" - ] + "blockExplorerUrls": ["https://centrifuge.subscan.io/"] } ], - "image": "/images/chains/avalanche.svg" + "image": "/images/chains/centrifuge.svg" }, { - "id": "arbitrum", - "name": "Arbitrum", - "chain_id": 42161, - "network_id": "arbitrum", + "id": "ethereum", + "name": "Ethereum", + "chain_id": 1, + "network_id": "Ethereum", "provider_params": [ { - "chainId": "0xA4B1", - "chainName": "Arbitrum", + "chainId": "0x1", + "chainName": "Ethereum", "rpcUrls": [ - "https://arb1.arbitrum.io/rpc", - "https://rpc.ankr.com/arbitrum" + "https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", + "https://rpc.ankr.com/eth" ], "nativeCurrency": { "name": "Ethereum", "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://arbiscan.io/" - ] + "blockExplorerUrls": ["https://etherscan.io/"] } ], - "image": "/images/chains/arbitrum.svg" + "image": "/images/chains/ethereum.svg" }, { - "id": "optimism", - "name": "Optimism", - "chain_id": 10, - "network_id": "optimism", + "id": "fantom", + "name": "Fantom", + "chain_id": 250, + "network_id": "Fantom", "provider_params": [ { - "chainId": "0xA", - "chainName": "Optimism", + "chainId": "0xfa", + "chainName": "Fantom", "rpcUrls": [ - "https://mainnet.optimism.io/" + "https://rpc.ankr.com/fantom", + "https://rpc.ftm.tools/", + "https://rpcapi.fantom.network/" ], "nativeCurrency": { - "name": "Ethereum", - "symbol": "ETH", + "name": "Fantom", + "symbol": "FTM", "decimals": 18 }, - "blockExplorerUrls": [ - "https://optimistic.etherscan.io/" - ] + "blockExplorerUrls": ["https://ftmscan.com/"] } ], - "image": "/images/chains/optimism.svg" + "image": "/images/chains/fantom.svg" }, { - "id": "base", - "name": "Base", - "chain_id": 8453, - "network_id": "base", + "id": "filecoin", + "name": "Filecoin", + "chain_id": 314, + "network_id": "filecoin", "provider_params": [ { - "chainId": "0x2105", - "chainName": "Base", + "chainId": "0x13A", + "chainName": "Filecoin", "rpcUrls": [ - "https://developer-access-mainnet.base.org/" + "https://rpc.ankr.com/filecoin", + "https://api.node.glif.io/rpc/v1" ], "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", + "name": "Filecoin", + "symbol": "FIL", "decimals": 18 }, - "blockExplorerUrls": [ - "https://basescan.org/" - ] + "blockExplorerUrls": ["https://filfox.info/"] } ], - "image": "/images/chains/base.svg" + "image": "/images/chains/filecoin.svg" }, { - "id": "linea", - "name": "Linea", - "chain_id": 59144, - "network_id": "linea", + "id": "immutable", + "name": "Immutable", + "chain_id": "13371", + "network_id": "immutable", "provider_params": [ { - "chainId": "0xe708", - "chainName": "Linea", - "rpcUrls": [ - "https://rpc.linea.build/" - ], + "chainId": "0x343B", + "chainName": "Immutable", + "rpcUrls": ["https://rpc.immutable.com/"], "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", + "name": "Immutable", + "symbol": "IMX", "decimals": 18 }, - "blockExplorerUrls": [ - "https://lineascan.build/" - ] + "blockExplorerUrls": ["https://explorer.immutable.com/"] } ], - "image": "/images/chains/linea.svg" + "image": "/images/chains/immutable.svg" }, { - "id": "mantle", - "name": "Mantle", - "chain_id": 5000, - "network_id": "mantle", + "id": "kava", + "name": "Kava", + "chain_id": 2222, + "network_id": "kava", "provider_params": [ { - "chainId": "0x1388", - "chainName": "Mantle", - "rpcUrls": [ - "https://rpc.mantle.xyz/" - ], + "chainId": "0x8AE", + "chainName": "Kava", + "rpcUrls": ["https://evm.kava.io/"], "nativeCurrency": { - "name": "Mantle", - "symbol": "MNT", + "name": "Kava", + "symbol": "KAVA", "decimals": 18 }, - "blockExplorerUrls": [ - "https://explorer.mantle.xyz/" - ] + "blockExplorerUrls": ["https://explorer.kava.io/"] } ], - "image": "/images/chains/mantle.svg" + "image": "/images/chains/kava.svg" }, { - "id": "scroll", - "name": "Scroll", - "chain_id": 534352, - "network_id": "scroll", + "id": "linea", + "name": "Linea", + "chain_id": 59144, + "network_id": "linea", "provider_params": [ { - "chainId": "0x82750", - "chainName": "Scroll", - "rpcUrls": [ - "https://rpc.scroll.io/" - ], + "chainId": "0xe708", + "chainName": "Linea", + "rpcUrls": ["https://rpc.linea.build/"], "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://blockscout.scroll.io/" - ] + "blockExplorerUrls": ["https://lineascan.build/"] } ], - "image": "/images/chains/scroll.svg" + "image": "/images/chains/linea.svg" }, { - "id": "fantom", - "name": "Fantom", - "chain_id": 250, - "network_id": "Fantom", + "id": "mantle", + "name": "Mantle", + "chain_id": 5000, + "network_id": "mantle", "provider_params": [ { - "chainId": "0xfa", - "chainName": "Fantom", - "rpcUrls": [ - "https://rpc.ankr.com/fantom", - "https://rpc.ftm.tools/", - "https://rpcapi.fantom.network/" - ], + "chainId": "0x1388", + "chainName": "Mantle", + "rpcUrls": ["https://rpc.mantle.xyz/"], "nativeCurrency": { - "name": "Fantom", - "symbol": "FTM", + "name": "Mantle", + "symbol": "MNT", "decimals": 18 }, - "blockExplorerUrls": [ - "https://ftmscan.com/" - ] + "blockExplorerUrls": ["https://explorer.mantle.xyz/"] } ], - "image": "/images/chains/fantom.svg" + "image": "/images/chains/mantle.svg" }, { "id": "moonbeam", @@ -290,137 +294,139 @@ "symbol": "GLMR", "decimals": 18 }, - "blockExplorerUrls": [ - "https://moonscan.io/" - ] + "blockExplorerUrls": ["https://moonscan.io/"] } ], "image": "/images/chains/moonbeam.svg" }, { - "id": "celo", - "name": "Celo", - "chain_id": 42220, - "network_id": "celo", + "id": "optimism", + "name": "Optimism", + "chain_id": 10, + "network_id": "optimism", "provider_params": [ { - "chainId": "0xA4EC", - "chainName": "Celo", - "rpcUrls": [ - "https://forno.celo.org/", - "https://rpc.ankr.com/celo" - ], + "chainId": "0xA", + "chainName": "Optimism", + "rpcUrls": ["https://mainnet.optimism.io/"], "nativeCurrency": { - "name": "Celo", - "symbol": "CELO", + "name": "Ethereum", + "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://celoscan.io/" - ] + "blockExplorerUrls": ["https://optimistic.etherscan.io/"] } ], - "image": "/images/chains/celo.svg" + "image": "/images/chains/optimism.svg" }, { - "id": "filecoin", - "name": "Filecoin", - "chain_id": 314, - "network_id": "filecoin", + "id": "polygon", + "name": "Polygon", + "chain_id": 137, + "network_id": "Polygon", "provider_params": [ { - "chainId": "0x13A", - "chainName": "Filecoin", + "chainId": "0x89", + "chainName": "Polygon", "rpcUrls": [ - "https://rpc.ankr.com/filecoin", - "https://api.node.glif.io/rpc/v1" + "https://rpc.ankr.com/polygon", + "https://matic-mainnet.chainstacklabs.com/", + "https://polygon-rpc.com/" ], "nativeCurrency": { - "name": "Filecoin", - "symbol": "FIL", + "name": "Polygon", + "symbol": "MATIC", "decimals": 18 }, - "blockExplorerUrls": [ - "https://filfox.info/" - ] + "blockExplorerUrls": ["https://polygonscan.com/"] } ], - "image": "/images/chains/filecoin.svg" + "image": "/images/chains/polygon.svg" }, { - "id": "kava", - "name": "Kava", - "chain_id": 2222, - "network_id": "kava", + "id": "scroll", + "name": "Scroll", + "chain_id": 534352, + "network_id": "scroll", "provider_params": [ { - "chainId": "0x8AE", - "chainName": "Kava", - "rpcUrls": [ - "https://evm.kava.io/" - ], + "chainId": "0x82750", + "chainName": "Scroll", + "rpcUrls": ["https://rpc.scroll.io/"], "nativeCurrency": { - "name": "Kava", - "symbol": "KAVA", + "name": "Ether", + "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://explorer.kava.io/" - ] + "blockExplorerUrls": ["https://blockscout.scroll.io/"] } ], - "image": "/images/chains/kava.svg" + "image": "/images/chains/scroll.svg" }, { - "id": "centrifuge", - "name": "Centrifuge", - "chain_id": "2031", - "network_id": "centrifuge", + "id": "fraxtal", + "name": "Fraxtal", + "chain_id": 252, + "network_id": "fraxtal", "provider_params": [ { - "chainId": "0x7EF", - "chainName": "Centrifuge", - "rpcUrls": [ - "https://fullnode.parachain.centrifuge.io/" - ], + "chainId": "0xFC", + "chainName": "Fraxtal", + "rpcUrls": ["https://rpc.frax.com/"], "nativeCurrency": { - "name": "Centrifuge", - "symbol": "CFG", + "name": "frxETH", + "symbol": "frxETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://centrifuge.subscan.io/" - ] + "blockExplorerUrls": ["https://fraxscan.com/"] } ], - "image": "/images/chains/centrifuge.svg" + "image": "/images/chains/fraxtal.svg" + }, + { + "id": "blast", + "name": "Blast", + "chain_id": 81457, + "network_id": "blast", + "provider_params": [ + { + "chainId": "0x13E31", + "chainName": "Blast", + "rpcUrls": ["https://rpc.blast.io/"], + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + }, + "blockExplorerUrls": ["https://blastscan.io/"] + } + ], + "image": "/images/chains/blast.svg" } ], "testnet": [ { - "id": "ethereum", - "name": "Ethereum Goerli", - "chain_id": 5, - "network_id": "ethereum-2", + "id": "avalanche", + "name": "Avalanche", + "chain_id": 43113, + "network_id": "Avalanche", "provider_params": [ { - "chainId": "0x5", - "chainName": "Ethereum Goerli", + "chainId": "0xa869", + "chainName": "Avalanche Fuji", "rpcUrls": [ - "https://rpc.ankr.com/eth_goerli", - "https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161" + "https://rpc.ankr.com/avalanche_fuji", + "https://api.avax-test.network/ext/bc/C/rpc" ], "nativeCurrency": { - "name": "Ethereum", - "symbol": "ETH", + "name": "Avalanche", + "symbol": "AVAX", "decimals": 18 }, - "blockExplorerUrls": [ - "https://goerli.etherscan.io/" - ] + "blockExplorerUrls": ["https://testnet.snowtrace.io/"] } ], - "image": "/images/chains/ethereum.svg" + "image": "/images/chains/avalanche.svg" }, { "id": "binance", @@ -441,63 +447,72 @@ "symbol": "BNB", "decimals": 18 }, - "blockExplorerUrls": [ - "https://testnet.bscscan.com/" - ] + "blockExplorerUrls": ["https://testnet.bscscan.com/"] } ], "image": "/images/chains/binance.svg" }, { - "id": "polygon", - "name": "Polygon", - "chain_id": 80001, - "network_id": "Polygon", + "id": "celo", + "name": "Celo", + "chain_id": 11142220, + "network_id": "celo", "provider_params": [ { - "chainId": "0x13881", - "chainName": "Polygon Mumbai", + "chainId": "0xaa044c", + "chainName": "Celo Sepolia Testnet", + "rpcUrls": ["https://rpc.ankr.com/celo_sepolia"], + "nativeCurrency": { + "name": "Celo", + "symbol": "CELO", + "decimals": 18 + }, + "blockExplorerUrls": ["https://celo-sepolia.blockscout.com/"] + } + ], + "image": "/images/chains/celo.svg" + }, + { + "id": "centrifuge-2", + "name": "Centrifuge", + "chain_id": "2090", + "network_id": "centrifuge-2", + "provider_params": [ + { + "chainId": "0x82A", + "chainName": "Centrifuge Testnet", "rpcUrls": [ - "https://rpc.ankr.com/polygon_mumbai", - "https://polygon-mumbai.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", - "https://matic-mumbai.chainstacklabs.com/" + "https://node-7118620155331796992.gx.onfinality.io/rpc?apikey=00538f2d-6297-44e3-8812-4b9d579524b2" ], "nativeCurrency": { - "name": "Polygon", - "symbol": "MATIC", + "name": "Centrifuge", + "symbol": "CFG", "decimals": 18 }, - "blockExplorerUrls": [ - "https://mumbai.polygonscan.com/" - ] + "blockExplorerUrls": [""] } ], - "image": "/images/chains/polygon.svg" + "image": "/images/chains/centrifuge.svg" }, { - "id": "avalanche", - "name": "Avalanche", - "chain_id": 43113, - "network_id": "Avalanche", + "id": "ethereum-sepolia", + "name": "Ethereum Sepolia", + "chain_id": "11155111", + "network_id": "ethereum-sepolia", "provider_params": [ { - "chainId": "0xa869", - "chainName": "Avalanche Fuji", - "rpcUrls": [ - "https://rpc.ankr.com/avalanche_fuji", - "https://api.avax-test.network/ext/bc/C/rpc" - ], + "chainId": "0xAA36A7", + "chainName": "Ethereum Sepolia", + "rpcUrls": ["https://1rpc.io/sepolia"], "nativeCurrency": { - "name": "Avalanche", - "symbol": "AVAX", + "name": "Ethereum", + "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://testnet.snowtrace.io/" - ] + "blockExplorerUrls": ["https://sepolia.etherscan.io/"] } ], - "image": "/images/chains/avalanche.svg" + "image": "/images/chains/ethereum.svg" }, { "id": "fantom", @@ -517,182 +532,161 @@ "symbol": "FTM", "decimals": 18 }, - "blockExplorerUrls": [ - "https://testnet.ftmscan.com/" - ] + "blockExplorerUrls": ["https://testnet.ftmscan.com/"] } ], "image": "/images/chains/fantom.svg" }, { - "id": "moonbeam", - "name": "Moonbase", - "chain_id": 1287, - "network_id": "Moonbeam", + "id": "filecoin", + "name": "Filecoin", + "chain_id": 314159, + "network_id": "filecoin-2", "provider_params": [ { - "chainId": "0x507", - "chainName": "Moonbase Alpha", + "chainId": "0x4cb2f", + "chainName": "Filecoin Calibration Testnet", "rpcUrls": [ - "https://rpc.api.moonbase.moonbeam.network/", - "https://rpc.testnet.moonbeam.network/", - "https://moonbase-alpha.public.blastapi.io/" + "https://api.calibration.node.glif.io/rpc/v1", + "https://rpc.ankr.com/filecoin_testnet" ], "nativeCurrency": { - "name": "Dev", - "symbol": "DEV", + "name": "Filecoin", + "symbol": "FIL", "decimals": 18 }, - "blockExplorerUrls": [ - "https://moonbase.moonscan.io/" - ] + "blockExplorerUrls": ["https://calibration.filfox.info/"] } ], - "image": "/images/chains/moonbase.png" + "image": "/images/chains/filecoin.svg" }, { - "id": "celo", - "name": "Celo", - "chain_id": 44787, - "network_id": "celo", + "id": "immutable", + "name": "Immutable", + "chain_id": "13473", + "network_id": "immutable", "provider_params": [ { - "chainId": "0xAEF3", - "chainName": "Celo Alfajores Testnet", - "rpcUrls": [ - "https://alfajores-forno.celo-testnet.org/" - ], + "chainId": "0x34A1", + "chainName": "Immutable", + "rpcUrls": ["https://rpc.testnet.immutable.com/"], "nativeCurrency": { - "name": "Celo", - "symbol": "CELO", + "name": "Immutable", + "symbol": "IMX", "decimals": 18 }, - "blockExplorerUrls": [ - "https://alfajores.celoscan.io/" - ] + "blockExplorerUrls": [""] } ], - "image": "/images/chains/celo.svg" + "image": "/images/chains/immutable.svg" }, { - "id": "arbitrum", - "name": "Arbitrum", - "chain_id": 421613, - "network_id": "arbitrum", + "id": "kava", + "name": "Kava", + "chain_id": "2221", + "network_id": "kava", "provider_params": [ { - "chainId": "0x66EED", - "chainName": "Arbitrum Goerli Testnet", - "rpcUrls": [ - "https://goerli-rollup.arbitrum.io/rpc" - ], + "chainId": "0x8AD", + "chainName": "Kava EVM", + "rpcUrls": ["https://evm.testnet.kava.io/"], "nativeCurrency": { - "name": "Ethereum", - "symbol": "ETH", + "name": "Kava", + "symbol": "KAVA", "decimals": 18 }, - "blockExplorerUrls": [ - "https://goerli.arbiscan.io/" - ] + "blockExplorerUrls": ["https://explorer.testnet.kava.io/"] } ], - "image": "/images/chains/arbitrum.svg" + "image": "/images/chains/kava.svg" }, { - "id": "optimism", - "name": "Optimism", - "chain_id": 420, - "network_id": "optimism", + "id": "mantle", + "name": "Mantle", + "chain_id": 5001, + "network_id": "mantle", "provider_params": [ { - "chainId": "0x1A4", - "chainName": "Optimism Goerli Testnet", - "rpcUrls": [ - "https://goerli.optimism.io/" - ], + "chainId": "0x1389", + "chainName": "Mantle Testnet", + "rpcUrls": ["https://rpc.testnet.mantle.xyz/"], "nativeCurrency": { - "name": "Ethereum", - "symbol": "ETH", + "name": "Mantle", + "symbol": "MNT", "decimals": 18 }, - "blockExplorerUrls": [ - "https://goerli-optimism.etherscan.io/" - ] + "blockExplorerUrls": ["https://explorer.testnet.mantle.xyz/"] } ], - "image": "/images/chains/optimism.svg" + "image": "/images/chains/mantle.svg" }, { - "id": "base", - "name": "Base", - "chain_id": 84531, - "network_id": "base", + "id": "moonbeam", + "name": "Moonbase", + "chain_id": 1287, + "network_id": "Moonbeam", "provider_params": [ { - "chainId": "0x14a33", - "chainName": "Base Goerli Testnet", + "chainId": "0x507", + "chainName": "Moonbase Alpha", "rpcUrls": [ - "https://goerli.base.org/" + "https://rpc.api.moonbase.moonbeam.network/", + "https://rpc.testnet.moonbeam.network/", + "https://moonbase-alpha.drpc.org/" ], "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", + "name": "Dev", + "symbol": "DEV", "decimals": 18 }, - "blockExplorerUrls": [ - "https://goerli.basescan.org/" - ] + "blockExplorerUrls": ["https://moonbase.moonscan.io/"] } ], - "image": "/images/chains/base.svg" + "image": "/images/chains/moonbase.png" }, { - "id": "linea", - "name": "Linea", - "chain_id": 59140, - "network_id": "linea", + "id": "polygon", + "name": "Polygon", + "chain_id": 80001, + "network_id": "Polygon", "provider_params": [ { - "chainId": "0xe704", - "chainName": "Linea Testnet", + "chainId": "0x13881", + "chainName": "Polygon Mumbai", "rpcUrls": [ - "https://rpc.goerli.linea.build/" + "https://rpc.ankr.com/polygon_mumbai", + "https://polygon-mumbai.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", + "https://matic-mumbai.chainstacklabs.com/" ], "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", + "name": "Polygon", + "symbol": "MATIC", "decimals": 18 }, - "blockExplorerUrls": [ - "https://goerli.lineascan.build/" - ] + "blockExplorerUrls": ["https://mumbai.polygonscan.com/"] } ], - "image": "/images/chains/linea.svg" + "image": "/images/chains/polygon.svg" }, { - "id": "mantle", - "name": "Mantle", - "chain_id": 5001, - "network_id": "mantle", + "id": "polygon-zkevm", + "name": "Polygon zkEVM", + "chain_id": 1442, + "network_id": "polygon-zkevm", "provider_params": [ { - "chainId": "0x1389", - "chainName": "Mantle Testnet", - "rpcUrls": [ - "https://rpc.testnet.mantle.xyz/" - ], + "chainId": "0x5A2", + "chainName": "Polygon zkEVM Testnet", + "rpcUrls": ["https://rpc.public.zkevm-test.net/"], "nativeCurrency": { - "name": "Mantle", - "symbol": "MNT", + "name": "Ether", + "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://explorer.testnet.mantle.xyz/" - ] + "blockExplorerUrls": ["https://testnet-zkevm.polygonscan.com/"] } ], - "image": "/images/chains/mantle.svg" + "image": "/images/chains/polygon.svg" }, { "id": "scroll", @@ -703,165 +697,176 @@ { "chainId": "0x8274f", "chainName": "Scroll Sepolia Testnet", - "rpcUrls": [ - "https://sepolia-rpc.scroll.io/" - ], + "rpcUrls": ["https://sepolia-rpc.scroll.io/"], "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://sepolia.scrollscan.dev/" - ] + "blockExplorerUrls": ["https://sepolia.scrollscan.dev/"] } ], "image": "/images/chains/scroll.svg" }, { - "id": "polygon-zkevm", - "name": "Polygon zkEVM", - "chain_id": 1442, - "network_id": "polygon-zkevm", + "id": "fraxtal", + "name": "Fraxtal", + "chain_id": 2522, + "network_id": "fraxtal", "provider_params": [ { - "chainId": "0x5A2", - "chainName": "Polygon zkEVM Testnet", - "rpcUrls": [ - "https://rpc.public.zkevm-test.net/" - ], + "chainId": "0x9DA", + "chainName": "Fraxtal Testnet", + "rpcUrls": ["https://rpc.testnet.frax.com/"], "nativeCurrency": { - "name": "Ether", + "name": "frxETH", + "symbol": "frxETH", + "decimals": 18 + }, + "blockExplorerUrls": ["https://explorer.testnet.frax.com/"] + } + ], + "image": "/images/chains/fraxtal.svg" + }, + { + "id": "arbitrum-sepolia", + "name": "Arbitrum Sepolia", + "chain_id": 421614, + "network_id": "arbitrum-sepolia", + "provider_params": [ + { + "chainId": "0x66EEE", + "chainName": "Arbitrum Sepolia Testnet", + "rpcUrls": ["https://sepolia-rollup.arbitrum.io/rpc"], + "nativeCurrency": { + "name": "Ethereum", "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://testnet-zkevm.polygonscan.com/" - ] + "blockExplorerUrls": ["https://sepolia.arbiscan.io/"] } ], - "image": "/images/chains/polygon.svg" + "image": "/images/chains/arbitrum.svg" }, { - "id": "filecoin", - "name": "Filecoin", - "chain_id": 314159, - "network_id": "filecoin-2", + "id": "optimism-sepolia", + "name": "Optimism Sepolia Testnet", + "chain_id": 11155420, + "network_id": "optimism-sepolia", "provider_params": [ { - "chainId": "0x4cb2f", - "chainName": "Filecoin Calibration Testnet", - "rpcUrls": [ - "https://api.calibration.node.glif.io/rpc/v1", - "https://rpc.ankr.com/filecoin_testnet" - ], + "chainId": "0xAA37DC", + "chainName": "Optimism Sepolia Testnet", + "rpcUrls": ["https://sepolia.optimism.io/"], "nativeCurrency": { - "name": "Filecoin", - "symbol": "FIL", + "name": "Ethereum", + "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://calibration.filfox.info/" - ] + "blockExplorerUrls": ["https://sepolia-optimistic.etherscan.io/"] } ], - "image": "/images/chains/filecoin.svg" + "image": "/images/chains/optimism.svg" }, { - "id": "kava", - "name": "Kava", - "chain_id": "2221", - "network_id": "kava", + "id": "base-sepolia", + "name": "Base Sepolia Testnet", + "chain_id": 84532, + "network_id": "base-sepolia", "provider_params": [ { - "chainId": "0x8AD", - "chainName": "Kava EVM", - "rpcUrls": [ - "https://evm.testnet.kava.io/" - ], + "chainId": "0x14A34", + "chainName": "Base Sepolia Testnet", + "rpcUrls": ["https://sepolia.base.org/"], "nativeCurrency": { - "name": "Kava", - "symbol": "KAVA", + "name": "Ether", + "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://explorer.testnet.kava.io/" - ] + "blockExplorerUrls": ["https://sepolia-explorer.base.org/"] } ], - "image": "/images/chains/kava.svg" + "image": "/images/chains/base.svg" }, { - "id": "centrifuge-2", - "name": "Centrifuge", - "chain_id": "2090", - "network_id": "centrifuge-2", + "id": "blast-sepolia", + "name": "Blast Sepolia Testnet", + "chain_id": 168587773, + "network_id": "blast-sepolia", "provider_params": [ { - "chainId": "0x82A", - "chainName": "Centrifuge Testnet", - "rpcUrls": [ - "https://node-7118620155331796992.gx.onfinality.io/rpc?apikey=00538f2d-6297-44e3-8812-4b9d579524b2" - ], + "chainId": "0xA0C71FD", + "chainName": "Blast Sepolia Testnet", + "rpcUrls": ["https://sepolia.blast.io/"], "nativeCurrency": { - "name": "Centrifuge", - "symbol": "CFG", + "name": "Ether", + "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "" - ] + "blockExplorerUrls": ["https://testnet.blastscan.io/"] } ], - "image": "/images/chains/centrifuge.svg" + "image": "/images/chains/blast.svg" }, { - "id": "ethereum-sepolia", - "name": "Ethereum Sepolia", - "chain_id": "11155111", - "network_id": "ethereum-sepolia", + "id": "mantle-sepolia", + "name": "Mantle Sepolia", + "chain_id": 5003, + "network_id": "mantle-sepolia", "provider_params": [ { - "chainId": "0xAA36A7", - "chainName": "Ethereum Sepolia", - "rpcUrls": [ - "https://1rpc.io/sepolia" - ], + "chainId": "0x138B", + "chainName": "Mantle Sepolia", + "rpcUrls": ["https://rpc.sepolia.mantle.xyz/"], "nativeCurrency": { - "name": "Ethereum", + "name": "Ether", "symbol": "ETH", "decimals": 18 }, - "blockExplorerUrls": [ - "https://sepolia.etherscan.io/" - ] + "blockExplorerUrls": ["https://explorer.sepolia.mantle.xyz/"] } ], - "image": "/images/chains/ethereum.svg" + "image": "/images/chains/mantle.svg" }, { - "id": "immutable", - "name": "Immutable", - "chain_id": "13473", - "network_id": "immutable", + "name": "Polygon-Sepolia", + "id": "polygon-sepolia", + "network_id": "polygon-sepolia", + "chain_id": 80002, "provider_params": [ { - "chainId": "0x34A1", - "chainName": "Immutable", - "rpcUrls": [ - "https://rpc-geth.testnet.immutable.com/" - ], + "chainId": "0x13882", + "chainName": "Polygon Sepolia", + "rpcUrls": ["https://rpc-amoy.polygon.technology/"], "nativeCurrency": { - "name": "Immutable", - "symbol": "IMX", + "name": "Polygon", + "symbol": "MATIC", "decimals": 18 }, - "blockExplorerUrls": [ - "" - ] + "blockExplorerUrls": ["https://amoy.polygonscan.com/"] } ], - "image": "/images/chains/immutable.svg" + "image": "/images/chains/polygon.svg" + }, + { + "id": "linea-sepolia", + "name": "Linea Sepolia", + "chain_id": 59141, + "network_id": "linea-sepolia", + "provider_params": [ + { + "chainId": "0xE705", + "chainName": "Linea Sepolia", + "rpcUrls": ["https://rpc.sepolia.linea.build/"], + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + }, + "blockExplorerUrls": ["https://sepolia.lineascan.build/"] + } + ], + "image": "/images/chains/linea.svg" } ] } diff --git a/src/data/gas_services.json b/src/data/gas_services.json index 059e5274e..d486b095b 100644 --- a/src/data/gas_services.json +++ b/src/data/gas_services.json @@ -63,6 +63,22 @@ { "id": "centrifuge", "address": "0x2d5d7d31F671F86C782533cc367F14109a082712" + }, + { + "id": "immutable", + "address": "0x24C2b56128fF8E7bFaD578ABefB0fc7Dfa9ba358" + }, + { + "id": "fraxtal", + "address": "0x2d5d7d31F671F86C782533cc367F14109a082712" + }, + { + "id": "blast", + "address": "0x2d5d7d31F671F86C782533cc367F14109a082712" + }, + { "id": "sui", + "address": "0x695f612a1ee9268d25ca5c03e705819a285ff0c5b4f7720fc75a00cb8c6f3b63", + "objectId": "0x0a3a8e08d156595e5a097964d5d294fcfc9ff75f736b55f44470a93e48bdeb8f" } ], "testnet": [ @@ -139,7 +155,7 @@ "address": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6" }, { - "id": "centrifuge", + "id": "centrifuge-2", "address": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6" }, { @@ -149,6 +165,42 @@ { "id": "immutable", "address": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6" + }, + { + "id": "fraxtal", + "address": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6" + }, + { + "id": "mantle-sepolia", + "address": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6" + }, + { + "id": "blast-sepolia", + "address": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6" + }, + { + "id": "arbitrum-sepolia", + "address": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6" + }, + { + "id": "base-sepolia", + "address": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6" + }, + { + "id": "optimism-sepolia", + "address": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6" + }, + { + "id": "polygon-sepolia", + "address": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6" + }, + { + "id": "linea-sepolia", + "address": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6" + }, + { "id": "sui", + "address": "0xddf711b99aec5c72594e5cf2da4014b2d30909850a759d2e8090add1088dbbc9", + "objectId": "0xac1a4ad12d781c2f31edc2aa398154d53dbda0d50cb39a4319093e3b357bc27d" } ] } diff --git a/src/data/gateways.json b/src/data/gateways.json index 57402a7eb..0117969f0 100644 --- a/src/data/gateways.json +++ b/src/data/gateways.json @@ -63,6 +63,23 @@ { "id": "centrifuge", "address": "0xe432150cce91c13a887f7D836923d5597adD8E31" + }, + { + "id": "immutable", + "address": "0xe432150cce91c13a887f7D836923d5597adD8E31" + }, + { + "id": "fraxtal", + "address": "0xe432150cce91c13a887f7D836923d5597adD8E31" + }, + { + "id": "blast", + "address": "0xe432150cce91c13a887f7D836923d5597adD8E31" + }, + { + "id": "sui", + "address": "0xeb055ffc3237c24e305a2bb760fe6551f6ff7c5fdb68735169c0f528fccab373", + "objectId": "0xde761b85a85477bba0ca6b4a09bcde7da33db2f64c392f806f24f433971514f5" } ], "testnet": [ @@ -149,6 +166,43 @@ { "id": "immutable", "address": "0xe432150cce91c13a887f7D836923d5597adD8E31" + }, + { + "id": "fraxtal", + "address": "0xe432150cce91c13a887f7D836923d5597adD8E31" + }, + { + "id": "mantle-sepolia", + "address": "0xC8D18F85cB0Cee5C95eC29c69DeaF6cea972349c" + }, + { + "id": "blast-sepolia", + "address": "0xe432150cce91c13a887f7D836923d5597adD8E31" + }, + { + "id": "arbitrum-sepolia", + "address": "0xe1cE95479C84e9809269227C7F8524aE051Ae77a" + }, + { + "id": "base-sepolia", + "address": "0xe432150cce91c13a887f7D836923d5597adD8E31" + }, + { + "id": "optimism-sepolia", + "address": "0xe432150cce91c13a887f7D836923d5597adD8E31" + }, + { + "id": "polygon-sepolia", + "address": "0xe432150cce91c13a887f7D836923d5597adD8E31" + }, + { + "id": "linea-sepolia", + "address": "0xe432150cce91c13a887f7D836923d5597adD8E31" + }, + { + "id": "sui", + "address": "0x6ddfcdd14a1019d13485a724db892fa0defe580f19c991eaabd690140abb21e4", + "objectId": "0x6fc18d39a9d7bf46c438bdb66ac9e90e902abffca15b846b32570538982fb3db" } ] } diff --git a/src/data/ibc_assets.json b/src/data/ibc_assets.json index c9ae6609e..a7bf6fa03 100644 --- a/src/data/ibc_assets.json +++ b/src/data/ibc_assets.json @@ -14,7 +14,7 @@ "symbol": "AXL", "image": "/images/assets/axl.svg", "decimals": 6, - "transfer_fee": 0.2 + "transfer_fee": 0.017 }, { "id": "dai-wei", @@ -38,7 +38,7 @@ "symbol": "WBTC", "image": "/images/assets/wbtc.svg", "decimals": 8, - "transfer_fee": 4.2e-06 + "transfer_fee": 1.7e-6 }, { "id": "weth-wei", @@ -46,7 +46,7 @@ "symbol": "WETH", "image": "/images/assets/weth.svg", "decimals": 18, - "transfer_fee": 6.2e-05 + "transfer_fee": 3.2e-5 }, { "id": "wmai-wei", @@ -78,7 +78,7 @@ "symbol": "wstETH", "image": "/images/assets/wsteth.svg", "decimals": 18, - "transfer_fee": 5.7e-05 + "transfer_fee": 2.9e-5 }, { "id": "wusdm-wei", @@ -136,6 +136,14 @@ "decimals": 6, "transfer_fee": 0.12 }, + { + "id": "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn", + "name": "LVN - Levana Governance Token", + "symbol": "LVN", + "image": "/images/assets/lvn.svg", + "decimals": 6, + "transfer_fee": 0.56 + }, { "id": "cusd-wei", "name": "cUSD - Celo Dollar", @@ -158,7 +166,7 @@ "symbol": "cbETH", "image": "/images/assets/cbeth.svg", "decimals": 18, - "transfer_fee": 6.2e-05 + "transfer_fee": 3.2e-5 }, { "id": "sfrxeth-wei", @@ -166,7 +174,15 @@ "symbol": "sfrxETH", "image": "/images/assets/sfrxeth.svg", "decimals": 18, - "transfer_fee": 5.7e-05 + "transfer_fee": 2.9e-5 + }, + { + "id": "frxeth-wei", + "name": "frxETH - Frax Ether", + "symbol": "frxETH", + "image": "/images/assets/frxeth.svg", + "decimals": 18, + "transfer_fee": 3.2e-5 }, { "id": "sfrax-wei", @@ -176,13 +192,21 @@ "decimals": 18, "transfer_fee": 0.099 }, + { + "id": "fxs-wei", + "name": "FXS - Frax Share", + "symbol": "FXS", + "image": "/images/assets/fxs.svg", + "decimals": 18, + "transfer_fee": 0.011 + }, { "id": "reth-wei", "name": "rETH - Rocket Pool ETH", "symbol": "rETH", "image": "/images/assets/reth.svg", "decimals": 18, - "transfer_fee": 5.7e-05 + "transfer_fee": 2.9e-5 }, { "id": "arb-wei", @@ -192,6 +216,14 @@ "decimals": 18, "transfer_fee": 0.076 }, + { + "id": "op-wei", + "name": "OP - Optimism", + "symbol": "OP", + "image": "/images/assets/op.svg", + "decimals": 18, + "transfer_fee": 0.026 + }, { "id": "mpx-wei", "name": "MPX - MPX", @@ -344,6 +376,14 @@ "decimals": 6, "transfer_fee": 0.0083 }, + { + "id": "stutia", + "name": "stTIA - Stride Staked Tia", + "symbol": "stTIA", + "image": "/images/assets/sttia.svg", + "decimals": 6, + "transfer_fee": 0.0063 + }, { "id": "stkbnb-wei", "name": "stkBNB - Staked BNB", @@ -374,7 +414,7 @@ "symbol": "WAVAX", "image": "/images/assets/wavax.svg", "decimals": 18, - "transfer_fee": 0.01 + "transfer_fee": 0.003 }, { "id": "wglmr-wei", @@ -382,7 +422,7 @@ "symbol": "WGLMR", "image": "/images/assets/wglmr.svg", "decimals": 18, - "transfer_fee": 0.19 + "transfer_fee": 0.29 }, { "id": "wbnb-wei", @@ -390,7 +430,7 @@ "symbol": "WBNB", "image": "/images/assets/wbnb.svg", "decimals": 18, - "transfer_fee": 0.0004 + "transfer_fee": 0.00018 }, { "id": "wftm-wei", @@ -398,7 +438,7 @@ "symbol": "WFTM", "image": "/images/assets/wftm.svg", "decimals": 18, - "transfer_fee": 0.36 + "transfer_fee": 0.15 }, { "id": "uatom", @@ -462,7 +502,7 @@ "symbol": "LINK", "image": "/images/assets/link.svg", "decimals": 18, - "transfer_fee": 0.015 + "transfer_fee": 0.0074 }, { "id": "frax-wei", @@ -472,6 +512,14 @@ "decimals": 18, "transfer_fee": 0.1 }, + { + "id": "fpi-wei", + "name": "FPI - Frax Price Index", + "symbol": "FPI", + "image": "/images/assets/fpi.svg", + "decimals": 18, + "transfer_fee": 0.091 + }, { "id": "mkr-wei", "name": "MKR - Maker", @@ -534,7 +582,239 @@ "symbol": "YieldETH", "image": "/images/assets/yieldeth.svg", "decimals": 18, - "transfer_fee": 6.2e-05 + "transfer_fee": 6.2e-5 + }, + { + "id": "utori", + "name": "TORI - Teritori", + "symbol": "TORI", + "image": "/images/assets/tori.svg", + "decimals": 6, + "transfer_fee": 2.8 + }, + { + "id": "usdy-wei", + "name": "USDY - Ondo U.S. Dollar Yield", + "symbol": "USDY", + "image": "/images/assets/usdy.svg", + "decimals": 18, + "transfer_fee": 0.1 + }, + { + "id": "uhuahua", + "name": "HUAHUA - Chihuahua native asset", + "symbol": "HUAHUA", + "image": "/images/assets/huahua.svg", + "decimals": 6, + "transfer_fee": 430.0 + }, + { + "id": "factory/sei10hud5e5er4aul2l7sp2u9qp2lag5u4xf8mvyx38cnjvqhlgsrcls5qn5ke/seilor", + "name": "SEILOR - Axelar Wrapped SEILOR", + "symbol": "SEILOR", + "image": "/images/assets/seilor.svg", + "decimals": 6, + "transfer_fee": 1.7 + }, + { + "id": "uscrt", + "name": "SCRT - Secret native asset", + "symbol": "SCRT", + "image": "/images/assets/scrt.svg", + "decimals": 6, + "transfer_fee": 0.26 + }, + { + "id": "ox-wei", + "name": "OX - Open Exchange Token", + "symbol": "OX", + "image": "/images/assets/ox.svg", + "decimals": 18, + "transfer_fee": 5.0 + }, + { + "id": "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA", + "name": "milkTIA - milkTIA", + "symbol": "milkTIA", + "image": "/images/assets/milktia.svg", + "decimals": 6, + "transfer_fee": 0.0052 + }, + { + "id": "aISLM", + "name": "ISLM - Islamic Coin", + "symbol": "ISLM", + "image": "/images/assets/islm.svg", + "decimals": 18, + "transfer_fee": 1.2 + }, + { + "id": "wmnt-wei", + "name": "WMNT - Wrapped Mantle", + "symbol": "WMNT", + "image": "/images/assets/wmnt.svg", + "decimals": 18, + "transfer_fee": 0.16 + }, + { + "id": "ustars", + "name": "STARS - Axelar Wrapped STARS", + "symbol": "STARS", + "image": "/images/assets/stars.svg", + "decimals": 6, + "transfer_fee": 2.1 + }, + { + "id": "uc4e", + "name": "C4E - C4E native asset", + "symbol": "C4E", + "image": "/images/assets/c4e.svg", + "decimals": 6, + "transfer_fee": 1.7 + }, + { + "id": "yum-wei", + "name": "YUM - Yum", + "symbol": "YUM", + "image": "/images/assets/yum.svg", + "decimals": 18, + "transfer_fee": 2.5 + }, + { + "id": "unls", + "name": "NLS - NLS native asset", + "symbol": "NLS", + "image": "/images/assets/nls.svg", + "decimals": 6, + "transfer_fee": 2.5 + }, + { + "id": "metal-wei", + "name": "METAL - METAL", + "symbol": "METAL", + "image": "/images/assets/metal.svg", + "decimals": 18, + "transfer_fee": 2.7 + }, + { + "id": "mee-wei", + "name": "MEE - MEE Governance Token", + "symbol": "MEE", + "image": "/images/assets/mee.svg", + "decimals": 18, + "transfer_fee": 4.2 + }, + { + "id": "uxprt", + "name": "XPRT - XPRT native asset", + "symbol": "XPRT", + "image": "/images/assets/xprt.svg", + "decimals": 6, + "transfer_fee": 0.42 + }, + { + "id": "nftl-wei", + "name": "NFTL - Nifty League", + "symbol": "NFTL", + "image": "/images/assets/nftl.svg", + "decimals": 18, + "transfer_fee": 50.0 + }, + { + "id": "arbitrum-weth-wei", + "name": "WETH - Wrapped Ether", + "symbol": "WETH", + "image": "/images/assets/weth.svg", + "decimals": 18, + "transfer_fee": 3.2e-5 + }, + { + "id": "base-weth-wei", + "name": "WETH - Wrapped Ether", + "symbol": "WETH", + "image": "/images/assets/weth.svg", + "decimals": 18, + "transfer_fee": 3.2e-5 + }, + { + "id": "polygon-weth-wei", + "name": "WETH - Wrapped Ether", + "symbol": "WETH", + "image": "/images/assets/weth.svg", + "decimals": 18, + "transfer_fee": 3.2e-5 + }, + { + "id": "ubtsg", + "name": "BTSG - BTSG native asset", + "symbol": "BTSG", + "image": "/images/assets/btsg.svg", + "decimals": 6, + "transfer_fee": 10.0 + }, + { + "id": "usaga", + "name": "SAGA - Axelar Wrapped SAGA", + "symbol": "SAGA", + "image": "/images/assets/saga.svg", + "decimals": 6, + "transfer_fee": 0.072 + }, + { + "id": "ulava", + "name": "LAVA - Axelar Wrapped LAVA", + "symbol": "LAVA", + "image": "/images/assets/lava.svg", + "decimals": 6, + "transfer_fee": 0.1 + }, + { + "id": "cbbtc-satoshi", + "name": "cbBTC - Coinbase Wrapped BTC", + "symbol": "cbBTC", + "image": "/images/assets/cbbtc.svg", + "decimals": 8, + "transfer_fee": 1.7e-06 + }, + { + "id": "fbtc-satoshi", + "name": "FBTC - Fire Bitcoin", + "symbol": "FBTC", + "image": "/images/assets/fbtc.svg", + "decimals": 8, + "transfer_fee": 1.7e-06 + }, + { + "id": "lbtc-satoshi", + "name": "LBTC - Lombard Staked Bitcoin", + "symbol": "LBTC", + "image": "/images/assets/lbtc.svg", + "decimals": 8, + "transfer_fee": 1.7e-06 + }, + { + "id": "arbitrum-uusdt", + "name": "USDT - Tether USD", + "symbol": "USDT", + "image": "/images/assets/usdt.svg", + "decimals": 6, + "transfer_fee": 0.1 + }, + { + "id": "polygon-uusdt", + "name": "USDT - (PoS) Tether USD", + "symbol": "USDT", + "image": "/images/assets/usdt.svg", + "decimals": 6, + "transfer_fee": 0.1 + }, + { + "id": "optimism-uusdt", + "name": "USDT - Tether USD", + "symbol": "USDT", + "image": "/images/assets/usdt.svg", + "decimals": 6, + "transfer_fee": 0.1 } ], "testnet": [ @@ -560,7 +840,15 @@ "symbol": "wstETH", "image": "/images/assets/wsteth.svg", "decimals": 18, - "transfer_fee": 3e-05 + "transfer_fee": 3e-5 + }, + { + "id": "sepolia-wsteth-wei", + "name": "wstETH - Wrapped liquid staked Ether 2.0", + "symbol": "wstETH", + "image": "/images/assets/wsteth.svg", + "decimals": 18, + "transfer_fee": 3e-5 }, { "id": "celo-wei", @@ -570,14 +858,6 @@ "decimals": 18, "transfer_fee": 0.07 }, - { - "id": "eth-wei", - "name": "WETH - Wrapped Ether", - "symbol": "WETH", - "image": "/images/assets/weth.svg", - "decimals": 18, - "transfer_fee": 3e-05 - }, { "id": "wmatic-wei", "name": "WMATIC - Wrapped Matic", @@ -617,6 +897,54 @@ "image": "/images/assets/wdev.svg", "decimals": 18, "transfer_fee": 0.02 + }, + { + "id": "utsaga", + "name": "TSAGA - Axelar Wrapped TSAGA", + "symbol": "TSAGA", + "image": "/images/assets/tsaga.svg", + "decimals": 6, + "transfer_fee": 0.5 + }, + { + "id": "uxion", + "name": "XION - Xion", + "symbol": "XION", + "image": "/images/assets/xion.svg", + "decimals": 6, + "transfer_fee": 5.0 + }, + { + "id": "uc4e", + "name": "C4E - chain4energy native asset", + "symbol": "C4E", + "image": "/images/assets/c4e.svg", + "decimals": 6, + "transfer_fee": 5.0 + }, + { + "id": "untrn", + "name": "NTRN - Axelar Wrapped NTRN", + "symbol": "NTRN", + "image": "/images/assets/ntrn.svg", + "decimals": 6, + "transfer_fee": 0.03 + }, + { + "id": "nftl-wei", + "name": "NFTL - Nifty League", + "symbol": "NFTL", + "image": "/images/assets/nftl.svg", + "decimals": 18, + "transfer_fee": 20.0 + }, + { + "id": "sepolia-weth-wei", + "name": "WETH - Wrapped Ether", + "symbol": "WETH", + "image": "/images/assets/weth.svg", + "decimals": 18, + "transfer_fee": 3e-05 } ] -} \ No newline at end of file +} diff --git a/src/data/ibc_channels.json b/src/data/ibc_channels.json index 42f4d32f2..c455ef681 100644 --- a/src/data/ibc_channels.json +++ b/src/data/ibc_channels.json @@ -1,15 +1,5 @@ { "mainnet": [ - { - "from": "acrechain", - "to": "axelarnet", - "channel_id": "channel-5" - }, - { - "from": "axelarnet", - "to": "acrechain", - "channel_id": "channel-51" - }, { "from": "agoric", "to": "axelarnet", @@ -31,14 +21,24 @@ "channel_id": "channel-111" }, { - "from": "aura", + "from": "bitsong", "to": "axelarnet", - "channel_id": "channel-4" + "channel_id": "channel-30" }, { "from": "axelarnet", - "to": "aura", - "channel_id": "channel-104" + "to": "bitsong", + "channel_id": "channel-145" + }, + { + "from": "c4e", + "to": "axelarnet", + "channel_id": "channel-0" + }, + { + "from": "axelarnet", + "to": "c4e", + "channel_id": "channel-141" }, { "from": "carbon", @@ -60,6 +60,16 @@ "to": "celestia", "channel_id": "channel-125" }, + { + "from": "chihuahua", + "to": "axelarnet", + "channel_id": "channel-78" + }, + { + "from": "axelarnet", + "to": "chihuahua", + "channel_id": "channel-135" + }, { "from": "comdex", "to": "axelarnet", @@ -90,6 +100,16 @@ "to": "crescent", "channel_id": "channel-7" }, + { + "from": "dymension", + "to": "axelarnet", + "channel_id": "channel-5" + }, + { + "from": "axelarnet", + "to": "dymension", + "channel_id": "channel-138" + }, { "from": "evmos", "to": "axelarnet", @@ -170,6 +190,16 @@ "to": "kujira", "channel_id": "channel-14" }, + { + "from": "lava", + "to": "axelarnet", + "channel_id": "channel-0" + }, + { + "from": "axelarnet", + "to": "lava", + "channel_id": "channel-156" + }, { "from": "migaloo", "to": "axelarnet", @@ -190,6 +220,26 @@ "to": "neutron", "channel_id": "channel-78" }, + { + "from": "nolus", + "to": "axelarnet", + "channel_id": "channel-10177" + }, + { + "from": "axelarnet", + "to": "nolus", + "channel_id": "channel-143" + }, + { + "from": "ojo", + "to": "axelarnet", + "channel_id": "channel-1" + }, + { + "from": "axelarnet", + "to": "ojo", + "channel_id": "channel-144" + }, { "from": "osmosis", "to": "axelarnet", @@ -240,6 +290,16 @@ "to": "regen", "channel_id": "channel-29" }, + { + "from": "saga", + "to": "axelarnet", + "channel_id": "channel-24" + }, + { + "from": "axelarnet", + "to": "saga", + "channel_id": "channel-146" + }, { "from": "secret-snip", "to": "axelarnet", @@ -300,16 +360,6 @@ "to": "teritori", "channel_id": "channel-122" }, - { - "from": "terra", - "to": "axelarnet", - "channel_id": "channel-6" - }, - { - "from": "axelarnet", - "to": "terra", - "channel_id": "channel-11" - }, { "from": "terraclassic", "to": "axelarnet", @@ -339,6 +389,26 @@ "from": "axelarnet", "to": "xpla", "channel_id": "channel-49" + }, + { + "from": "mantra", + "to": "axelarnet", + "channel_id": "channel-6" + }, + { + "from": "axelarnet", + "to": "mantra", + "channel_id": "channel-170" + }, + { + "from": "babylon", + "to": "axelarnet", + "channel_id": "channel-2" + }, + { + "from": "axelarnet", + "to": "babylon", + "channel_id": "channel-175" } ], "testnet": [ @@ -382,6 +452,26 @@ "to": "celestia", "channel_id": "channel-341" }, + { + "from": "chain4energy", + "to": "axelarnet", + "channel_id": "channel-3" + }, + { + "from": "axelarnet", + "to": "chain4energy", + "channel_id": "channel-405" + }, + { + "from": "dymension", + "to": "axelarnet", + "channel_id": "channel-0" + }, + { + "from": "axelarnet", + "to": "dymension", + "channel_id": "channel-400" + }, { "from": "elys", "to": "axelarnet", @@ -442,6 +532,16 @@ "to": "kujira", "channel_id": "channel-19" }, + { + "from": "lava", + "to": "axelarnet", + "channel_id": "channel-4" + }, + { + "from": "axelarnet", + "to": "lava", + "channel_id": "channel-444" + }, { "from": "neutron", "to": "axelarnet", @@ -452,6 +552,26 @@ "to": "neutron", "channel_id": "channel-237" }, + { + "from": "nibiru", + "to": "axelarnet", + "channel_id": "channel-1" + }, + { + "from": "axelarnet", + "to": "nibiru", + "channel_id": "channel-382" + }, + { + "from": "nillion", + "to": "axelarnet", + "channel_id": "channel-2" + }, + { + "from": "axelarnet", + "to": "nillion", + "channel_id": "channel-510" + }, { "from": "odin", "to": "axelarnet", @@ -532,15 +652,25 @@ "to": "sei", "channel_id": "channel-257" }, + { + "from": "sommelier", + "to": "axelarnet", + "channel_id": "channel-3" + }, + { + "from": "axelarnet", + "to": "sommelier", + "channel_id": "channel-420" + }, { "from": "teritori", "to": "axelarnet", - "channel_id": "channel-36" + "channel_id": "channel-0" }, { "from": "axelarnet", "to": "teritori", - "channel_id": "channel-294" + "channel_id": "channel-406" }, { "from": "terra", @@ -552,6 +682,16 @@ "to": "terra", "channel_id": "channel-84" }, + { + "from": "warden", + "to": "axelarnet", + "channel_id": "channel-1" + }, + { + "from": "axelarnet", + "to": "warden", + "channel_id": "channel-502" + }, { "from": "xpla", "to": "axelarnet", @@ -562,6 +702,16 @@ "to": "xpla", "channel_id": "channel-108" }, + { + "from": "fxcore", + "to": "axelarnet", + "channel_id": "channel-127" + }, + { + "from": "axelarnet", + "to": "fxcore", + "channel_id": "channel-398" + }, { "from": "provenance", "to": "axelarnet", @@ -571,6 +721,26 @@ "from": "axelarnet", "to": "provenance", "channel_id": "channel-280" + }, + { + "from": "mantra", + "to": "axelarnet", + "channel_id": "channel-6" + }, + { + "from": "axelarnet", + "to": "mantra", + "channel_id": "channel-170" + }, + { + "from": "zigchain", + "to": "axelarnet", + "channel_id": "channel-1" + }, + { + "from": "axelarnet", + "to": "zigchain", + "channel_id": "channel-597" } ] -} \ No newline at end of file +} diff --git a/src/data/keplr/mainnet/crescent.json b/src/data/keplr/mainnet/crescent.json index 985ad8e19..09b115123 100644 --- a/src/data/keplr/mainnet/crescent.json +++ b/src/data/keplr/mainnet/crescent.json @@ -1,46 +1,42 @@ { - "rpc": "https://mainnet.crescent.network:26657/", - "rest": "https://mainnet.crescent.network:1317/", - "chainId": "crescent-1", - "chainName": "Crescent Mainnet", - "stakeCurrency": { - "coinDenom": "CRE", - "coinMinimalDenom": "ucre", - "coinDecimals": 6 - }, - "bech32Config": { - "bech32PrefixAccAddr": "cre", - "bech32PrefixAccPub": "crepub", - "bech32PrefixValAddr": "crevaloper", - "bech32PrefixValPub": "crevaloperpub", - "bech32PrefixConsAddr": "crevalcons", - "bech32PrefixConsPub": "crevalconspub" - }, - "bip44": { - "coinType": 118 - }, - "currencies": [ - { - "coinDenom": "CRE", - "coinMinimalDenom": "ucre", - "coinDecimals": 6 - } - ], - "feeCurrencies": [ - { - "coinDenom": "CRE", - "coinMinimalDenom": "ucre", - "coinDecimals": 6 - } - ], - "gasPriceStep": { - "low": 1, - "average": 1, - "high": 1 - }, - "features": [ - "stargate", - "no-legacy-stdTx", - "ibc-transfer" - ] -} \ No newline at end of file + "rpc": "https://mainnet.crescent.network:26657/", + "rest": "https://mainnet.crescent.network:1317/", + "chainId": "crescent-1", + "chainName": "Crescent Mainnet", + "stakeCurrency": { + "coinDenom": "CRE", + "coinMinimalDenom": "ucre", + "coinDecimals": 6 + }, + "bech32Config": { + "bech32PrefixAccAddr": "cre", + "bech32PrefixAccPub": "crepub", + "bech32PrefixValAddr": "crevaloper", + "bech32PrefixValPub": "crevaloperpub", + "bech32PrefixConsAddr": "crevalcons", + "bech32PrefixConsPub": "crevalconspub" + }, + "bip44": { + "coinType": 118 + }, + "currencies": [ + { + "coinDenom": "CRE", + "coinMinimalDenom": "ucre", + "coinDecimals": 6 + } + ], + "feeCurrencies": [ + { + "coinDenom": "CRE", + "coinMinimalDenom": "ucre", + "coinDecimals": 6 + } + ], + "gasPriceStep": { + "low": 1, + "average": 1, + "high": 1 + }, + "features": ["stargate", "no-legacy-stdTx", "ibc-transfer"] +} diff --git a/src/data/keplr/mainnet/injective.json b/src/data/keplr/mainnet/injective.json index 8368c4c99..7b18ac2a4 100644 --- a/src/data/keplr/mainnet/injective.json +++ b/src/data/keplr/mainnet/injective.json @@ -1,46 +1,42 @@ { - "rpc": "https://tm.injective.network/", - "rest": "https://lcd.injective.network/", - "chainId": "injective-1", - "chainName": "Injective Mainnet", - "stakeCurrency": { - "coinDenom": "INJ", - "coinMinimalDenom": "uinj", - "coinDecimals": 6 - }, - "bech32Config": { - "bech32PrefixAccAddr": "inj", - "bech32PrefixAccPub": "injpub", - "bech32PrefixValAddr": "injvaloper", - "bech32PrefixValPub": "injvaloperpub", - "bech32PrefixConsAddr": "injvalcons", - "bech32PrefixConsPub": "injvalconspub" - }, - "bip44": { - "coinType": 118 - }, - "currencies": [ - { - "coinDenom": "INJ", - "coinMinimalDenom": "uinj", - "coinDecimals": 6 - } - ], - "feeCurrencies": [ - { - "coinDenom": "INJ", - "coinMinimalDenom": "uinj", - "coinDecimals": 6 - } - ], - "gasPriceStep": { - "low": 5000000000, - "average": 25000000000, - "high": 40000000000 - }, - "features": [ - "stargate", - "no-legacy-stdTx", - "ibc-transfer" - ] -} \ No newline at end of file + "rpc": "https://tm.injective.network/", + "rest": "https://lcd.injective.network/", + "chainId": "injective-1", + "chainName": "Injective Mainnet", + "stakeCurrency": { + "coinDenom": "INJ", + "coinMinimalDenom": "uinj", + "coinDecimals": 6 + }, + "bech32Config": { + "bech32PrefixAccAddr": "inj", + "bech32PrefixAccPub": "injpub", + "bech32PrefixValAddr": "injvaloper", + "bech32PrefixValPub": "injvaloperpub", + "bech32PrefixConsAddr": "injvalcons", + "bech32PrefixConsPub": "injvalconspub" + }, + "bip44": { + "coinType": 118 + }, + "currencies": [ + { + "coinDenom": "INJ", + "coinMinimalDenom": "uinj", + "coinDecimals": 6 + } + ], + "feeCurrencies": [ + { + "coinDenom": "INJ", + "coinMinimalDenom": "uinj", + "coinDecimals": 6 + } + ], + "gasPriceStep": { + "low": 5000000000, + "average": 25000000000, + "high": 40000000000 + }, + "features": ["stargate", "no-legacy-stdTx", "ibc-transfer"] +} diff --git a/src/data/keplr/mainnet/kujira.json b/src/data/keplr/mainnet/kujira.json index c91eb6f8c..66bb17959 100644 --- a/src/data/keplr/mainnet/kujira.json +++ b/src/data/keplr/mainnet/kujira.json @@ -1,46 +1,42 @@ { - "rpc": "https://rpc.kaiyo.kujira.setten.io/", - "rest": "https://lcd.kaiyo.kujira.setten.io/", - "chainId": "kaiyo-1", - "chainName": "Kujira Mainnet", - "stakeCurrency": { - "coinDenom": "KUJI", - "coinMinimalDenom": "ukuji", - "coinDecimals": 6 - }, - "bech32Config": { - "bech32PrefixAccAddr": "kujira", - "bech32PrefixAccPub": "kujirapub", - "bech32PrefixValAddr": "kujiravaloper", - "bech32PrefixValPub": "kujiravaloperpub", - "bech32PrefixConsAddr": "kujiravalcons", - "bech32PrefixConsPub": "kujiravalconspub" - }, - "bip44": { - "coinType": 118 - }, - "currencies": [ - { - "coinDenom": "KUJI", - "coinMinimalDenom": "ukuji", - "coinDecimals": 6 - } - ], - "feeCurrencies": [ - { - "coinDenom": "KUJI", - "coinMinimalDenom": "ukuji", - "coinDecimals": 6 - } - ], - "gasPriceStep": { - "low": 0.01, - "average": 0.025, - "high": 0.03 - }, - "features": [ - "stargate", - "no-legacy-stdTx", - "ibc-transfer" - ] -} \ No newline at end of file + "rpc": "https://rpc.kaiyo.kujira.setten.io/", + "rest": "https://lcd.kaiyo.kujira.setten.io/", + "chainId": "kaiyo-1", + "chainName": "Kujira Mainnet", + "stakeCurrency": { + "coinDenom": "KUJI", + "coinMinimalDenom": "ukuji", + "coinDecimals": 6 + }, + "bech32Config": { + "bech32PrefixAccAddr": "kujira", + "bech32PrefixAccPub": "kujirapub", + "bech32PrefixValAddr": "kujiravaloper", + "bech32PrefixValPub": "kujiravaloperpub", + "bech32PrefixConsAddr": "kujiravalcons", + "bech32PrefixConsPub": "kujiravalconspub" + }, + "bip44": { + "coinType": 118 + }, + "currencies": [ + { + "coinDenom": "KUJI", + "coinMinimalDenom": "ukuji", + "coinDecimals": 6 + } + ], + "feeCurrencies": [ + { + "coinDenom": "KUJI", + "coinMinimalDenom": "ukuji", + "coinDecimals": 6 + } + ], + "gasPriceStep": { + "low": 0.01, + "average": 0.025, + "high": 0.03 + }, + "features": ["stargate", "no-legacy-stdTx", "ibc-transfer"] +} diff --git a/src/data/keplr/mainnet/terra.json b/src/data/keplr/mainnet/terra.json index 26e0f0e3b..6c489a223 100644 --- a/src/data/keplr/mainnet/terra.json +++ b/src/data/keplr/mainnet/terra.json @@ -1,46 +1,42 @@ { - "rpc": "https://phoenix-rpc.terra.dev/", - "rest": "https://phoenix-lcd.terra.dev/", - "chainId": "phoenix-1", - "chainName": "Terra 2.0 Mainnet", - "stakeCurrency": { - "coinDenom": "LUNA", - "coinMinimalDenom": "uluna", - "coinDecimals": 6 - }, - "bech32Config": { - "bech32PrefixAccAddr": "terra", - "bech32PrefixAccPub": "terrapub", - "bech32PrefixValAddr": "terravaloper", - "bech32PrefixValPub": "terravaloperpub", - "bech32PrefixConsAddr": "terravalcons", - "bech32PrefixConsPub": "terravalconspub" - }, - "bip44": { - "coinType": 330 - }, - "currencies": [ - { - "coinDenom": "LUNA", - "coinMinimalDenom": "uluna", - "coinDecimals": 6 - } - ], - "feeCurrencies": [ - { - "coinDenom": "LUNA", - "coinMinimalDenom": "uluna", - "coinDecimals": 6 - } - ], - "gasPriceStep": { - "low": 0.05, - "average": 0.125, - "high": 0.2 - }, - "features": [ - "stargate", - "no-legacy-stdTx", - "ibc-transfer" - ] -} \ No newline at end of file + "rpc": "https://phoenix-rpc.terra.dev/", + "rest": "https://phoenix-lcd.terra.dev/", + "chainId": "phoenix-1", + "chainName": "Terra 2.0 Mainnet", + "stakeCurrency": { + "coinDenom": "LUNA", + "coinMinimalDenom": "uluna", + "coinDecimals": 6 + }, + "bech32Config": { + "bech32PrefixAccAddr": "terra", + "bech32PrefixAccPub": "terrapub", + "bech32PrefixValAddr": "terravaloper", + "bech32PrefixValPub": "terravaloperpub", + "bech32PrefixConsAddr": "terravalcons", + "bech32PrefixConsPub": "terravalconspub" + }, + "bip44": { + "coinType": 330 + }, + "currencies": [ + { + "coinDenom": "LUNA", + "coinMinimalDenom": "uluna", + "coinDecimals": 6 + } + ], + "feeCurrencies": [ + { + "coinDenom": "LUNA", + "coinMinimalDenom": "uluna", + "coinDecimals": 6 + } + ], + "gasPriceStep": { + "low": 0.05, + "average": 0.125, + "high": 0.2 + }, + "features": ["stargate", "no-legacy-stdTx", "ibc-transfer"] +} diff --git a/src/data/keplr/testnet/axelar.json b/src/data/keplr/testnet/axelar.json index 34493ad07..c1c1a6610 100644 --- a/src/data/keplr/testnet/axelar.json +++ b/src/data/keplr/testnet/axelar.json @@ -1,47 +1,43 @@ { - "rpc": "https://axelartest-rpc.quickapi.com/", - "rest": "https://axelartest-lcd.quickapi.com/", - "chainId": "axelar-testnet-lisbon-3", - "chainName": "Axelar Lisbon 3", - "stakeCurrency": { - "coinDenom": "AXL", - "coinMinimalDenom": "uaxl", - "coinDecimals": 6 - }, - "walletUrlForStaking": "https://www.testnet.keplr.app/#/axelar/stake", - "bech32Config": { - "bech32PrefixAccAddr": "axelar", - "bech32PrefixAccPub": "axelarpub", - "bech32PrefixValAddr": "axelarvaloper", - "bech32PrefixValPub": "axelarvaloperpub", - "bech32PrefixConsAddr": "axelarvalcons", - "bech32PrefixConsPub": "axelarvalconspub" - }, - "bip44": { - "coinType": 118 - }, - "currencies": [ - { - "coinDenom": "AXL", - "coinMinimalDenom": "uaxl", - "coinDecimals": 6 - } - ], - "feeCurrencies": [ - { - "coinDenom": "AXL", - "coinMinimalDenom": "uaxl", - "coinDecimals": 6 - } - ], - "gasPriceStep": { - "low": 0.05, - "average": 0.125, - "high": 0.2 - }, - "features": [ - "stargate", - "no-legacy-stdTx", - "ibc-transfer" - ] -} \ No newline at end of file + "rpc": "https://axelartest-rpc.quickapi.com/", + "rest": "https://axelartest-lcd.quickapi.com/", + "chainId": "axelar-testnet-lisbon-3", + "chainName": "Axelar Lisbon 3", + "stakeCurrency": { + "coinDenom": "AXL", + "coinMinimalDenom": "uaxl", + "coinDecimals": 6 + }, + "walletUrlForStaking": "https://www.testnet.keplr.app/#/axelar/stake", + "bech32Config": { + "bech32PrefixAccAddr": "axelar", + "bech32PrefixAccPub": "axelarpub", + "bech32PrefixValAddr": "axelarvaloper", + "bech32PrefixValPub": "axelarvaloperpub", + "bech32PrefixConsAddr": "axelarvalcons", + "bech32PrefixConsPub": "axelarvalconspub" + }, + "bip44": { + "coinType": 118 + }, + "currencies": [ + { + "coinDenom": "AXL", + "coinMinimalDenom": "uaxl", + "coinDecimals": 6 + } + ], + "feeCurrencies": [ + { + "coinDenom": "AXL", + "coinMinimalDenom": "uaxl", + "coinDecimals": 6 + } + ], + "gasPriceStep": { + "low": 0.05, + "average": 0.125, + "high": 0.2 + }, + "features": ["stargate", "no-legacy-stdTx", "ibc-transfer"] +} diff --git a/src/data/keplr/testnet/crescent.json b/src/data/keplr/testnet/crescent.json index 499b8fa63..f49aaa773 100644 --- a/src/data/keplr/testnet/crescent.json +++ b/src/data/keplr/testnet/crescent.json @@ -1,46 +1,42 @@ { - "rpc": "https://testnet-endpoint.crescent.network/rpc/crescent", - "rest": "https://testnet-endpoint.crescent.network/api/crescent", - "chainId": "mooncat-1-1", - "chainName": "Crescent Testnet", - "stakeCurrency": { - "coinDenom": "CRE", - "coinMinimalDenom": "ucre", - "coinDecimals": 6 - }, - "bech32Config": { - "bech32PrefixAccAddr": "cre", - "bech32PrefixAccPub": "crepub", - "bech32PrefixValAddr": "crevaloper", - "bech32PrefixValPub": "crevaloperpub", - "bech32PrefixConsAddr": "crevalcons", - "bech32PrefixConsPub": "crevalconspub" - }, - "bip44": { - "coinType": 118 - }, - "currencies": [ - { - "coinDenom": "CRE", - "coinMinimalDenom": "ucre", - "coinDecimals": 6 - } - ], - "feeCurrencies": [ - { - "coinDenom": "CRE", - "coinMinimalDenom": "ucre", - "coinDecimals": 6 - } - ], - "gasPriceStep": { - "low": 1, - "average": 1, - "high": 1 - }, - "features": [ - "stargate", - "no-legacy-stdTx", - "ibc-transfer" - ] -} \ No newline at end of file + "rpc": "https://testnet-endpoint.crescent.network/rpc/crescent", + "rest": "https://testnet-endpoint.crescent.network/api/crescent", + "chainId": "mooncat-1-1", + "chainName": "Crescent Testnet", + "stakeCurrency": { + "coinDenom": "CRE", + "coinMinimalDenom": "ucre", + "coinDecimals": 6 + }, + "bech32Config": { + "bech32PrefixAccAddr": "cre", + "bech32PrefixAccPub": "crepub", + "bech32PrefixValAddr": "crevaloper", + "bech32PrefixValPub": "crevaloperpub", + "bech32PrefixConsAddr": "crevalcons", + "bech32PrefixConsPub": "crevalconspub" + }, + "bip44": { + "coinType": 118 + }, + "currencies": [ + { + "coinDenom": "CRE", + "coinMinimalDenom": "ucre", + "coinDecimals": 6 + } + ], + "feeCurrencies": [ + { + "coinDenom": "CRE", + "coinMinimalDenom": "ucre", + "coinDecimals": 6 + } + ], + "gasPriceStep": { + "low": 1, + "average": 1, + "high": 1 + }, + "features": ["stargate", "no-legacy-stdTx", "ibc-transfer"] +} diff --git a/src/data/keplr/testnet/evmos.json b/src/data/keplr/testnet/evmos.json index d137afe8a..879ca223a 100644 --- a/src/data/keplr/testnet/evmos.json +++ b/src/data/keplr/testnet/evmos.json @@ -1,49 +1,45 @@ { - "rpc": "https://tendermint.bd.evmos.dev:26657/", - "rest": "https://rest.bd.evmos.dev:1317/", - "chainId": "evmos_9000-4", - "chainName": "Evmos Testnet", - "stakeCurrency": { - "coinDenom": "EVMOS", - "coinMinimalDenom": "aevmos", - "coinDecimals": 18, - "coinGeckoId": "evmos" - }, - "bech32Config": { - "bech32PrefixAccAddr": "evmos", - "bech32PrefixAccPub": "evmospub", - "bech32PrefixValAddr": "evmosvaloper", - "bech32PrefixValPub": "evmosvaloperpub", - "bech32PrefixConsAddr": "evmosvalcons", - "bech32PrefixConsPub": "evmosvalconspub" - }, - "bip44": { - "coinType": 118 - }, - "currencies": [ - { - "coinDenom": "EVMOS", - "coinMinimalDenom": "aevmos", - "coinDecimals": 18, - "coinGeckoId": "evmos" - } - ], - "feeCurrencies": [ - { - "coinDenom": "EVMOS", - "coinMinimalDenom": "aevmos", - "coinDecimals": 18, - "coinGeckoId": "evmos" - } - ], - "gasPriceStep": { - "low": 25000000000, - "average": 25000000000, - "high": 40000000000 - }, - "features": [ - "stargate", - "no-legacy-stdTx", - "ibc-transfer" - ] -} \ No newline at end of file + "rpc": "https://tendermint.bd.evmos.dev:26657/", + "rest": "https://rest.bd.evmos.dev:1317/", + "chainId": "evmos_9000-4", + "chainName": "Evmos Testnet", + "stakeCurrency": { + "coinDenom": "EVMOS", + "coinMinimalDenom": "aevmos", + "coinDecimals": 18, + "coinGeckoId": "evmos" + }, + "bech32Config": { + "bech32PrefixAccAddr": "evmos", + "bech32PrefixAccPub": "evmospub", + "bech32PrefixValAddr": "evmosvaloper", + "bech32PrefixValPub": "evmosvaloperpub", + "bech32PrefixConsAddr": "evmosvalcons", + "bech32PrefixConsPub": "evmosvalconspub" + }, + "bip44": { + "coinType": 118 + }, + "currencies": [ + { + "coinDenom": "EVMOS", + "coinMinimalDenom": "aevmos", + "coinDecimals": 18, + "coinGeckoId": "evmos" + } + ], + "feeCurrencies": [ + { + "coinDenom": "EVMOS", + "coinMinimalDenom": "aevmos", + "coinDecimals": 18, + "coinGeckoId": "evmos" + } + ], + "gasPriceStep": { + "low": 25000000000, + "average": 25000000000, + "high": 40000000000 + }, + "features": ["stargate", "no-legacy-stdTx", "ibc-transfer"] +} diff --git a/src/data/keplr/testnet/fetch.json b/src/data/keplr/testnet/fetch.json index 05babd878..bf1caa40e 100644 --- a/src/data/keplr/testnet/fetch.json +++ b/src/data/keplr/testnet/fetch.json @@ -1,46 +1,42 @@ { - "rpc": "https://rpc-dorado.fetch.ai/", - "rest": "https://rest-dorado.fetch.ai/", - "chainId": "dorado-1", - "chainName": "FetchHub Testnet", - "stakeCurrency": { - "coinDenom": "FET", - "coinMinimalDenom": "atestfet", - "coinDecimals": 18 - }, - "bech32Config": { - "bech32PrefixAccAddr": "fetch", - "bech32PrefixAccPub": "fetchpub", - "bech32PrefixValAddr": "fetchvaloper", - "bech32PrefixValPub": "fetchvaloperpub", - "bech32PrefixConsAddr": "fetchvalcons", - "bech32PrefixConsPub": "fetchvalconspub" - }, - "bip44": { - "coinType": 118 - }, - "currencies": [ - { - "coinDenom": "FET", - "coinMinimalDenom": "atestfet", - "coinDecimals": 18 - } - ], - "feeCurrencies": [ - { - "coinDenom": "FET", - "coinMinimalDenom": "atestfet", - "coinDecimals": 18 - } - ], - "gasPriceStep": { - "low": 0, - "average": 5000000000, - "high": 6250000000 - }, - "features": [ - "stargate", - "no-legacy-stdTx", - "ibc-transfer" - ] -} \ No newline at end of file + "rpc": "https://rpc-dorado.fetch.ai/", + "rest": "https://rest-dorado.fetch.ai/", + "chainId": "dorado-1", + "chainName": "FetchHub Testnet", + "stakeCurrency": { + "coinDenom": "FET", + "coinMinimalDenom": "atestfet", + "coinDecimals": 18 + }, + "bech32Config": { + "bech32PrefixAccAddr": "fetch", + "bech32PrefixAccPub": "fetchpub", + "bech32PrefixValAddr": "fetchvaloper", + "bech32PrefixValPub": "fetchvaloperpub", + "bech32PrefixConsAddr": "fetchvalcons", + "bech32PrefixConsPub": "fetchvalconspub" + }, + "bip44": { + "coinType": 118 + }, + "currencies": [ + { + "coinDenom": "FET", + "coinMinimalDenom": "atestfet", + "coinDecimals": 18 + } + ], + "feeCurrencies": [ + { + "coinDenom": "FET", + "coinMinimalDenom": "atestfet", + "coinDecimals": 18 + } + ], + "gasPriceStep": { + "low": 0, + "average": 5000000000, + "high": 6250000000 + }, + "features": ["stargate", "no-legacy-stdTx", "ibc-transfer"] +} diff --git a/src/data/keplr/testnet/kujira.json b/src/data/keplr/testnet/kujira.json index 0642664cb..1f496a103 100644 --- a/src/data/keplr/testnet/kujira.json +++ b/src/data/keplr/testnet/kujira.json @@ -1,46 +1,42 @@ { - "rpc": "https://rpc-harpoon.kujira.app/", - "rest": "https://lcd-harpoon.kujira.app/", - "chainId": "harpoon-4", - "chainName": "Kujira Testnet", - "stakeCurrency": { - "coinDenom": "KUJI", - "coinMinimalDenom": "ukuji", - "coinDecimals": 6 - }, - "bech32Config": { - "bech32PrefixAccAddr": "kujira", - "bech32PrefixAccPub": "kujirapub", - "bech32PrefixValAddr": "kujiravaloper", - "bech32PrefixValPub": "kujiravaloperpub", - "bech32PrefixConsAddr": "kujiravalcons", - "bech32PrefixConsPub": "kujiravalconspub" - }, - "bip44": { - "coinType": 118 - }, - "currencies": [ - { - "coinDenom": "KUJI", - "coinMinimalDenom": "ukuji", - "coinDecimals": 6 - } - ], - "feeCurrencies": [ - { - "coinDenom": "KUJI", - "coinMinimalDenom": "ukuji", - "coinDecimals": 6 - } - ], - "gasPriceStep": { - "low": 0.05, - "average": 0.125, - "high": 0.2 - }, - "features": [ - "stargate", - "no-legacy-stdTx", - "ibc-transfer" - ] -} \ No newline at end of file + "rpc": "https://rpc-harpoon.kujira.app/", + "rest": "https://lcd-harpoon.kujira.app/", + "chainId": "harpoon-4", + "chainName": "Kujira Testnet", + "stakeCurrency": { + "coinDenom": "KUJI", + "coinMinimalDenom": "ukuji", + "coinDecimals": 6 + }, + "bech32Config": { + "bech32PrefixAccAddr": "kujira", + "bech32PrefixAccPub": "kujirapub", + "bech32PrefixValAddr": "kujiravaloper", + "bech32PrefixValPub": "kujiravaloperpub", + "bech32PrefixConsAddr": "kujiravalcons", + "bech32PrefixConsPub": "kujiravalconspub" + }, + "bip44": { + "coinType": 118 + }, + "currencies": [ + { + "coinDenom": "KUJI", + "coinMinimalDenom": "ukuji", + "coinDecimals": 6 + } + ], + "feeCurrencies": [ + { + "coinDenom": "KUJI", + "coinMinimalDenom": "ukuji", + "coinDecimals": 6 + } + ], + "gasPriceStep": { + "low": 0.05, + "average": 0.125, + "high": 0.2 + }, + "features": ["stargate", "no-legacy-stdTx", "ibc-transfer"] +} diff --git a/src/data/keplr/testnet/osmosis.json b/src/data/keplr/testnet/osmosis.json index c9800e2a2..e20ce68b2 100644 --- a/src/data/keplr/testnet/osmosis.json +++ b/src/data/keplr/testnet/osmosis.json @@ -1,46 +1,42 @@ { - "rpc": "https://testnet-rpc.osmosis.zone/", - "rest": "https://testnet-rest.osmosis.zone/", - "chainId": "osmo-test-4", - "chainName": "Osmosis Testnet", - "stakeCurrency": { - "coinDenom": "OSMO", - "coinMinimalDenom": "uosmo", - "coinDecimals": 6 - }, - "bech32Config": { - "bech32PrefixAccAddr": "osmo", - "bech32PrefixAccPub": "osmopub", - "bech32PrefixValAddr": "osmovaloper", - "bech32PrefixValPub": "osmovaloperpub", - "bech32PrefixConsAddr": "osmovalcons", - "bech32PrefixConsPub": "osmovalconspub" - }, - "bip44": { - "coinType": 118 - }, - "currencies": [ - { - "coinDenom": "OSMO", - "coinMinimalDenom": "uosmo", - "coinDecimals": 6 - } - ], - "feeCurrencies": [ - { - "coinDenom": "OSMO", - "coinMinimalDenom": "uosmo", - "coinDecimals": 6 - } - ], - "gasPriceStep": { - "low": 0, - "average": 0, - "high": 0.025 - }, - "features": [ - "stargate", - "no-legacy-stdTx", - "ibc-transfer" - ] -} \ No newline at end of file + "rpc": "https://testnet-rpc.osmosis.zone/", + "rest": "https://testnet-rest.osmosis.zone/", + "chainId": "osmo-test-4", + "chainName": "Osmosis Testnet", + "stakeCurrency": { + "coinDenom": "OSMO", + "coinMinimalDenom": "uosmo", + "coinDecimals": 6 + }, + "bech32Config": { + "bech32PrefixAccAddr": "osmo", + "bech32PrefixAccPub": "osmopub", + "bech32PrefixValAddr": "osmovaloper", + "bech32PrefixValPub": "osmovaloperpub", + "bech32PrefixConsAddr": "osmovalcons", + "bech32PrefixConsPub": "osmovalconspub" + }, + "bip44": { + "coinType": 118 + }, + "currencies": [ + { + "coinDenom": "OSMO", + "coinMinimalDenom": "uosmo", + "coinDecimals": 6 + } + ], + "feeCurrencies": [ + { + "coinDenom": "OSMO", + "coinMinimalDenom": "uosmo", + "coinDecimals": 6 + } + ], + "gasPriceStep": { + "low": 0, + "average": 0, + "high": 0.025 + }, + "features": ["stargate", "no-legacy-stdTx", "ibc-transfer"] +} diff --git a/src/data/keplr/testnet/sei.json b/src/data/keplr/testnet/sei.json index 0b859e7c0..1b29c2003 100644 --- a/src/data/keplr/testnet/sei.json +++ b/src/data/keplr/testnet/sei.json @@ -1,46 +1,42 @@ { - "rpc": "https://rpc-sei-ia.notional.ventures/", - "rest": "https://sei-testnet-api.polkachu.com/", - "chainId": "atlantic-1", - "chainName": "Sei Testnet", - "stakeCurrency": { - "coinDenom": "SEI", - "coinMinimalDenom": "usei", - "coinDecimals": 6 - }, - "bech32Config": { - "bech32PrefixAccAddr": "sei", - "bech32PrefixAccPub": "seipub", - "bech32PrefixValAddr": "seivaloper", - "bech32PrefixValPub": "seivaloperpub", - "bech32PrefixConsAddr": "seivalcons", - "bech32PrefixConsPub": "seivalconspub" - }, - "bip44": { - "coinType": 118 - }, - "currencies": [ - { - "coinDenom": "SEI", - "coinMinimalDenom": "usei", - "coinDecimals": 6 - } - ], - "feeCurrencies": [ - { - "coinDenom": "SEI", - "coinMinimalDenom": "usei", - "coinDecimals": 6 - } - ], - "gasPriceStep": { - "low": 0.05, - "average": 0.125, - "high": 0.2 - }, - "features": [ - "stargate", - "no-legacy-stdTx", - "ibc-transfer" - ] -} \ No newline at end of file + "rpc": "https://rpc-sei-ia.notional.ventures/", + "rest": "https://sei-testnet-api.polkachu.com/", + "chainId": "atlantic-1", + "chainName": "Sei Testnet", + "stakeCurrency": { + "coinDenom": "SEI", + "coinMinimalDenom": "usei", + "coinDecimals": 6 + }, + "bech32Config": { + "bech32PrefixAccAddr": "sei", + "bech32PrefixAccPub": "seipub", + "bech32PrefixValAddr": "seivaloper", + "bech32PrefixValPub": "seivaloperpub", + "bech32PrefixConsAddr": "seivalcons", + "bech32PrefixConsPub": "seivalconspub" + }, + "bip44": { + "coinType": 118 + }, + "currencies": [ + { + "coinDenom": "SEI", + "coinMinimalDenom": "usei", + "coinDecimals": 6 + } + ], + "feeCurrencies": [ + { + "coinDenom": "SEI", + "coinMinimalDenom": "usei", + "coinDecimals": 6 + } + ], + "gasPriceStep": { + "low": 0.05, + "average": 0.125, + "high": 0.2 + }, + "features": ["stargate", "no-legacy-stdTx", "ibc-transfer"] +} diff --git a/src/data/keplr/testnet/terra.json b/src/data/keplr/testnet/terra.json index f9338cb4b..28f058178 100644 --- a/src/data/keplr/testnet/terra.json +++ b/src/data/keplr/testnet/terra.json @@ -1,46 +1,42 @@ { - "rpc": "https://pisco-rpc.terra.dev/", - "rest": "https://pisco-lcd.terra.dev/", - "chainId": "pisco-1", - "chainName": "Terra 2.0 Testnet", - "stakeCurrency": { - "coinDenom": "LUNA", - "coinMinimalDenom": "uluna", - "coinDecimals": 6 - }, - "bech32Config": { - "bech32PrefixAccAddr": "terra", - "bech32PrefixAccPub": "terrapub", - "bech32PrefixValAddr": "terravaloper", - "bech32PrefixValPub": "terravaloperpub", - "bech32PrefixConsAddr": "terravalcons", - "bech32PrefixConsPub": "terravalconspub" - }, - "bip44": { - "coinType": 330 - }, - "currencies": [ - { - "coinDenom": "LUNA", - "coinMinimalDenom": "uluna", - "coinDecimals": 6 - } - ], - "feeCurrencies": [ - { - "coinDenom": "LUNA", - "coinMinimalDenom": "uluna", - "coinDecimals": 6 - } - ], - "gasPriceStep": { - "low": 0.05, - "average": 0.125, - "high": 0.2 - }, - "features": [ - "stargate", - "no-legacy-stdTx", - "ibc-transfer" - ] -} \ No newline at end of file + "rpc": "https://pisco-rpc.terra.dev/", + "rest": "https://pisco-lcd.terra.dev/", + "chainId": "pisco-1", + "chainName": "Terra 2.0 Testnet", + "stakeCurrency": { + "coinDenom": "LUNA", + "coinMinimalDenom": "uluna", + "coinDecimals": 6 + }, + "bech32Config": { + "bech32PrefixAccAddr": "terra", + "bech32PrefixAccPub": "terrapub", + "bech32PrefixValAddr": "terravaloper", + "bech32PrefixValPub": "terravaloperpub", + "bech32PrefixConsAddr": "terravalcons", + "bech32PrefixConsPub": "terravalconspub" + }, + "bip44": { + "coinType": 330 + }, + "currencies": [ + { + "coinDenom": "LUNA", + "coinMinimalDenom": "uluna", + "coinDecimals": 6 + } + ], + "feeCurrencies": [ + { + "coinDenom": "LUNA", + "coinMinimalDenom": "uluna", + "coinDecimals": 6 + } + ], + "gasPriceStep": { + "low": 0.05, + "average": 0.125, + "high": 0.2 + }, + "features": ["stargate", "no-legacy-stdTx", "ibc-transfer"] +} diff --git a/src/data/non_evm_chains.json b/src/data/non_evm_chains.json new file mode 100644 index 000000000..e27e2fd34 --- /dev/null +++ b/src/data/non_evm_chains.json @@ -0,0 +1,46 @@ +{ + "mainnet": [ + { + "id": "sui", + "name": "Sui", + "network_id": "sui", + "provider_params": [ + { + "chainName": "Sui", + "nativeCurrency": { + "name": "Sui", + "symbol": "SUI", + "decimals": 9 + }, + "blockExplorerUrls": [ + "https://suiscan.xyz/mainnet", + "https://suivision.xyz/" + ] + } + ], + "image": "/images/chains/sui.jpg" + } + ], + "testnet": [ + { + "id": "sui", + "name": "Sui", + "network_id": "sui", + "provider_params": [ + { + "chainName": "Sui", + "nativeCurrency": { + "name": "Sui", + "symbol": "SUI", + "decimals": 9 + }, + "blockExplorerUrls": [ + "https://suiscan.xyz/testnet", + "https://testnet.suivision.xyz/" + ] + } + ], + "image": "/images/chains/sui.jpg" + } + ] +} diff --git a/src/data/resources.json b/src/data/resources.json index 46bb62539..99eac0330 100644 --- a/src/data/resources.json +++ b/src/data/resources.json @@ -60,11 +60,11 @@ "value": [ { "title": "Swagger 1", - "value": "https://lcd-axelar.imperator.co/static/swagger/" + "value": "https://lcd-axelar.imperator.co/static/" }, { "title": "Swagger 2", - "value": "https://lcd-axelar.stakerun.com/static/swagger/" + "value": "https://axelar-lcd.quickapi.com/static/" }, { "title": "OpenAPI 1", @@ -72,7 +72,7 @@ }, { "title": "OpenAPI 2", - "value": "https://lcd-axelar.stakerun.com/static/openapi/" + "value": "https://axelar-lcd.quickapi.com/static/openapi/" } ] }, @@ -80,7 +80,7 @@ "name": "RPC endpoints", "value": [ { - "value": "https://tm.axelar.lava.build/" + "value": "https://tm.axelar.lava.build/" }, { "value": "https://rpc-axelar.imperator.co/" @@ -98,28 +98,28 @@ "value": "https://axelar-rpc.staketab.org/" }, { - "value": "https://axelar.rpc.stake2.me/" + "value": "https://axelar.rpc.stake2.me/" }, { - "value": "https://axelar-rpc.qubelabs.io/" + "value": "https://axelar-rpc.qubelabs.io/" }, { "value": "https://axelar-mainnet-rpc.allthatnode.com:26657/" }, { - "value": "https://axelar-rpc.quantnode.tech/" + "value": "https://axelar-rpc.quantnode.tech/" }, { - "value": "https://axelar-rpc.polkachu.com/" + "value": "https://axelar-rpc.polkachu.com/" }, { - "value": "https://axelar-rpc.4sv.io/" + "value": "https://axelar-rpc.4sv.io/" }, { - "value": "https://axelar-rpc.validatrium.club/" + "value": "https://axelar-rpc.validatrium.club/" }, { - "value": "https://rpc-axelar.stakerun.com/" + "value": "https://rpc-axelar.stakerun.com/" } ] }, @@ -252,7 +252,7 @@ "name": "Websocket", "value": [ { - "value": "wss://tm.axelar.lava.build/" + "value": "wss://tm.axelar.lava.build/websocket" }, { "value": "ws://rpc-axelar.imperator.co/wss/websocket" @@ -312,7 +312,7 @@ "value": [ { "title": "Swagger", - "value": "https://lcd-axelar-testnet.imperator.co/static/swagger/" + "value": "https://lcd-axelar-testnet.imperator.co/static/" }, { "title": "OpenAPI", @@ -324,25 +324,25 @@ "name": "RPC endpoints", "value": [ { - "value": "https://tm.axelar-testnet.lava.build/" + "value": "https://tm.axelar-testnet.lava.build/" }, { "value": "https://rpc-axelar-testnet.imperator.co/" }, { - "value": "https://axelartest-rpc.quickapi.com/" + "value": "https://axelartest-rpc.quickapi.com/" }, { "value": "https://axelar-rpc-1.staketab.org/" }, { - "value": "https://axelar-testnet-rpc.qubelabs.io/" + "value": "https://axelar-testnet-rpc.qubelabs.io/" }, { "value": "https://axelar-lisbon-rpc.allthatnode.com:26657/" }, { - "value": "https://axelartest-rpc.quantnode.tech/" + "value": "https://axelartest-rpc.quantnode.tech/" } ] }, @@ -375,8 +375,8 @@ { "name": "gRPC endpoints", "value": [ - { - "value":"grpc.axelar-testnet.lava.build:443" + { + "value": "grpc.axelar-testnet.lava.build:443" }, { "value": "grpc-axelar-testnet.imperator.co:2062" @@ -407,7 +407,7 @@ "value": "wss://tm.axelar-testnet.lava.build/websocket" }, { - "value": "ws://rpc-axelar-testnet.imperator.co/wss" + "value": "ws://rpc-axelar-testnet.imperator.co/wss/websocket" } ] } diff --git a/src/data/tokens.json b/src/data/tokens.json index aac6eb233..6d657c00c 100644 --- a/src/data/tokens.json +++ b/src/data/tokens.json @@ -29,6 +29,13 @@ "is_native": false, "address": "ibc/45C87C0C3027BD5E5BBECF6A6BF8570857E555ABCB6689130AC90D391016AD17" }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/E3AB0DFDE9E782262B770C32DF94AC2A92B93DC4825376D6F6C874D3C877864E" + }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, @@ -43,13 +50,6 @@ "is_native": false, "address": "ibc/E0DAFC08CE018EB12427A35044AA3F375B30A2D31D528837FE7773F9DF0D2AEF" }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/E3AB0DFDE9E782262B770C32DF94AC2A92B93DC4825376D6F6C874D3C877864E" - }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, @@ -157,6 +157,13 @@ "is_native": false, "address": "ibc/301DAF9CB0A9E247CD478533EF0E21F48FF8118C4A51F77C8BC3EB70E5566DBC" }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/1B38805B1C75352B28169284F96DF56BDEBD9E8FAC005BDCC8CF0378C82AA8E7" + }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, @@ -171,13 +178,6 @@ "is_native": false, "address": "ibc/65CD60D7E37EF830BC6B6A6DF4E3E3884A96C0905A7D271C48DC0440B1989EC7" }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/1B38805B1C75352B28169284F96DF56BDEBD9E8FAC005BDCC8CF0378C82AA8E7" - }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, @@ -281,7 +281,7 @@ "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, @@ -299,12 +299,19 @@ "is_native": false, "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" }, - "pepe-wei": { - "symbol": "axlPEPE", + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + }, + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Pepe", + "name": "Wrapped Ether", "is_native": false, - "address": "0x13DF72A0F6824293F5324123cD356d9C4F827271" + "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" }, "wmai-wei": { "symbol": "axlWMAI", @@ -313,110 +320,110 @@ "is_native": false, "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" }, - "ukuji": { - "symbol": "KUJI", - "decimals": 6, - "name": null, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "0x3A18dcC9745eDcD1Ef33ecB93b0b6eBA5671e7Ca" + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" }, - "arb-wei": { - "symbol": "ARB", + "lqdr-wei": { + "symbol": "Lqdr", "decimals": 18, - "name": "Arbitrum", + "name": "LqdrV2", "is_native": true, - "address": "0x912CE59144191C1204E64559FE8253a0e49E6548" + "address": "0x816E21c33fa5F8440EBcDF6e01D39314541BEA72" }, - "stuatom": { - "symbol": "stATOM", - "decimals": 6, - "name": null, + "ern-wei": { + "symbol": "ERN", + "decimals": 18, + "name": "Ethos Reserve Note", "is_native": false, - "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" + "address": "0xa334884bF6b0A066d553D19e507315E839409e62" }, - "ustrd": { - "symbol": "STRD", - "decimals": 6, - "name": null, + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", "is_native": false, - "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F" + "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" }, - "uatom": { - "symbol": "axlATOM", + "ukuji": { + "symbol": "KUJI", "decimals": 6, - "name": "Cosmoshub staking ATOM", + "name": "Kujira native asset", "is_native": false, - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" + "address": "0x3A18dcC9745eDcD1Ef33ecB93b0b6eBA5671e7Ca" }, - "usomm": { - "symbol": "axlSOMM", - "decimals": 6, - "name": null, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", "is_native": false, - "address": "0x4e914bbDCDE0f455A8aC9d59d3bF739c46287Ed2" + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" }, - "frax-wei": { - "symbol": "axlFRAX", + "frxeth-wei": { + "symbol": "frxETH", "decimals": 18, - "name": "Frax", + "name": "Frax Ether", "is_native": false, - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D" }, - "wfil-wei": { - "symbol": "axlFIL", + "sfrax-wei": { + "symbol": "sFRAX", "decimals": 18, - "name": "Wrapped FIL", + "name": "Staked FRAX", "is_native": false, - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" }, - "yieldusd-wei": { - "symbol": "axlYieldUSD", + "fxs-wei": { + "symbol": "FXS", "decimals": 18, - "name": "Real Yield USD", + "name": "Frax Share", "is_native": false, - "address": "0x0cfD82F3910b3A5faf3a0417Fb0063953D6B911b" + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721" }, - "yieldeth-wei": { - "symbol": "axlYieldETH", + "arb-wei": { + "symbol": "ARB", "decimals": 18, - "name": "Real Yield ETH", - "is_native": false, - "address": "0xA9AF51A55F275503a3876077a08Ae6540835EF8C" + "name": "Arbitrum", + "is_native": true, + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548" }, - "ern-wei": { - "symbol": "ERN", + "bal-wei": { + "symbol": "axlBAL", "decimals": 18, - "name": "Ethos Reserve Note", + "name": "Balancer", "is_native": false, - "address": "0xa334884bF6b0A066d553D19e507315E839409e62" + "address": "0x11C1879227D463b60db18C17c20aE739aE8E961a" }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", + "ktc-wei": { + "symbol": "KTC", + "decimals": 18, + "name": "KTX Community Token", "is_native": false, - "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + "address": "0x01C5ED019A1Bc07d3A320a09C83C398d91f8fd5D" }, - "weth-wei": { - "symbol": "axlETH", + "ovn-wei": { + "symbol": "OVN", "decimals": 18, - "name": "Wrapped Ether", + "name": "OVN", "is_native": false, - "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" + "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396" }, - "lqdr-wei": { - "symbol": "Lqdr", + "vela-wei": { + "symbol": "VELA", "decimals": 18, - "name": "LqdrV2", + "name": "VelaToken", "is_native": true, - "address": "0x816E21c33fa5F8440EBcDF6e01D39314541BEA72" + "address": "0x088cd8f5eF3652623c22D48b1605DCfE860Cd704" }, - "wsteth-wei": { - "symbol": "axl-wstETH", + "arx-wei": { + "symbol": "ARX", "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", - "is_native": false, - "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" + "name": "ArbiDex Token", + "is_native": true, + "address": "0xD5954c3084a1cCd70B4dA011E67760B8e78aeE84" }, "oath-wei": { "symbol": "OATH", @@ -446,6 +453,13 @@ "is_native": false, "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" }, + "orbs-wei": { + "symbol": "ORBS", + "decimals": 18, + "name": "Orbs", + "is_native": false, + "address": "0xf3C091ed43de9c270593445163a41A876A0bb3dd" + }, "gdx-wei": { "symbol": "GDX", "decimals": 18, @@ -460,189 +474,329 @@ "is_native": true, "address": "0xDE5ed76E7c05eC5e4572CfC88d1ACEA165109E44" }, - "stern-wei": { - "symbol": "stERN", - "decimals": 18, - "name": "Staked ERN Vault", - "is_native": false, - "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" - }, - "orbs-wei": { - "symbol": "ORBS", - "decimals": 18, - "name": "Orbs", + "stuatom": { + "symbol": "stATOM", + "decimals": 6, + "name": "Stride Staked Atom", "is_native": false, - "address": "0xf3C091ed43de9c270593445163a41A876A0bb3dd" - }, - "vela-wei": { - "symbol": "VELA", - "decimals": 18, - "name": "VelaToken", - "is_native": true, - "address": "0x088cd8f5eF3652623c22D48b1605DCfE860Cd704" - }, - "arx-wei": { - "symbol": "ARX", - "decimals": 18, - "name": "ArbiDex Token", - "is_native": true, - "address": "0xD5954c3084a1cCd70B4dA011E67760B8e78aeE84" + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" }, - "ovn-wei": { - "symbol": "OVN", - "decimals": 18, - "name": "OVN", + "ustrd": { + "symbol": "STRD", + "decimals": 6, + "name": "Stride", "is_native": false, - "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396" + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F" }, - "bal-wei": { - "symbol": "axlBAL", - "decimals": 18, - "name": "Balancer", + "uatom": { + "symbol": "axlATOM", + "decimals": 6, + "name": "Cosmoshub staking ATOM", "is_native": false, - "address": "0x11C1879227D463b60db18C17c20aE739aE8E961a" + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" }, - "ktc-wei": { - "symbol": "KTC", - "decimals": 18, - "name": "KTX Community Token", + "usomm": { + "symbol": "axlSOMM", + "decimals": 6, + "name": "Axelar Wrapped SOMM", "is_native": false, - "address": "0x01C5ED019A1Bc07d3A320a09C83C398d91f8fd5D" + "address": "0x4e914bbDCDE0f455A8aC9d59d3bF739c46287Ed2" }, "utia": { "symbol": "axlTIA", "decimals": 6, - "name": null, + "name": "Axelar Wrapped TIA", "is_native": false, "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97" - } - }, - "assetmantle": { - "uusdc": { - "symbol": "axlUSDC", - "decimals": 6, - "name": "USD Coin", + }, + "pepe-wei": { + "symbol": "axlPEPE", + "decimals": 18, + "name": "Pepe", "is_native": false, - "address": "ibc/616E26A85AD20A3DDEAEBDDE7262E3BA9356C557BC15CACEA86768D7D51FA703" + "address": "0x13DF72A0F6824293F5324123cD356d9C4F827271" }, - "dai-wei": { - "symbol": "axlDAI", + "frax-wei": { + "symbol": "axlFRAX", "decimals": 18, - "name": "Dai Stablecoin", + "name": "Frax", "is_native": false, - "address": "ibc/E4C169A198288D55F756DA32B0EBF0B70C46F634261E288FA34217B7EB8E4947" + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" }, - "uusdt": { - "symbol": "axlUSDT", + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": false, + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f" + }, + "wfil-wei": { + "symbol": "axlFIL", + "decimals": 18, + "name": "Wrapped FIL", + "is_native": false, + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" + }, + "yieldusd-wei": { + "symbol": "axlYieldUSD", + "decimals": 18, + "name": "Real Yield USD", + "is_native": false, + "address": "0x0cfD82F3910b3A5faf3a0417Fb0063953D6B911b" + }, + "yieldeth-wei": { + "symbol": "axlYieldETH", + "decimals": 18, + "name": "Real Yield ETH", + "is_native": false, + "address": "0xA9AF51A55F275503a3876077a08Ae6540835EF8C" + }, + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", + "is_native": false, + "address": "0x809c55916bb542c1419724022B3F0162087E3C88" + }, + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", + "is_native": false, + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B" + }, + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", + "is_native": false, + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5" + }, + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", + "is_native": false, + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5" + }, + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", + "is_native": false, + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6" + }, + "aISLM": { + "symbol": "ISLM", + "decimals": 18, + "name": "Islamic Coin", + "is_native": false, + "address": "0x2a98d978817949D45a5528013850772E762B7F12" + }, + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", + "is_native": false, + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D" + }, + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", + "is_native": false, + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", + "is_native": false, + "address": "0x520391D410314451E12A85D79970a61915Bc315D" + }, + "yum-wei": { + "symbol": "YUM", + "decimals": 18, + "name": "Yum", + "is_native": false, + "address": "0x9F41b34f42058a7b74672055a5fae22c4b113Fd1" + }, + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", + "is_native": false, + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8" + }, + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7" + }, + "arbitrum-weth-wei": { + "symbol": "WETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": true, + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF" + }, + "arbitrum-uusdt": { + "symbol": "USDT", + "decimals": 6, + "name": "Tether USD", + "is_native": true, + "address": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9" + } + }, + "archway": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "ibc/B9E4FD154C92D3A23BEA029906C4C5FF2FE74CB7E3A058290B77197A263CF88B" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "ibc/172CEB45A4226AF4351EFD23D78D349AD686F1D015AC2152430A352A3362EB64" + }, + "uusdt": { + "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/EF1D13E950ADFB6D87A786383D6574529180E34D5EE29459BB578A2A553C21B9" + "address": "ibc/2801BC8CE5AC116A6D879A8ADB69D775068BD84CCBA04AA3D339F25C5270ABC5" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/366CBD559121EDAE36D7A1202DD1520143E3EF3493810D5FBB7D075F24E03EF3" + "address": "ibc/3A2DEEBCD51D0B74FE7CE058D40B0BF4C0E556CE9219E8F25F92CF288FF35F56" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/13C5990F84FA5D472E1F8BB1BAAEA8774DA5F24128EC02B119107AD21FB52A61" }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, "name": "xcDOT", "is_native": false, - "address": "ibc/957E1B0681DB7EF43DDF2F94B17F06BDBE2780D813093799E4D4C5DCCA539F8A" + "address": "ibc/B1561C4EEF4142F23E824F93A93BBB284F3392781ABB920A25B71E6C4767346A" }, "busd-wei": { "symbol": "axlBUSD", "decimals": 18, "name": "Binance USD", "is_native": false, - "address": "ibc/7ACA93F806B54D0833AAEF0C35A91AF112EA8CA0A34A17B584E6D4F0C22372EE" + "address": "ibc/799F11B241AAB598261632B890A3B0E678B5918D00ED3ED943E7D7C102621C1F" }, - "weth-wei": { - "symbol": "axlETH", + "wsteth-wei": { + "symbol": "axl-wstETH", "decimals": 18, - "name": "Wrapped Ether", + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "ibc/3EFE89848528B4A5665D0102DB818C6B19E04E17455197E92BECC3C41A7F7D78" + "address": "ibc/E0735A572BA1EAE93DEFB4C865E28DDCA3D1F7B38C3AEC94BDFDB8A39C664DBF" }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/81AD1D148D8567540BE2EAF522A26F93105D453C9C4D4F35DCE11CC3B1B94E50" + "address": "ibc/F6849F4A8B62F2B3B262D4B51D3E0EE4CC6294B046B79D72EC64796A97474127" }, "wavax-wei": { "symbol": "axlAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/6EB0413C3DF3032748A30897930CB98993549B4475E0E61E49CFA661C071BB60" + "address": "ibc/AF62035CBD6A7896882827CC6063024E9C3B57ABF5F0C37B5DB735BA6D1E1825" }, "wglmr-wei": { "symbol": "axlGLMR", "decimals": 18, "name": "Wrapped GLMR", "is_native": false, - "address": "ibc/ECE7689D69D6EEB7354B975B75F5402A840A30C0E01AE9E9493FB1E8A886FA17" + "address": "ibc/C7DBD7D87B35ACD5BD7878B39A3539D73FC67E81C74C010889C775467E176372" }, "wbnb-wei": { "symbol": "axlBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/C50DBE8B3FEF01C20C8049754E1066A89EC57BC15122699C2DDAA6D7581F2EAE" + "address": "ibc/3EB757FA554FC8F6E539A02E23600E6FD42533415EFE5E24480A3F010A04FA68" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "ibc/7A6F5C3C7459DAB639CF605D605CF5D291944B72DF233284C5150DB548B2018C" + "address": "ibc/D161EAA25F518C3AF2E7EB3533940187C60F835B9242E9A96C7B6F83E7E84473" }, "rai-wei": { "symbol": "axlRAI", "decimals": 18, "name": "Rai Reflex Index", "is_native": false, - "address": "ibc/87D4BC06769805089FA47CB7D54B805D862DB2DE923446989E9F99C8BDAA20D7" + "address": "ibc/0E3DA4942633E784F3BD7ADFB4705176A27FE019FC5712A06AD934B943EF173C" }, "link-wei": { "symbol": "axlLINK", "decimals": 18, "name": "ChainLink Token", "is_native": false, - "address": "ibc/9D7ADBFF8EC5183B6D5C9014EB571BA16CC450C0FE7E693BDCAD852A6BE0F60D" + "address": "ibc/6D91F37997735DDD85A03C332485078E8F6A8F52CF38A70B8EE4C271FD1D5DA1" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "ibc/672BB5434C261F551E241A8B9D049BA9070B7722B8FFD170F56CF34EA8DE28EA" + "address": "ibc/F17C8EF908BE4D0AE74F236C455E26274185C6DB47037AA6BDF02DA7A8B81052" }, "mkr-wei": { "symbol": "axlMKR", "decimals": 18, "name": "Maker", "is_native": false, - "address": "ibc/25400BB5F22C3457C21D853CD54BC52CA65441D86A7E0AB7DBE5A32BAC38F922" + "address": "ibc/DC9E5E3B14F410DB9396925B2CCF525C1F990FF1B56E4F2E90B76B086D7B7898" }, "uni-wei": { "symbol": "axlUNI", "decimals": 18, "name": "Uniswap", "is_native": false, - "address": "ibc/2BCC8E9D9963DA1B17C96F14E223D52183CC323CE504E9FB9486D4BE809E1D97" + "address": "ibc/93A73FE9DEE2E0672BEB66534209F5E3E155201DCBD10A58DAD95A3A96C58BE2" }, "shib-wei": { "symbol": "axlSHIB", "decimals": 18, "name": "SHIBA INU", "is_native": false, - "address": "ibc/8EB9F145F0FE9D280A643668234463B067BBE03B60218F40192FEEF48CC41D9A" + "address": "ibc/C9A055A621F56764EC026BAEEB90038939A6B3CD58D04E0A3C6343443C58C47A" } }, "aura": { @@ -674,6 +828,13 @@ "is_native": false, "address": "ibc/7FFC60524C4513A3A8E0A407CC89BFF5A861EC624209D72EB26FC10ADAEBA70E" }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/F1806958CA98757B91C3FA1573ECECD24F6FA3804F074A6977658914A49E65A3" + }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, @@ -688,13 +849,6 @@ "is_native": false, "address": "ibc/A7A2B8871CD2E999EB1D9E901B4F744617C80816CE94DE84CA1200109651C903" }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/F1806958CA98757B91C3FA1573ECECD24F6FA3804F074A6977658914A49E65A3" - }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, @@ -784,7 +938,7 @@ "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, "address": "0x44c784266cf024a60e8acF2427b9857Ace194C5d" }, @@ -802,6 +956,20 @@ "is_native": false, "address": "0xF976ba91b6bb3468C91E4f02E68B37bc64a57e66" }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "0xa6220B4209353dFeF03B6cE410c8F01105515f94" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "0x42A62eb3Fd2a05eD499117F128de8a3192B49EBB" + }, "wmai-wei": { "symbol": "axlWMAI", "decimals": 18, @@ -809,17 +977,101 @@ "is_native": false, "address": "0xd889657E1570c5bedD3fa846aB7865a86aAa338a" }, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "0x74c6b86A89fE77B48952Bc3a9Db74a307B202e97" + }, + "lqdr-wei": { + "symbol": "axlLqdr", + "decimals": 18, + "name": "LqdrV2", + "is_native": false, + "address": "0x873ebFf537F58e96899f6EbA33dC07151Bc5818b" + }, + "ern-wei": { + "symbol": "ERN", + "decimals": 18, + "name": "Ethos Reserve Note", + "is_native": false, + "address": "0x08d58F06DDfA9b99AE651f68232014BE3914C5cd" + }, + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", + "is_native": false, + "address": "0x232Fe66f42ac4d0DF191Ec9f34e30224BBF15C3F" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": false, + "address": "0x9428DCF8F77bFb504917A333d0b8030EBA6af8AB" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "0x939b1a17C0d0Aa3fEA634Ad9157c88245A53C713" + }, + "sfrax-wei": { + "symbol": "sFRAX", + "decimals": 18, + "name": "Staked FRAX", + "is_native": false, + "address": "0x70643975D408949044b8949Eba62f695FE12E348" + }, + "fxs-wei": { + "symbol": "FXS", + "decimals": 18, + "name": "Frax Share", + "is_native": false, + "address": "0xb890Aa48D0C4DDa49F24F56187633C7a9b9a9c65" + }, + "oath-wei": { + "symbol": "OATH", + "decimals": 18, + "name": "Oath Token", + "is_native": false, + "address": "0xAD090976CE846935DCfF1dEd852668beeD912916" + }, + "knc-wei": { + "symbol": "axlKNC", + "decimals": 18, + "name": "Kyber Network Crystal v2", + "is_native": false, + "address": "0x22FA75d747320ae5D14cC625F696487C83243CD3" + }, + "orbs-wei": { + "symbol": "ORBS", + "decimals": 18, + "name": "Orbs", + "is_native": false, + "address": "0x3Ab1C9aDb065F3FcA0059652Cd7A52B05C98f9a9" + }, + "deus-wei": { + "symbol": "axlDEUS", + "decimals": 18, + "name": "DEUS", + "is_native": false, + "address": "0xf9617c66cD8a4193A4DE0a101e16D73B71828810" + }, "stuatom": { "symbol": "stATOM", "decimals": 6, - "name": null, + "name": "Stride Staked Atom", "is_native": false, "address": "0x2fFFE7f113FDB41fc8Ffd3B67E7b7eFA2b3a030d" }, "ustrd": { "symbol": "STRD", "decimals": 6, - "name": null, + "name": "Stride", "is_native": false, "address": "0x24562dd9D02f7ECE43B947e61E313778273F140b" }, @@ -847,21 +1099,21 @@ "usomm": { "symbol": "axlSOMM", "decimals": 6, - "name": null, + "name": "Axelar Wrapped SOMM", "is_native": false, "address": "0x421CC964D5A3FEf29c6839c54C40E9d1D554aFA4" }, "uluna": { "symbol": "LUNC", "decimals": 6, - "name": null, + "name": "Axelar Wrapped LUNC", "is_native": false, "address": "0x120AD3e5A7c796349e591F1570D9f7980F4eA9cb" }, "uusd": { "symbol": "USTC", "decimals": 6, - "name": null, + "name": "Axelar Wrapped USTC", "is_native": false, "address": "0x260Bbf5698121EB85e7a74f2E45E16Ce762EbE11" }, @@ -872,6 +1124,13 @@ "is_native": false, "address": "0x4914886dBb8aAd7A7456D471EAab10b06d42348D" }, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": false, + "address": "0xcaC839c0E82A1A0470B6b78123A239Bb9f17Cbfd" + }, "wfil-wei": { "symbol": "axlFIL", "decimals": 18, @@ -886,75 +1145,103 @@ "is_native": true, "address": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E" }, - "ern-wei": { - "symbol": "ERN", - "decimals": 18, - "name": "Ethos Reserve Note", + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", "is_native": false, - "address": "0x08d58F06DDfA9b99AE651f68232014BE3914C5cd" + "address": "0xc13c0d723e01B02984499C672e205D5Ec9c05d10" }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", "is_native": false, - "address": "0xa6220B4209353dFeF03B6cE410c8F01105515f94" + "address": "0x82057f44aFE6660B177c32fB724aDb5b6aC19e4A" }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", "is_native": false, - "address": "0x42A62eb3Fd2a05eD499117F128de8a3192B49EBB" + "address": "0xC0E4AA1bfCc292250d8E4E3bEFFfA943b3C6617d" }, - "lqdr-wei": { - "symbol": "axlLqdr", - "decimals": 18, - "name": "LqdrV2", + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", "is_native": false, - "address": "0x873ebFf537F58e96899f6EbA33dC07151Bc5818b" + "address": "0x1DF5F036497898F62AF6A2C7085f1f2e75B23500" }, - "oath-wei": { - "symbol": "OATH", - "decimals": 18, - "name": "Oath Token", + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", "is_native": false, - "address": "0xAD090976CE846935DCfF1dEd852668beeD912916" + "address": "0xCeC30da703eec439Cc0b7C43611C84cE9ab3eE9a" }, - "knc-wei": { - "symbol": "axlKNC", + "aISLM": { + "symbol": "ISLM", "decimals": 18, - "name": "Kyber Network Crystal v2", + "name": "Islamic Coin", "is_native": false, - "address": "0x22FA75d747320ae5D14cC625F696487C83243CD3" + "address": "0xB5D8c52B65c24B020c51736D22F8bd961A281909" }, - "orbs-wei": { - "symbol": "ORBS", - "decimals": 18, - "name": "Orbs", + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", "is_native": false, - "address": "0x3Ab1C9aDb065F3FcA0059652Cd7A52B05C98f9a9" + "address": "0xACfEB61b0c22bcBBe4cEb7BB41122D272D79F9bF" }, - "deus-wei": { - "symbol": "axlDEUS", - "decimals": 18, - "name": "DEUS", + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", "is_native": false, - "address": "0xf9617c66cD8a4193A4DE0a101e16D73B71828810" + "address": "0x86ae86e42286BC37e502fB26d2f7DD2813dADCd1" }, - "stern-wei": { - "symbol": "stERN", - "decimals": 18, - "name": "Staked ERN Vault", + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", "is_native": false, - "address": "0x232Fe66f42ac4d0DF191Ec9f34e30224BBF15C3F" + "address": "0x26b0783269ff93C49ae0Fb9F65AC05e27005e9b4" }, - "wsteth-wei": { - "symbol": "axl-wstETH", + "mee-wei": { + "symbol": "MEE", "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "name": "MEE Governance Token", "is_native": false, - "address": "0x74c6b86A89fE77B48952Bc3a9Db74a307B202e97" + "address": "0x38CF645DEE7d0c0E36A0f020c418405101955C7d" + }, + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", + "is_native": false, + "address": "0xe9ED8e918A20937E2C6B6f9d9a249dc6E99D3D3e" + }, + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "0x615d89C167A38afecA108c2AD9E1e65F09E2EE29" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0x3b3D6C857476Fc2f275906D39568d622B74d96a0" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0x654877D1C2ca16e417e99eF906Ca1Ba96B8cfE4C" } }, "axelarnet": { @@ -968,7 +1255,7 @@ "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": true, "address": "uaxl" }, @@ -993,12 +1280,12 @@ "is_native": false, "address": "wbtc-satoshi" }, - "pepe-wei": { - "symbol": "axlPEPE", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Pepe", + "name": "Wrapped Ether", "is_native": false, - "address": "pepe-wei" + "address": "weth-wei" }, "wmai-wei": { "symbol": "axlWMAI", @@ -1028,283 +1315,185 @@ "is_native": false, "address": "wsteth-wei" }, - "cbeth-wei": { - "symbol": "cbETH", + "wusdm-wei": { + "symbol": "wUSDM", "decimals": 18, - "name": "Coinbase Wrapped Staked ETH", + "name": "Wrapped Mountain Protocol USD", "is_native": false, - "address": "cbeth-wei" + "address": "wusdm-wei" }, - "sfrxeth-wei": { - "symbol": "sfrxETH", + "ueuroc": { + "symbol": "axlEUROC", + "decimals": 6, + "name": "Euro Coin", + "is_native": false, + "address": "ueuroc" + }, + "lqdr-wei": { + "symbol": "axlLqdr", "decimals": 18, - "name": "Staked Frax Ether", + "name": "LqdrV2", "is_native": false, - "address": "sfrxeth-wei" + "address": "lqdr-wei" }, - "reth-wei": { - "symbol": "rETH", + "ern-wei": { + "symbol": "ERN", "decimals": 18, - "name": "Rocket Pool ETH", + "name": "Ethos Reserve Note", "is_native": false, - "address": "reth-wei" + "address": "ern-wei" }, - "mpx-wei": { - "symbol": "MPX", + "stern-wei": { + "symbol": "stERN", "decimals": 18, - "name": "MPX", + "name": "Staked ERN Vault", "is_native": false, - "address": "mpx-wei" + "address": "stern-wei" }, - "stuatom": { - "symbol": "stATOM", + "wdoge-wei": { + "symbol": "axlWDOGE", + "decimals": 8, + "name": "Wrapped DOGE", + "is_native": false, + "address": "wdoge-wei" + }, + "uosmo": { + "symbol": "axlOSMO", "decimals": 6, - "name": null, + "name": "Axelar Wrapped OSMO", "is_native": false, - "address": "ibc/CFB9D610B7BB02E8E6FDB0AF87FCADDF97687A3F13E76AC624C500E54335ADAA" + "address": "ibc/47BD209179859CDE4A2806763D7189B6E6FE13A17880FE2B42DE1E6C1E329E23" }, - "stkbnb-wei": { - "symbol": "stkBNB", + "cusd-wei": { + "symbol": "cUSD", "decimals": 18, - "name": "Staked BNB", + "name": "Celo Dollar", "is_native": false, - "address": "stkbnb-wei" + "address": "cusd-wei" }, - "ustrd": { - "symbol": "STRD", + "ukuji": { + "symbol": "KUJI", "decimals": 6, - "name": null, + "name": "Kujira native asset", "is_native": false, - "address": "ibc/F42AC6E51C46D30F7F39ADCA1A38E29374745771F23AB3250444F09EBBB4A107" + "address": "ibc/1EDB735A58AA984F6FF11E332077D8A05D5E70E355427C2CF419BD1566FC1E2C" }, - "weth-wei": { - "symbol": "axlETH", + "cbeth-wei": { + "symbol": "cbETH", "decimals": 18, - "name": "Wrapped Ether", + "name": "Coinbase Wrapped Staked ETH", "is_native": false, - "address": "weth-wei" + "address": "cbeth-wei" }, - "wmatic-wei": { - "symbol": "axlMATIC", + "sfrxeth-wei": { + "symbol": "sfrxETH", "decimals": 18, - "name": "Wrapped Matic", + "name": "Staked Frax Ether", "is_native": false, - "address": "wmatic-wei" + "address": "sfrxeth-wei" }, - "wavax-wei": { - "symbol": "axlAVAX", + "frxeth-wei": { + "symbol": "frxETH", "decimals": 18, - "name": "Wrapped AVAX", + "name": "Frax Ether", "is_native": false, - "address": "wavax-wei" + "address": "frxeth-wei" }, - "wglmr-wei": { - "symbol": "axlGLMR", + "sfrax-wei": { + "symbol": "sFRAX", "decimals": 18, - "name": "Wrapped GLMR", + "name": "Staked FRAX", "is_native": false, - "address": "wglmr-wei" + "address": "sfrax-wei" }, - "wbnb-wei": { - "symbol": "axlBNB", + "fxs-wei": { + "symbol": "FXS", "decimals": 18, - "name": "Wrapped BNB", + "name": "Frax Share", "is_native": false, - "address": "wbnb-wei" + "address": "fxs-wei" }, - "wftm-wei": { - "symbol": "axlFTM", + "reth-wei": { + "symbol": "rETH", "decimals": 18, - "name": "Wrapped Fantom", - "is_native": false, - "address": "wftm-wei" - }, - "uatom": { - "symbol": "axlATOM", - "decimals": 6, - "name": "Cosmoshub staking ATOM", + "name": "Rocket Pool ETH", "is_native": false, - "address": "ibc/9117A26BA81E29FA4F78F57DC2BD90CD3D26848101BA880445F119B22A1E254E" + "address": "reth-wei" }, - "usomm": { - "symbol": "axlSOMM", - "decimals": 6, - "name": null, + "arb-wei": { + "symbol": "axlARB", + "decimals": 18, + "name": "Arbitrum", "is_native": false, - "address": "ibc/12A9901F2B585B3563C2AD4919D20ED478CCAB3D7F9ACBB76E829583B99B1DAA" + "address": "arb-wei" }, - "uluna": { - "symbol": "LUNC", - "decimals": 6, - "name": null, + "op-wei": { + "symbol": "axlOP", + "decimals": 18, + "name": "Optimism", "is_native": false, - "address": "ibc/4627AD2524E3E0523047E35BB76CC90E37D9D57ACF14F0FCBCEB2480705F3CB8" + "address": "op-wei" }, - "uusd": { - "symbol": "USTC", - "decimals": 6, - "name": null, + "mpx-wei": { + "symbol": "MPX", + "decimals": 18, + "name": "MPX", "is_native": false, - "address": "ibc/6F4968A73F90CF7DE6394BF937D6DF7C7D162D74D839C13F53B41157D315E05F" + "address": "mpx-wei" }, - "rai-wei": { - "symbol": "axlRAI", + "bal-wei": { + "symbol": "axlBAL", "decimals": 18, - "name": "Rai Reflex Index", + "name": "Balancer", "is_native": false, - "address": "rai-wei" + "address": "bal-wei" }, - "link-wei": { - "symbol": "axlLINK", + "ktc-wei": { + "symbol": "KTC", "decimals": 18, - "name": "ChainLink Token", + "name": "KTX Community Token", "is_native": false, - "address": "link-wei" + "address": "ktc-wei" }, - "frax-wei": { - "symbol": "axlFRAX", + "vext-wei": { + "symbol": "VEXT", "decimals": 18, - "name": "Frax", + "name": "Veloce", "is_native": false, - "address": "frax-wei" + "address": "vext-wei" }, - "mkr-wei": { - "symbol": "axlMKR", + "ovn-wei": { + "symbol": "OVN", "decimals": 18, - "name": "Maker", + "name": "OVN", "is_native": false, - "address": "mkr-wei" + "address": "ovn-wei" }, - "ungm": { - "symbol": "NGM", - "decimals": 6, - "name": null, + "vela-wei": { + "symbol": "VELA", + "decimals": 18, + "name": "VelaToken", "is_native": false, - "address": "ibc/ACD9A665DB6C19EC1D057A43D468E324CA9FB9C5ABF82235815F7B7745A15B80" + "address": "vela-wei" }, - "eeur": { - "symbol": "EEUR", - "decimals": 6, - "name": null, + "arx-wei": { + "symbol": "ARX", + "decimals": 18, + "name": "ArbiDex Token", "is_native": false, - "address": "ibc/373EF14936B38AC8F8A7E7024C0FB7099369FDDFDA3CDA9EFA73684B16249B64" + "address": "arx-wei" }, - "uni-wei": { - "symbol": "axlUNI", + "hzn-wei": { + "symbol": "HZN", "decimals": 18, - "name": "Uniswap", + "name": "Horizon", "is_native": false, - "address": "uni-wei" + "address": "hzn-wei" }, - "shib-wei": { - "symbol": "axlSHIB", + "oath-wei": { + "symbol": "OATH", "decimals": 18, - "name": "SHIBA INU", - "is_native": false, - "address": "shib-wei" - }, - "wfil-wei": { - "symbol": "axlFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "wfil-wei" - }, - "yieldusd-wei": { - "symbol": "axlYieldUSD", - "decimals": 18, - "name": "Real Yield USD", - "is_native": false, - "address": "yieldusd-wei" - }, - "yieldeth-wei": { - "symbol": "axlYieldETH", - "decimals": 18, - "name": "Real Yield ETH", - "is_native": false, - "address": "yieldeth-wei" - }, - "ern-wei": { - "symbol": "ERN", - "decimals": 18, - "name": "Ethos Reserve Note", - "is_native": false, - "address": "ern-wei" - }, - "uumee": { - "symbol": "UMEE", - "decimals": 6, - "name": null, - "is_native": false, - "address": "ibc/DA8D591FFA8836FDF3AD0F9F8AF4EAA77D9D4F23DA3D10DFD1FC3B9A3644B26D" - }, - "lqdr-wei": { - "symbol": "axlLqdr", - "decimals": 18, - "name": "LqdrV2", - "is_native": false, - "address": "lqdr-wei" - }, - "wdoge-wei": { - "symbol": "axlWDOGE", - "decimals": 8, - "name": "Wrapped DOGE", - "is_native": false, - "address": "wdoge-wei" - }, - "uosmo": { - "symbol": "axlOSMO", - "decimals": 6, - "name": null, - "is_native": false, - "address": "ibc/47BD209179859CDE4A2806763D7189B6E6FE13A17880FE2B42DE1E6C1E329E23" - }, - "ukuji": { - "symbol": "KUJI", - "decimals": 6, - "name": null, - "is_native": false, - "address": "ibc/1EDB735A58AA984F6FF11E332077D8A05D5E70E355427C2CF419BD1566FC1E2C" - }, - "cusd-wei": { - "symbol": "cUSD", - "decimals": 18, - "name": "Celo Dollar", - "is_native": false, - "address": "cusd-wei" - }, - "polygon-uusdc": { - "symbol": "Polygon USDC", - "decimals": 6, - "name": "Polygon USDC", - "is_native": false, - "address": "polygon-uusdc" - }, - "avalanche-uusdc": { - "symbol": "Avalanche USDC", - "decimals": 6, - "name": "Avalanche USDC", - "is_native": false, - "address": "avalanche-uusdc" - }, - "arb-wei": { - "symbol": "axlARB", - "decimals": 18, - "name": "Arbitrum", - "is_native": false, - "address": "arb-wei" - }, - "hzn-wei": { - "symbol": "HZN", - "decimals": 18, - "name": "Horizon", - "is_native": false, - "address": "hzn-wei" - }, - "oath-wei": { - "symbol": "OATH", - "decimals": 18, - "name": "Oath Token", + "name": "Oath Token", "is_native": false, "address": "oath-wei" }, @@ -1364,501 +1553,651 @@ "is_native": false, "address": "sonne-wei" }, - "stern-wei": { - "symbol": "stERN", - "decimals": 18, - "name": "Staked ERN Vault", + "uumee": { + "symbol": "UMEE", + "decimals": 6, + "name": "Umee native token", "is_native": false, - "address": "stern-wei" + "address": "ibc/DA8D591FFA8836FDF3AD0F9F8AF4EAA77D9D4F23DA3D10DFD1FC3B9A3644B26D" }, - "vela-wei": { - "symbol": "VELA", - "decimals": 18, - "name": "VelaToken", + "stuatom": { + "symbol": "stATOM", + "decimals": 6, + "name": "Stride Staked Atom", "is_native": false, - "address": "vela-wei" + "address": "ibc/CFB9D610B7BB02E8E6FDB0AF87FCADDF97687A3F13E76AC624C500E54335ADAA" }, - "arx-wei": { - "symbol": "ARX", + "stkbnb-wei": { + "symbol": "stkBNB", "decimals": 18, - "name": "ArbiDex Token", + "name": "Staked BNB", "is_native": false, - "address": "arx-wei" + "address": "stkbnb-wei" }, - "ueuroc": { - "symbol": "axlEUROC", + "ustrd": { + "symbol": "STRD", "decimals": 6, - "name": "Euro Coin", + "name": "Stride", "is_native": false, - "address": "ueuroc" + "address": "ibc/F42AC6E51C46D30F7F39ADCA1A38E29374745771F23AB3250444F09EBBB4A107" }, - "vext-wei": { - "symbol": "VEXT", + "wmatic-wei": { + "symbol": "axlMATIC", "decimals": 18, - "name": "Veloce", + "name": "Wrapped Matic", "is_native": false, - "address": "vext-wei" + "address": "wmatic-wei" }, - "ovn-wei": { - "symbol": "OVN", + "wavax-wei": { + "symbol": "axlAVAX", "decimals": 18, - "name": "OVN", + "name": "Wrapped AVAX", "is_native": false, - "address": "ovn-wei" + "address": "wavax-wei" }, - "bal-wei": { - "symbol": "axlBAL", + "wglmr-wei": { + "symbol": "axlGLMR", "decimals": 18, - "name": "Balancer", + "name": "Wrapped GLMR", "is_native": false, - "address": "bal-wei" + "address": "wglmr-wei" }, - "ktc-wei": { - "symbol": "KTC", + "wbnb-wei": { + "symbol": "axlBNB", "decimals": 18, - "name": "KTX Community Token", + "name": "Wrapped BNB", "is_native": false, - "address": "ktc-wei" + "address": "wbnb-wei" + }, + "wftm-wei": { + "symbol": "axlFTM", + "decimals": 18, + "name": "Wrapped Fantom", + "is_native": false, + "address": "wftm-wei" + }, + "uatom": { + "symbol": "axlATOM", + "decimals": 6, + "name": "Cosmoshub staking ATOM", + "is_native": false, + "address": "ibc/9117A26BA81E29FA4F78F57DC2BD90CD3D26848101BA880445F119B22A1E254E" + }, + "usomm": { + "symbol": "axlSOMM", + "decimals": 6, + "name": "Axelar Wrapped SOMM", + "is_native": false, + "address": "ibc/12A9901F2B585B3563C2AD4919D20ED478CCAB3D7F9ACBB76E829583B99B1DAA" }, "utia": { "symbol": "axlTIA", "decimals": 6, - "name": null, + "name": "Axelar Wrapped TIA", "is_native": false, "address": "ibc/F8F36BBEFFD1B311D5D3A7B8E6B3C03DBF707D4E5FE045B18221D8DF12E481C3" }, - "wusdm-wei": { - "symbol": "wUSDM", + "pepe-wei": { + "symbol": "axlPEPE", "decimals": 18, - "name": "Wrapped Mountain Protocol USD", + "name": "Pepe", "is_native": false, - "address": "wusdm-wei" + "address": "pepe-wei" }, - "sfrax-wei": { - "symbol": "sFRAX", - "decimals": 18, - "name": "Staked FRAX", - "is_native": false, - "address": "sfrax-wei" - } - }, - "binance": { - "uusdc": { - "symbol": "axlUSDC", + "uluna": { + "symbol": "LUNC", "decimals": 6, - "name": "USD Coin", + "name": "Axelar Wrapped LUNC", "is_native": false, - "address": "0x4268B8F0B87b6Eae5d897996E6b845ddbD99Adf3" + "address": "ibc/4627AD2524E3E0523047E35BB76CC90E37D9D57ACF14F0FCBCEB2480705F3CB8" }, - "uaxl": { - "symbol": "AXL", + "uusd": { + "symbol": "USTC", "decimals": 6, - "name": null, + "name": "Axelar Wrapped USTC", "is_native": false, - "address": "0x8b1f4432F943c465A973FeDC6d7aa50Fc96f1f65" + "address": "ibc/6F4968A73F90CF7DE6394BF937D6DF7C7D162D74D839C13F53B41157D315E05F" }, - "pepe-wei": { - "symbol": "axlPEPE", + "rai-wei": { + "symbol": "axlRAI", "decimals": 18, - "name": "Pepe", + "name": "Rai Reflex Index", "is_native": false, - "address": "0xE3a4277eFBe777B6B17CB7fFB7fEAf8C92cBE65A" + "address": "rai-wei" }, - "wmai-wei": { - "symbol": "axlWMAI", + "link-wei": { + "symbol": "axlLINK", "decimals": 18, - "name": "Wrapped MAI", + "name": "ChainLink Token", "is_native": false, - "address": "0x501e3d716A72E11E1e22eDcf0365556b357DA0c9" + "address": "link-wei" }, - "mpx-wei": { - "symbol": "MPX", + "frax-wei": { + "symbol": "axlFRAX", "decimals": 18, - "name": "MPX", + "name": "Frax", "is_native": false, - "address": "0x94C6B279b5df54b335aE51866d6E2A56BF5Ef9b7" + "address": "frax-wei" }, - "stuatom": { - "symbol": "stATOM", - "decimals": 6, - "name": null, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", "is_native": false, - "address": "0x4Bd3231E7eFc193F13a89b23ED6970776a91CF63" + "address": "fpi-wei" }, - "stkbnb-wei": { - "symbol": "stkBNB", + "mkr-wei": { + "symbol": "axlMKR", "decimals": 18, - "name": "Staked BNB", - "is_native": true, - "address": "0xc2E9d07F66A89c44062459A47a0D2Dc038E4fb16" + "name": "Maker", + "is_native": false, + "address": "mkr-wei" }, - "ustrd": { - "symbol": "STRD", - "decimals": 6, - "name": null, + "uni-wei": { + "symbol": "axlUNI", + "decimals": 18, + "name": "Uniswap", "is_native": false, - "address": "0x922946A8A2FAE7a8b4506bd54Ea361482Eff95dD" + "address": "uni-wei" }, - "wbnb-wei": { - "symbol": "WBNB", + "shib-wei": { + "symbol": "axlSHIB", "decimals": 18, - "name": "Wrapped BNB", - "is_native": true, - "address": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c" + "name": "SHIBA INU", + "is_native": false, + "address": "shib-wei" }, "wfil-wei": { "symbol": "axlFIL", "decimals": 18, "name": "Wrapped FIL", "is_native": false, - "address": "0x49517abB880359eb873bDc08d09eBc0c478d3CA2" + "address": "wfil-wei" }, - "ern-wei": { - "symbol": "ERN", - "decimals": 18, - "name": "Ethos Reserve Note", + "polygon-uusdc": { + "symbol": "Polygon USDC", + "decimals": 6, + "name": "Polygon USDC", "is_native": false, - "address": "0xce1E3cc1950D2aAEb47dE04DE2dec2Dc86380E0A" + "address": "polygon-uusdc" }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", + "avalanche-uusdc": { + "symbol": "Avalanche USDC", + "decimals": 6, + "name": "Avalanche USDC", "is_native": false, - "address": "0x448d59B4302aB5d2dadf9611bED9457491926c8e" + "address": "avalanche-uusdc" }, - "weth-wei": { - "symbol": "axlETH", + "yieldusd-wei": { + "symbol": "axlYieldUSD", "decimals": 18, - "name": "Wrapped Ether", + "name": "Real Yield USD", "is_native": false, - "address": "0xfe7eDa5F2c56160d406869A8aA4B2F365d544C7B" + "address": "yieldusd-wei" }, - "uusdt": { - "symbol": "axlUSDT", + "yieldeth-wei": { + "symbol": "axlYieldETH", + "decimals": 18, + "name": "Real Yield ETH", + "is_native": false, + "address": "yieldeth-wei" + }, + "utori": { + "symbol": "TORI", "decimals": 6, - "name": "Tether USD", + "name": "Teritori", "is_native": false, - "address": "0x4818B684a810fC023C32bB6292da8D508Bd906EF" + "address": "ibc/F236A548FDC4436557B13919391109309C2FF58D7E89C3C8840C2C703E582DCD" }, - "dai-wei": { - "symbol": "axlDAI", + "usdy-wei": { + "symbol": "axlUSDY", "decimals": 18, - "name": "Dai Stablecoin", + "name": "Ondo U.S. Dollar Yield", "is_native": false, - "address": "0xF02eaeEa1350DAD8fc7A66d6BddB25876243ed1F" + "address": "usdy-wei" }, - "frax-wei": { - "symbol": "axlFRAX", - "decimals": 18, - "name": "Frax", + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", "is_native": false, - "address": "0x3FF4cb8EC5EC5eBBfD3424401D962F0627a67Cac" + "address": "ibc/9FD79FAFC071C4F858860C44C942F5A108EC9562BBDD26374EC8966C0287D95F" }, - "lqdr-wei": { - "symbol": "axlLqdr", + "ox-wei": { + "symbol": "OX", "decimals": 18, - "name": "LqdrV2", + "name": "Open Exchange Token", "is_native": false, - "address": "0x4b6B3d425F82248996D77EcC3F3df1E500aaC1db" + "address": "ox-wei" }, - "uatom": { - "symbol": "axlATOM", + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", "decimals": 6, - "name": "Cosmoshub staking ATOM", + "name": "Levana Governance Token", "is_native": false, - "address": "0x3966001bEb78FD309665EA78FF8a4dA2E7E13180" + "address": "ibc/B64A07C006C0F5E260A8AD50BD53568F1FD4A0D75B7A9F8765C81BEAFDA62053" }, - "oath-wei": { - "symbol": "OATH", + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", + "is_native": false, + "address": "ibc/5B0968D76C6250F0824BD0BB4317DB34E884A14B345C83FB8256809855AC7CA7" + }, + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", + "is_native": false, + "address": "ibc/EA2F9730C3496ED83479D9238515311A9AFA60E3D24A3419BECDF2A2A8152F8C" + }, + "aISLM": { + "symbol": "ISLM", "decimals": 18, - "name": "Oath Token", + "name": "Islamic Coin", "is_native": false, - "address": "0x73f4C95AF5C2892253c068850B8C9a753636f58d" + "address": "ibc/0B1A2FD6D40BBD60EEAF9ED619767EA8047CC7A46DC2A103183D7E9EE1063599" }, - "pols-wei": { - "symbol": "POLS", + "wmnt-wei": { + "symbol": "WMNT", "decimals": 18, - "name": "PolkastarterToken", + "name": "Wrapped Mantle", "is_native": false, - "address": "0x7117e08b0734e1D643bf29B523F41ff89a1A1367" + "address": "wmnt-wei" }, - "knc-wei": { - "symbol": "axlKNC", + "factory/sei10hud5e5er4aul2l7sp2u9qp2lag5u4xf8mvyx38cnjvqhlgsrcls5qn5ke/seilor": { + "symbol": "axlSEILOR", + "decimals": 6, + "name": "Axelar Wrapped SEILOR", + "is_native": false, + "address": "ibc/732B6D0D4E8FA43272528A8BD945D8B96CBBCCA09B053212FC4D9CC847E2FF6F" + }, + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", + "is_native": false, + "address": "ibc/A139C0E0B5E87CBA8EAEEB12B9BEE13AC7C814CFBBFA87BBCADD67E31003466C" + }, + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", + "is_native": false, + "address": "ibc/BBC73A51A2EC44D3ECDF50891D06E38355B2B8ABE4F5ACD624C4C60691479EC4" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", + "is_native": false, + "address": "ibc/51DF28237DFCC73155B2F3E61300F5BF0F4989BD9F0C103A5939B03BB5A62649" + }, + "unls": { + "symbol": "NLS", + "decimals": 6, + "name": "NLS native asset", + "is_native": false, + "address": "ibc/37731EEEAE2D4A18C296FA1B3808719ACCBFFF7BF7F6A1D6EEA1044472B689E3" + }, + "yum-wei": { + "symbol": "YUM", "decimals": 18, - "name": "Kyber Network Crystal v2", + "name": "Yum", "is_native": false, - "address": "0xDF34bE7f242EE338644d8d1a1f4D11a807b4Da5f" + "address": "yum-wei" }, - "orbs-wei": { - "symbol": "ORBS", + "metal-wei": { + "symbol": "METAL", "decimals": 18, - "name": "Orbs", + "name": "METAL", "is_native": false, - "address": "0x43a8cab15D06d3a5fE5854D714C37E7E9246F170" + "address": "metal-wei" }, - "deus-wei": { - "symbol": "axlDEUS", + "mee-wei": { + "symbol": "MEE", "decimals": 18, - "name": "DEUS", + "name": "MEE Governance Token", "is_native": false, - "address": "0x912922e25ac79D524734d8eC0C882B035c5b356f" + "address": "mee-wei" }, - "stern-wei": { - "symbol": "stERN", + "nftl-wei": { + "symbol": "NFTL", "decimals": 18, - "name": "Staked ERN Vault", + "name": "Nifty League", "is_native": false, - "address": "0x34A279Ece38f260a28C8872f416319e9B6Aa428e" + "address": "nftl-wei" }, - "ovn-wei": { - "symbol": "OVN", + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", + "is_native": false, + "address": "ibc/553507B81B0A26B2FF168B2A56A7CEB7C75491994D2DB5784AC6E40874E27E63" + }, + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "ibc/2F740C82769D1D7697CFB3D211F952E835AFD9C1852D23B49F3FA7F0475D794B" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "ibc/AFE3377888BF66513E7D48A6D4D409626114481E3CC6F6E1C9B92C9AA25673FA" + }, + "arbitrum-weth-wei": { + "symbol": "Arbitrum axlETH", "decimals": 18, - "name": "OVN", + "name": "Wrapped Ether", "is_native": false, - "address": "0x259B30C916e440FB79747cD559207FfdaBBae057" + "address": "arbitrum-weth-wei" }, - "gdx-wei": { - "symbol": "GDX", + "base-weth-wei": { + "symbol": "Base axlETH", "decimals": 18, - "name": "Gridex", + "name": "Wrapped Ether", "is_native": false, - "address": "0x4E11B45E4Ae94eE8c32760Dd3286836BDfe47524" + "address": "base-weth-wei" }, - "ktc-wei": { - "symbol": "KTC", + "polygon-weth-wei": { + "symbol": "Polygon axlETH", "decimals": 18, - "name": "KTX Community Token", - "is_native": true, - "address": "0x545356d4d69d8cD1213Ee7e339867574738751CA" + "name": "Wrapped Ether", + "is_native": false, + "address": "polygon-weth-wei" }, - "utia": { - "symbol": "axlTIA", + "ulava": { + "symbol": "LAVA", "decimals": 6, - "name": null, + "name": "Axelar Wrapped LAVA", "is_native": false, - "address": "0x420eEEd09Cbc6e8416decD28857fF3C7D991Fc46" + "address": "ibc/2C675DF5F8A49C2685775C6A692015A3B059FA6656B4DBB4DF4052F84F7DEDEA" }, - "wsteth-wei": { - "symbol": "axl-wstETH", - "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "cbbtc-satoshi": { + "symbol": "axl-cbBTC", + "decimals": 8, + "name": "Coinbase Wrapped BTC", "is_native": false, - "address": "0xb306669D6C024B3deA4ff3A35D50844289b2DCFC" + "address": "cbbtc-satoshi" }, - "ukuji": { - "symbol": "KUJI", + "fbtc-satoshi": { + "symbol": "axlFBTC", + "decimals": 8, + "name": "Fire Bitcoin", + "is_native": false, + "address": "fbtc-satoshi" + }, + "lbtc-satoshi": { + "symbol": "axlLBTC", + "decimals": 8, + "name": "Lombard Staked Bitcoin", + "is_native": false, + "address": "lbtc-satoshi" + }, + "arbitrum-uusdt": { + "symbol": "axlArbitrumUSDT", "decimals": 6, - "name": null, + "name": "Tether USD", "is_native": false, - "address": "0x073690e6CE25bE816E68F32dCA3e11067c9FB5Cc" + "address": "arbitrum-uusdt" + }, + "polygon-uusdt": { + "symbol": "axlPolygonUSDT", + "decimals": 6, + "name": "(PoS) Tether USD", + "is_native": false, + "address": "polygon-uusdt" + }, + "optimism-uusdt": { + "symbol": "axlOptimismUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "optimism-uusdt" } }, - "carbon": { + "base": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/7C0807A56073C4A27B0DE1C21BA3EB75DF75FD763F4AD37BC159917FC01145F0" + "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "ibc/062588846168EDFECF20F7681F2A0A131A53B9A3C8535BCA8F7D1A268246974B" + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/7E8C893B624C33274D18279546DE9353BCABF22B423D7D5E78B298144B23C6B2" + "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/812FE3017D74992A23CF4D65DCEBC5688B2F9D5595CBA7E7447522C6F2152778" + "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/9CCCFA44CA6F74517C3E3416971EF2B7EC8506F2A00C62C660935DD9CB5E1C63" + "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" }, - "dot-planck": { - "symbol": "axlDOT", - "decimals": 10, - "name": "xcDOT", + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", "is_native": false, - "address": "ibc/14EEA1138E7AF7E8F531DA1F94C4D2BCA0354621AD84A6FC5FF7843901F77DA6" + "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" + }, + "wmai-wei": { + "symbol": "axlWMAI", + "decimals": 18, + "name": "Wrapped MAI", + "is_native": false, + "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" }, "busd-wei": { "symbol": "axlBUSD", "decimals": 18, "name": "Binance USD", "is_native": false, - "address": "ibc/AD706B02DD4D8468C287D2F22E4BA2FB80338DF5C1F4035086411074B755A485" + "address": "0x4D84E25cEa9447581867fE9f2329B972f532Da2c" }, - "weth-wei": { - "symbol": "axlETH", + "wsteth-wei": { + "symbol": "axl-wstETH", "decimals": 18, - "name": "Wrapped Ether", + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "ibc/DC44871FDB10B6FB4D4089247AA918B0F30428C8911AFB6192D98AE8E38E31CB" + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" }, - "wmatic-wei": { - "symbol": "axlMATIC", + "ern-wei": { + "symbol": "ERN", "decimals": 18, - "name": "Wrapped Matic", + "name": "Ethos Reserve Note", "is_native": false, - "address": "ibc/E74941AEE93FA5FBC9195082758763917D56E2E05A48AE094AD142AA2DD10B7A" + "address": "0xa334884bF6b0A066d553D19e507315E839409e62" }, - "wavax-wei": { - "symbol": "axlAVAX", + "stern-wei": { + "symbol": "stERN", "decimals": 18, - "name": "Wrapped AVAX", + "name": "Staked ERN Vault", "is_native": false, - "address": "ibc/608FB6C36692B78844D22BC125F59CF46011B27B053DA40F730A15BCB248C3A8" + "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" }, - "wglmr-wei": { - "symbol": "axlGLMR", + "sfrxeth-wei": { + "symbol": "sfrxETH", "decimals": 18, - "name": "Wrapped GLMR", + "name": "Staked Frax Ether", "is_native": false, - "address": "ibc/DA5F22C49C88D4B0AAB0E2275D320078EE98610EEB10AEC847929CCF2137144C" + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" }, - "wbnb-wei": { - "symbol": "axlBNB", + "frxeth-wei": { + "symbol": "frxETH", "decimals": 18, - "name": "Wrapped BNB", + "name": "Frax Ether", "is_native": false, - "address": "ibc/DF9C9A15AB22971A4F65FB8F471459A757745F9709905A599D5011E69FE3C375" + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D" }, - "wftm-wei": { - "symbol": "axlFTM", + "sfrax-wei": { + "symbol": "sFRAX", "decimals": 18, - "name": "Wrapped Fantom", + "name": "Staked FRAX", "is_native": false, - "address": "ibc/2D4399D27A3988E41C1FA4CF3F0CCCDEA4094646A5C3B483D7508069489F860C" + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" }, - "rai-wei": { - "symbol": "axlRAI", + "fxs-wei": { + "symbol": "FXS", "decimals": 18, - "name": "Rai Reflex Index", + "name": "Frax Share", "is_native": false, - "address": "ibc/0FDA701E39D7B52F00B75B692E3BD6B3AB7841EE396517EE3DBC3D31AE42A5D2" + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721" }, - "link-wei": { - "symbol": "axlLINK", + "arb-wei": { + "symbol": "axlARB", "decimals": 18, - "name": "ChainLink Token", + "name": "Arbitrum", "is_native": false, - "address": "ibc/8B40CD07C94E82E3AD214FF8EB5230040E9440AC1F77B6880CFF893C6F62E13D" + "address": "0x87b6c94c435F6e49789ad34FAf0d048F2D9043a2" }, - "frax-wei": { - "symbol": "axlFRAX", + "op-wei": { + "symbol": "axlOP", "decimals": 18, - "name": "Frax", + "name": "Optimism", "is_native": false, - "address": "ibc/F3146333E033F2F20125A2F9879F0DEED990B1005FFAF77873CC4E405FBDE8C4" + "address": "0x994ac01750047B9d35431a7Ae4Ed312ee955E030" }, - "mkr-wei": { - "symbol": "axlMKR", + "mpx-wei": { + "symbol": "MPX", "decimals": 18, - "name": "Maker", + "name": "MPX", "is_native": false, - "address": "ibc/D1506C95F0BDB40B370C7AE12FAC073B350DB11CF00A9B7251EB6CEF7D9F73DF" + "address": "0xa5325A8EBBbdb12CAF6b76218a7375a71f9f3b41" }, - "uni-wei": { - "symbol": "axlUNI", + "bal-wei": { + "symbol": "axlBAL", "decimals": 18, - "name": "Uniswap", + "name": "Balancer", "is_native": false, - "address": "ibc/133B6981CB7857696D1CEEBB1D3A953B507D602241C3DE90EAAC1F7C92067BAD" + "address": "0x11C1879227D463b60db18C17c20aE739aE8E961a" }, - "shib-wei": { - "symbol": "axlSHIB", + "ovn-wei": { + "symbol": "OVN", "decimals": 18, - "name": "SHIBA INU", + "name": "OVN", "is_native": false, - "address": "ibc/D8006E3E5D69B1B3A167E79E87A2A56999EE1EF060CCA62C4D15C1046F586C39" - } - }, - "celo": { - "uusdc": { - "symbol": "axlUSDC", - "decimals": 6, - "name": "USD Coin", + "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396" + }, + "vela-wei": { + "symbol": "VELA", + "decimals": 18, + "name": "VelaToken", "is_native": false, - "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" + "address": "0x5A76A56ad937335168b30dF3AA1327277421C6Ae" }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, + "arx-wei": { + "symbol": "ARX", + "decimals": 18, + "name": "ArbiDex Token", "is_native": false, - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + "address": "0x58Ed4FD0C3d930b674BA50a293f03ef6cD7dE7a3" }, - "dai-wei": { - "symbol": "axlDAI", + "hzn-wei": { + "symbol": "HZN", "decimals": 18, - "name": "Dai Stablecoin", + "name": "Horizon", "is_native": false, - "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7" + "address": "0x081AD949deFe648774C3B8deBe0E4F28a80716dc" }, - "uusdt": { - "symbol": "axlUSDT", - "decimals": 6, - "name": "Tether USD", + "oath-wei": { + "symbol": "OATH", + "decimals": 18, + "name": "Oath Token", "is_native": false, - "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", + "knc-wei": { + "symbol": "axlKNC", + "decimals": 18, + "name": "Kyber Network Crystal v2", "is_native": false, - "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" }, - "wmai-wei": { - "symbol": "axlWMAI", + "gdx-wei": { + "symbol": "GDX", "decimals": 18, - "name": "Wrapped MAI", + "name": "Gridex", "is_native": false, - "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" + "address": "0x91c415FEcD651F11D24aC4b72Ed08dbEb9868D43" }, - "cusd-wei": { - "symbol": "cUSD", + "deus-wei": { + "symbol": "axlDEUS", "decimals": 18, - "name": "Celo Dollar", - "is_native": true, - "address": "0x765DE816845861e75A25fCA122bb6898B8B1282a" + "name": "DEUS", + "is_native": false, + "address": "0xebD4A18034C78A415088DF8508f102421eD693b1" + }, + "sonne-wei": { + "symbol": "SONNE", + "decimals": 18, + "name": "Sonne", + "is_native": false, + "address": "0x22a2488fE295047Ba13BD8cCCdBC8361DBD8cf7c" }, "stuatom": { "symbol": "stATOM", "decimals": 6, - "name": null, + "name": "Stride Staked Atom", "is_native": false, "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" }, "ustrd": { "symbol": "STRD", "decimals": 6, - "name": null, + "name": "Stride", "is_native": false, "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F" }, - "weth-wei": { - "symbol": "axlETH", + "wmatic-wei": { + "symbol": "axlMATIC", "decimals": 18, - "name": "Wrapped Ether", + "name": "Wrapped Matic", "is_native": false, - "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" + "address": "0xE3ce47AC96d8502824627d7cBCFDA49414beDa9C" + }, + "wavax-wei": { + "symbol": "axlAVAX", + "decimals": 18, + "name": "Wrapped AVAX", + "is_native": false, + "address": "0x6E76A241Ae6fcaD51C064Ac70fe6e676502b91c5" + }, + "wbnb-wei": { + "symbol": "axlBNB", + "decimals": 18, + "name": "Wrapped BNB", + "is_native": false, + "address": "0x23A6486099f740B7688A0bb7AED7C912015cA2F0" + }, + "wftm-wei": { + "symbol": "axlFTM", + "decimals": 18, + "name": "Wrapped Fantom", + "is_native": false, + "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8" }, "uatom": { "symbol": "axlATOM", @@ -1867,6 +2206,13 @@ "is_native": false, "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" }, + "utia": { + "symbol": "axlTIA", + "decimals": 6, + "name": "Axelar Wrapped TIA", + "is_native": false, + "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97" + }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, @@ -1874,6 +2220,13 @@ "is_native": false, "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" }, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": false, + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f" + }, "wfil-wei": { "symbol": "axlFIL", "decimals": 18, @@ -1881,1813 +2234,5045 @@ "is_native": false, "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" }, - "oath-wei": { - "symbol": "OATH", + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", + "is_native": false, + "address": "0x809c55916bb542c1419724022B3F0162087E3C88" + }, + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", + "is_native": false, + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B" + }, + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", + "is_native": false, + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5" + }, + "usomm": { + "symbol": "axlSOMM", + "decimals": 6, + "name": "Axelar Wrapped SOMM", + "is_native": false, + "address": "0x4e914bbDCDE0f455A8aC9d59d3bF739c46287Ed2" + }, + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", + "is_native": false, + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5" + }, + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", + "is_native": false, + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6" + }, + "aISLM": { + "symbol": "ISLM", "decimals": 18, - "name": "Oath Token", + "name": "Islamic Coin", "is_native": false, - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + "address": "0x2a98d978817949D45a5528013850772E762B7F12" }, - "knc-wei": { - "symbol": "axlKNC", + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", + "is_native": false, + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D" + }, + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", + "is_native": false, + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", + "is_native": false, + "address": "0x520391D410314451E12A85D79970a61915Bc315D" + }, + "yum-wei": { + "symbol": "YUM", "decimals": 18, - "name": "Kyber Network Crystal v2", + "name": "Yum", "is_native": false, - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" + "address": "0x9F41b34f42058a7b74672055a5fae22c4b113Fd1" }, - "ueuroc": { - "symbol": "axlEUROC", + "uxprt": { + "symbol": "XPRT", "decimals": 6, - "name": "Euro Coin", + "name": "XPRT native asset", "is_native": false, - "address": "0x061cc5a2C863E0C1Cb404006D559dB18A34C762d" + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8" }, - "wusdm-wei": { - "symbol": "wUSDM", + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7" + }, + "base-weth-wei": { + "symbol": "WETH", "decimals": 18, - "name": "Wrapped Mountain Protocol USD", + "name": "Wrapped Ether", + "is_native": true, + "address": "0x4200000000000000000000000000000000000006" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", "is_native": false, - "address": "0xa2B9e3a4c575aA54224dd202F2739F596Ea1ce7e" + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF" + }, + "cbbtc-satoshi": { + "symbol": "cbBTC", + "decimals": 8, + "name": "Coinbase Wrapped BTC", + "is_native": true, + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf" } }, - "comdex": { + "binance": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/E1616E7C19EA474C565737709A628D6F8A23FF9D3E9A7A6871306CF5E0A5341E" + "address": "0x4268B8F0B87b6Eae5d897996E6b845ddbD99Adf3" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x8b1f4432F943c465A973FeDC6d7aa50Fc96f1f65" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/54DEF693B7C4BF171E7FFF3ABFE2B54D6A3B8A047A32BAAE9F1417A378594EC6" + "address": "0xF02eaeEa1350DAD8fc7A66d6BddB25876243ed1F" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/F0BEB4540AF9E0C6C4DD6FA1635C9AE1F99FCA15366671C9219B1140AAC3FCB1" + "address": "0x4818B684a810fC023C32bB6292da8D508Bd906EF" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/0A6F20FA34BEBB63568E44C81C6E154C63ED061BA45E7EBC144B24C0DBBD0A4F" + "address": "0x448d59B4302aB5d2dadf9611bED9457491926c8e" }, - "pepe-wei": { - "symbol": "axlPEPE", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Pepe", + "name": "Wrapped Ether", "is_native": false, - "address": "ibc/A55A949CB5EE326933173D5CC23A97446EB4578D4F80F30C41B4D83E2643B37A" + "address": "0xfe7eDa5F2c56160d406869A8aA4B2F365d544C7B" }, - "dot-planck": { - "symbol": "axlDOT", - "decimals": 10, - "name": "xcDOT", + "wmai-wei": { + "symbol": "axlWMAI", + "decimals": 18, + "name": "Wrapped MAI", "is_native": false, - "address": "ibc/212040AC44BB9576E4E1B4DF0584C9D1C2D96C17D7ADC765927265D5D06ACF9D" - }, - "busd-wei": { - "symbol": "axlBUSD", - "decimals": 18, - "name": "Binance USD", - "is_native": false, - "address": "ibc/F960753B47A20B18DF578FFDD51FB8B32AF5BF77FF8718580421333F7458E690" + "address": "0x501e3d716A72E11E1e22eDcf0365556b357DA0c9" }, "wsteth-wei": { "symbol": "axl-wstETH", "decimals": 18, "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "ibc/DE312320E73AA1DECADE6C221DE2558C019F98738A0236BAB0CDCA0978D3108F" + "address": "0xb306669D6C024B3deA4ff3A35D50844289b2DCFC" }, - "cusd-wei": { - "symbol": "cUSD", + "lqdr-wei": { + "symbol": "axlLqdr", "decimals": 18, - "name": "Celo Dollar", + "name": "LqdrV2", "is_native": false, - "address": "ibc/BFFA844BCA844A82500E99E5576A844C9C12377B8EEAB7D1916AA81089965F97" + "address": "0x4b6B3d425F82248996D77EcC3F3df1E500aaC1db" }, - "cbeth-wei": { - "symbol": "cbETH", + "ern-wei": { + "symbol": "ERN", "decimals": 18, - "name": "Coinbase Wrapped Staked ETH", + "name": "Ethos Reserve Note", "is_native": false, - "address": "ibc/D43B0D7A298CD9AAA888FB8498C2D0130A2D25C95DCA23F310BD7401D4E1D2DF" + "address": "0xce1E3cc1950D2aAEb47dE04DE2dec2Dc86380E0A" + }, + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", + "is_native": false, + "address": "0x34A279Ece38f260a28C8872f416319e9B6Aa428e" + }, + "ukuji": { + "symbol": "KUJI", + "decimals": 6, + "name": "Kujira native asset", + "is_native": false, + "address": "0x073690e6CE25bE816E68F32dCA3e11067c9FB5Cc" }, "sfrxeth-wei": { "symbol": "sfrxETH", "decimals": 18, "name": "Staked Frax Ether", "is_native": false, - "address": "ibc/3A2B63D5098AEBD42CE789B2EE64E46FA8197431F6C687051934C48AAF53B8F6" + "address": "0x4E30B1B79bfF30840755FafafD9ce8e408131552" }, - "reth-wei": { - "symbol": "rETH", + "frxeth-wei": { + "symbol": "frxETH", "decimals": 18, - "name": "Rocket Pool ETH", + "name": "Frax Ether", "is_native": false, - "address": "ibc/801ACB1F9C49F88425A7173ACC5ADEE347271C0D7826AAA5060B1FE358C4667B" + "address": "0x39Db1A30122031751e803Fabf329C44efBBfBf4B" }, - "arb-wei": { - "symbol": "axlARB", + "sfrax-wei": { + "symbol": "sFRAX", "decimals": 18, - "name": "Arbitrum", + "name": "Staked FRAX", "is_native": false, - "address": "ibc/1398C0819479AA74844272A00CBFA44D1E7222E70CC7CC06DE4AAC96527C3B67" + "address": "0xa0F18d6Cc2BBE1Da31DE214389BBEfb73a0C836b" }, - "weth-wei": { - "symbol": "axlETH", + "fxs-wei": { + "symbol": "FXS", "decimals": 18, - "name": "Wrapped Ether", + "name": "Frax Share", "is_native": false, - "address": "ibc/81C3A46287D7664A8FD19843AC8D0CFD6C284EF1F750C661C48B3544277B1B29" + "address": "0x05E7857Cb748F0018C0CBCe3dfd575B0d8677aeF" }, - "wmatic-wei": { - "symbol": "axlMATIC", + "mpx-wei": { + "symbol": "MPX", "decimals": 18, - "name": "Wrapped Matic", + "name": "MPX", "is_native": false, - "address": "ibc/E8F0355CBC21AFD4C758E93383D28404D19AEB81E8251A63FAA0C250672ADBEF" + "address": "0x94C6B279b5df54b335aE51866d6E2A56BF5Ef9b7" }, - "wavax-wei": { - "symbol": "axlAVAX", + "ktc-wei": { + "symbol": "KTC", "decimals": 18, - "name": "Wrapped AVAX", - "is_native": false, - "address": "ibc/1D5738BD39B3189714B7A5C7CE8A206861ECAE79F7E29C45DA98151571F017E7" + "name": "KTX Community Token", + "is_native": true, + "address": "0x545356d4d69d8cD1213Ee7e339867574738751CA" }, - "wglmr-wei": { - "symbol": "axlGLMR", + "ovn-wei": { + "symbol": "OVN", "decimals": 18, - "name": "Wrapped GLMR", + "name": "OVN", "is_native": false, - "address": "ibc/14308B897F7966AD643E337853EC613200E9A123D159984DE7B59FE151BCE867" + "address": "0x259B30C916e440FB79747cD559207FfdaBBae057" }, - "wbnb-wei": { - "symbol": "axlBNB", + "oath-wei": { + "symbol": "OATH", "decimals": 18, - "name": "Wrapped BNB", + "name": "Oath Token", "is_native": false, - "address": "ibc/EC7576E3F8D254787264F0972E6518E42CFFB5305EC9D0BC7DD7B7FFEFACB28A" + "address": "0x73f4C95AF5C2892253c068850B8C9a753636f58d" }, - "wftm-wei": { - "symbol": "axlFTM", + "pols-wei": { + "symbol": "POLS", "decimals": 18, - "name": "Wrapped Fantom", + "name": "PolkastarterToken", "is_native": false, - "address": "ibc/78A0828C273648513517BC6C10D9F7F2768472DD5C0F88B27CB54E346CB57D59" + "address": "0x7117e08b0734e1D643bf29B523F41ff89a1A1367" }, - "rai-wei": { - "symbol": "axlRAI", + "knc-wei": { + "symbol": "axlKNC", "decimals": 18, - "name": "Rai Reflex Index", + "name": "Kyber Network Crystal v2", "is_native": false, - "address": "ibc/7FB70D35FF8085A02BDCDCB1DD2A2E6E5B56928853E34846F7C80C78AE3D5F1E" + "address": "0xDF34bE7f242EE338644d8d1a1f4D11a807b4Da5f" }, - "link-wei": { - "symbol": "axlLINK", + "orbs-wei": { + "symbol": "ORBS", "decimals": 18, - "name": "ChainLink Token", + "name": "Orbs", "is_native": false, - "address": "ibc/E37C113A206A0E27EC76453E66C045B1FB926F4A96E345D1C07455367BC4BE70" + "address": "0x43a8cab15D06d3a5fE5854D714C37E7E9246F170" }, - "frax-wei": { - "symbol": "axlFRAX", + "gdx-wei": { + "symbol": "GDX", "decimals": 18, - "name": "Frax", + "name": "Gridex", "is_native": false, - "address": "ibc/B0C60517B4B854164D87224AFF2D7633959BACD2402EB0BA460B64E95ED8D1ED" + "address": "0x4E11B45E4Ae94eE8c32760Dd3286836BDfe47524" }, - "mkr-wei": { - "symbol": "axlMKR", + "deus-wei": { + "symbol": "axlDEUS", "decimals": 18, - "name": "Maker", + "name": "DEUS", "is_native": false, - "address": "ibc/74C6699525ADB582D2893666CE2F62616BA90041A6D486A65B1C94AD163D6670" + "address": "0x912922e25ac79D524734d8eC0C882B035c5b356f" }, - "uni-wei": { - "symbol": "axlUNI", - "decimals": 18, - "name": "Uniswap", + "stuatom": { + "symbol": "stATOM", + "decimals": 6, + "name": "Stride Staked Atom", "is_native": false, - "address": "ibc/B101E08F99A58A725E02F7B3F6683F43F2ABA152CA63AD1522C526A54FEDEBD8" + "address": "0x4Bd3231E7eFc193F13a89b23ED6970776a91CF63" }, - "shib-wei": { - "symbol": "axlSHIB", + "stkbnb-wei": { + "symbol": "stkBNB", "decimals": 18, - "name": "SHIBA INU", - "is_native": false, - "address": "ibc/1F18934D62FFDA25C75ED7974EE34DB018BA004B58C42D46EB49AF41BB01AF01" + "name": "Staked BNB", + "is_native": true, + "address": "0xc2E9d07F66A89c44062459A47a0D2Dc038E4fb16" }, - "wfil-wei": { - "symbol": "axlFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/A781E56F6FA3F0C596212E23163B069CB95883FC4C8B364B961820206547544C" - } - }, - "cosmoshub": { - "uusdc": { - "symbol": "axlUSDC", + "ustrd": { + "symbol": "STRD", "decimals": 6, - "name": "USD Coin", + "name": "Stride", "is_native": false, - "address": "ibc/932D6003DA334ECBC5B23A071B4287D0A5CC97331197FE9F1C0689BA002A8421" + "address": "0x922946A8A2FAE7a8b4506bd54Ea361482Eff95dD" }, - "dai-wei": { - "symbol": "axlDAI", + "wbnb-wei": { + "symbol": "WBNB", "decimals": 18, - "name": "Dai Stablecoin", - "is_native": false, - "address": "ibc/4A98C8AC2C35498162346F28EEBF3206CBEF81F44725FE62A3DB0CC10E88E695" + "name": "Wrapped BNB", + "is_native": true, + "address": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c" }, - "uusdt": { - "symbol": "axlUSDT", + "uatom": { + "symbol": "axlATOM", "decimals": 6, - "name": "Tether USD", + "name": "Cosmoshub staking ATOM", "is_native": false, - "address": "ibc/5662412372381F56C5F83A0404DC7209E5143ABD32EF67B5705DBE8D9C2BF001" + "address": "0x3966001bEb78FD309665EA78FF8a4dA2E7E13180" }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", + "utia": { + "symbol": "axlTIA", + "decimals": 6, + "name": "Axelar Wrapped TIA", "is_native": false, - "address": "ibc/97F15E1BC69D4AAD938CAAA6CA5C963F6159C93059481246A8A26A113BC6BD2C" + "address": "0x420eEEd09Cbc6e8416decD28857fF3C7D991Fc46" }, "pepe-wei": { "symbol": "axlPEPE", "decimals": 18, "name": "Pepe", "is_native": false, - "address": "ibc/8558CA5E183C44947A9B63FC9BD75A18D0A2407025898A3B64AD782C4F3DBBCB" + "address": "0xE3a4277eFBe777B6B17CB7fFB7fEAf8C92cBE65A" }, - "dot-planck": { - "symbol": "axlDOT", - "decimals": 10, - "name": "xcDOT", + "uluna": { + "symbol": "LUNC", + "decimals": 6, + "name": "Axelar Wrapped LUNC", "is_native": false, - "address": "ibc/0D33E2077E140784912451ED189B11D78A4CD10C480C39E0CD91C67B1406B69F" + "address": "0x07aB0f18EA886fbbEcF52902E5F086D9363410a5" }, - "busd-wei": { - "symbol": "axlBUSD", + "frax-wei": { + "symbol": "axlFRAX", "decimals": 18, - "name": "Binance USD", + "name": "Frax", "is_native": false, - "address": "ibc/242AFD9038727F23A8CD966BFACAED25609FFA67DDD6BA5F3FB8FBEE1ED66FE3" + "address": "0x3FF4cb8EC5EC5eBBfD3424401D962F0627a67Cac" }, - "wsteth-wei": { - "symbol": "axl-wstETH", + "fpi-wei": { + "symbol": "FPI", "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "name": "Frax Price Index", "is_native": false, - "address": "ibc/11F00C6AA654FE1F7D5A8FBDC7D2E04A65B3101B306E82E3C35B35956161FED6" + "address": "0x78d24B91F0988F79AB9f370D607Ffc820d0779B8" }, - "cusd-wei": { - "symbol": "cUSD", + "wfil-wei": { + "symbol": "axlFIL", "decimals": 18, - "name": "Celo Dollar", + "name": "Wrapped FIL", "is_native": false, - "address": "ibc/E2AB763BC802DCEAAF86730EEAD634FD3030E031ACF7628E156B6971D15884E9" + "address": "0x49517abB880359eb873bDc08d09eBc0c478d3CA2" }, - "cbeth-wei": { - "symbol": "cbETH", - "decimals": 18, - "name": "Coinbase Wrapped Staked ETH", + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", "is_native": false, - "address": "ibc/32E40D2A360F537E5A3074854AEB65F2A8D6A130F9007422D704080BE5DAFAF2" + "address": "0x11eDFA12d70e8AC9e94DE019eBa278430873f8C3" }, - "sfrxeth-wei": { - "symbol": "sfrxETH", - "decimals": 18, - "name": "Staked Frax Ether", + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", "is_native": false, - "address": "ibc/0871D26D2C71319765EA323D6EB8B8A074706AD253FC7EB51E88E269A4CDB911" + "address": "0x9fD470124903957f299a1C90fEdA9043A4619cc6" }, - "reth-wei": { - "symbol": "rETH", - "decimals": 18, - "name": "Rocket Pool ETH", + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", "is_native": false, - "address": "ibc/516D98745F74798AABF395663BAB55AA4EDFC385D3083AF219F727955A1B94AF" + "address": "0xeB3e10979280aDd77f3E59cf220885646A852784" }, - "arb-wei": { - "symbol": "axlARB", - "decimals": 18, - "name": "Arbitrum", + "usomm": { + "symbol": "axlSOMM", + "decimals": 6, + "name": "Axelar Wrapped SOMM", "is_native": false, - "address": "ibc/0C0633DD7E89F87C13194513268F6E99C52F499A4EE511C560356F45B7C68433" + "address": "0xBa0651622b11110Ef1F04cE7c78f10ca0AF997bD" }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", "is_native": false, - "address": "ibc/3C168643B15498A2F8BA843649D7CF207EA2F5A7C8AE77BC175EC2FBF21B1BAA" + "address": "0x57FeE7e92887d7A4792b5917354D2ce557aa63e9" }, - "wmatic-wei": { - "symbol": "axlMATIC", - "decimals": 18, - "name": "Wrapped Matic", + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", "is_native": false, - "address": "ibc/BB5D7FBBA895E6E43EAD8D49E084319663139CA438E41796A0ACB657AE64E8F3" + "address": "0xfc59C4212122CBb52C9b22c9D59830Ab5b8E9c71" }, - "wavax-wei": { - "symbol": "axlAVAX", - "decimals": 18, - "name": "Wrapped AVAX", - "is_native": false, - "address": "ibc/E8F578B93A25BAE12A8BAD4C6973CF6D3BEB9AC019C8C77E566CE1FFB8F010F3" - }, - "wglmr-wei": { - "symbol": "axlGLMR", + "aISLM": { + "symbol": "ISLM", "decimals": 18, - "name": "Wrapped GLMR", + "name": "Islamic Coin", "is_native": false, - "address": "ibc/6CB279447A96B991FA8986DC4C22C866D215DE1DCDF5F833B81180329FE8001A" + "address": "0xB208C4451bc3DE576a836406bD785951b939503E" }, - "wbnb-wei": { - "symbol": "axlBNB", - "decimals": 18, - "name": "Wrapped BNB", + "factory/sei10hud5e5er4aul2l7sp2u9qp2lag5u4xf8mvyx38cnjvqhlgsrcls5qn5ke/seilor": { + "symbol": "axlSEILOR", + "decimals": 6, + "name": "Axelar Wrapped SEILOR", "is_native": false, - "address": "ibc/771FB23883042F959CDCB02F3D0501CC7F32EF4E28835EE4D7DA8CA7E8CF16F6" + "address": "0x518960F5d12eb192F89A73C2AE9b2BD369c73D40" }, - "wftm-wei": { - "symbol": "axlFTM", - "decimals": 18, - "name": "Wrapped Fantom", + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", "is_native": false, - "address": "ibc/80A8DBDCDC0AD1CF1781110E8438D894199BA2E4240A65DBB833A665E41620CB" + "address": "0xC3CAC4AE38cCf6985EF9039ACC1abBc874DdcBB0" }, - "uatom": { - "symbol": "ATOM", + "stutia": { + "symbol": "stTIA.axl", "decimals": 6, - "name": "Cosmoshub staking ATOM", - "is_native": true, - "address": "uatom" - }, - "rai-wei": { - "symbol": "axlRAI", - "decimals": 18, - "name": "Rai Reflex Index", + "name": "Stride Staked Tia", "is_native": false, - "address": "ibc/C2B86F0F77B3293EAB92C516CF249BD4CD5A168E5AC3BA5997F07A8D660CDEF2" + "address": "0x3Ef52A56Ce63f9d22F5ACdDA4e5Bd8b0c65C37a5" }, - "link-wei": { - "symbol": "axlLINK", - "decimals": 18, - "name": "ChainLink Token", + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", "is_native": false, - "address": "ibc/501C5C52E5D83DB2BA46067694AEEA51C4DC7BF56AA47BD34B12655BAF8B0DF1" + "address": "0x27443B27dfDf632390521C0b8A6fDaFe07d8f79f" }, - "frax-wei": { - "symbol": "axlFRAX", + "metal-wei": { + "symbol": "METAL", "decimals": 18, - "name": "Frax", + "name": "METAL", "is_native": false, - "address": "ibc/3792246C7C422C037C603C955F8383B4E32E7555D693344F9A029A67FE221C57" + "address": "0x6238825dcb3F6EcCf22A468faf36393753191043" }, - "mkr-wei": { - "symbol": "axlMKR", - "decimals": 18, - "name": "Maker", + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", "is_native": false, - "address": "ibc/61AC3A1AED345729B29DA6EC644431B70C1EEA3FFE95DAF2ED241F84EEA37638" + "address": "0xd060040976a02f0e330d3ADFEb5dc418f41Da80A" }, - "uni-wei": { - "symbol": "axlUNI", - "decimals": 18, - "name": "Uniswap", + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", "is_native": false, - "address": "ibc/A912768BDDAC10A4337F50D91A033DA13EE41285732E82F929EF34E1B2FB3630" + "address": "0xceBd6A207FEFfc6140AE37a2D2B3b3818F1aF0Ad" }, - "shib-wei": { - "symbol": "axlSHIB", - "decimals": 18, - "name": "SHIBA INU", + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", "is_native": false, - "address": "ibc/30A1266CA3CEC8347C2FB57E70041A484FD14BE06A089DBAFCD8F7FE8F2D36B3" + "address": "0x15C6cadcc3B920D7D811c1Bbec96FA5e6f449eF9" }, - "wfil-wei": { - "symbol": "axlFIL", - "decimals": 18, - "name": "Wrapped FIL", + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", "is_native": false, - "address": "ibc/C201372C3C7295C707363ADA2B84E215E0D0B324A025E28136F4FA305D32251E" + "address": "0xFfeB8287dE7DC756067e171e9919c730f0636680" } }, - "crescent": { + "carbon": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/BFF0D3805B50D93E2FA5C0B2DDF7E0B30A631076CD80BC12A48C0E95404B4A41" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "ibc/0634D0993744740D675AD01E81156EAC945AEAAE17C074918DC7FF52F41B263E" + "address": "ibc/7C0807A56073C4A27B0DE1C21BA3EB75DF75FD763F4AD37BC159917FC01145F0" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/2017AFA149C1C42DBF54EC910DA168E9E4F928DF0D3A8E841189994A9339FED9" + "address": "ibc/7E8C893B624C33274D18279546DE9353BCABF22B423D7D5E78B298144B23C6B2" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/11FB4C0BC2FCCFF2B01976C0070F468D82DAE8D1F565F80E64063BFDBEE4A5BD" + "address": "ibc/812FE3017D74992A23CF4D65DCEBC5688B2F9D5595CBA7E7447522C6F2152778" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/7FFC60524C4513A3A8E0A407CC89BFF5A861EC624209D72EB26FC10ADAEBA70E" + "address": "ibc/9CCCFA44CA6F74517C3E3416971EF2B7EC8506F2A00C62C660935DD9CB5E1C63" }, - "pepe-wei": { - "symbol": "axlPEPE", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Pepe", + "name": "Wrapped Ether", "is_native": false, - "address": "ibc/796FAF4E82B4EB778E18F4E0A2C67C9CF55D5ACD176F3B6FD6DC420ABDDBABC1" + "address": "ibc/DC44871FDB10B6FB4D4089247AA918B0F30428C8911AFB6192D98AE8E38E31CB" }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, "name": "xcDOT", "is_native": false, - "address": "ibc/3208C8E45C27903988E437162134A172880BE112C0530B86117FB5DA7A5DF8B9" + "address": "ibc/14EEA1138E7AF7E8F531DA1F94C4D2BCA0354621AD84A6FC5FF7843901F77DA6" }, "busd-wei": { "symbol": "axlBUSD", "decimals": 18, "name": "Binance USD", "is_native": false, - "address": "ibc/A7A2B8871CD2E999EB1D9E901B4F744617C80816CE94DE84CA1200109651C903" - }, - "wsteth-wei": { - "symbol": "axl-wstETH", - "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", - "is_native": false, - "address": "ibc/F5BBAD34906B6ED73EB17652C47F7F34D2FFB8AC06712E0396F2F28E69DB40C0" - }, - "cusd-wei": { - "symbol": "cUSD", - "decimals": 18, - "name": "Celo Dollar", - "is_native": false, - "address": "ibc/EE7021E472B8DB0DB824CB409AB30822E50BBFBE5FB78C3B4719904911A36A22" - }, - "cbeth-wei": { - "symbol": "cbETH", - "decimals": 18, - "name": "Coinbase Wrapped Staked ETH", - "is_native": false, - "address": "ibc/CBBAAEAB4BD5DDD23E38311BA333E519EFC66116BB6E5338AF51DA59A606F015" - }, - "sfrxeth-wei": { - "symbol": "sfrxETH", - "decimals": 18, - "name": "Staked Frax Ether", - "is_native": false, - "address": "ibc/11261571EB3E679315BA19C51F42F143113A139F598729D97624B45043C4D7C0" - }, - "reth-wei": { - "symbol": "rETH", - "decimals": 18, - "name": "Rocket Pool ETH", - "is_native": false, - "address": "ibc/6026097599D36D6882664C0FC14A67A5DDA0AE76EDCC07062A8E7B74FA8A8D59" - }, - "arb-wei": { - "symbol": "axlARB", - "decimals": 18, - "name": "Arbitrum", - "is_native": false, - "address": "ibc/BAF32343C8B21CCEB63BA035621B6ED86CFA883AC71B8217D9F9DA32CDA2E3B4" - }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/F1806958CA98757B91C3FA1573ECECD24F6FA3804F074A6977658914A49E65A3" + "address": "ibc/AD706B02DD4D8468C287D2F22E4BA2FB80338DF5C1F4035086411074B755A485" }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/C322C7D0867CC3EE6FA3495DC9685E5A0F49B506369341287FDA1E110841A950" + "address": "ibc/E74941AEE93FA5FBC9195082758763917D56E2E05A48AE094AD142AA2DD10B7A" }, "wavax-wei": { "symbol": "axlAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/0886E3462B7DD438353781848DBDF90E58BB7DE90266E3F95E41B3FA8ED1B453" + "address": "ibc/608FB6C36692B78844D22BC125F59CF46011B27B053DA40F730A15BCB248C3A8" }, "wglmr-wei": { "symbol": "axlGLMR", "decimals": 18, "name": "Wrapped GLMR", "is_native": false, - "address": "ibc/A7C06A800850847DBCC36213185EC5AAD3C719D42D1F0623F9C1F9EFF456F673" + "address": "ibc/DA5F22C49C88D4B0AAB0E2275D320078EE98610EEB10AEC847929CCF2137144C" }, "wbnb-wei": { "symbol": "axlBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/3D4499D811B055223D0EFB06D2211F84772CAEF0FB987F71BAE716191714B391" + "address": "ibc/DF9C9A15AB22971A4F65FB8F471459A757745F9709905A599D5011E69FE3C375" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "ibc/23B62EFD1B9444733889B42362570C774801430A1C656A0A3F8D6D69AE93ED8B" + "address": "ibc/2D4399D27A3988E41C1FA4CF3F0CCCDEA4094646A5C3B483D7508069489F860C" }, "rai-wei": { "symbol": "axlRAI", "decimals": 18, "name": "Rai Reflex Index", "is_native": false, - "address": "ibc/A1F1BAE8D0CF9F8080C22FE2B0C60DFD25E96F4F985AC27C7E11F5A597CEE83D" + "address": "ibc/0FDA701E39D7B52F00B75B692E3BD6B3AB7841EE396517EE3DBC3D31AE42A5D2" }, "link-wei": { "symbol": "axlLINK", "decimals": 18, "name": "ChainLink Token", "is_native": false, - "address": "ibc/1AD2DD08D1AADAE7F667F82767425FEC119BAFEA5F514FCEA22E6E4E446BEADA" + "address": "ibc/8B40CD07C94E82E3AD214FF8EB5230040E9440AC1F77B6880CFF893C6F62E13D" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "ibc/21DB3093824F38A29399E7466B5870559AEC683D0D09D746F9EC47BB8505CBF7" + "address": "ibc/F3146333E033F2F20125A2F9879F0DEED990B1005FFAF77873CC4E405FBDE8C4" }, "mkr-wei": { "symbol": "axlMKR", "decimals": 18, "name": "Maker", "is_native": false, - "address": "ibc/1E8149AC74041CF61448A57858887B2D2C221B9B194509120BD3AD6E4278AAB0" + "address": "ibc/D1506C95F0BDB40B370C7AE12FAC073B350DB11CF00A9B7251EB6CEF7D9F73DF" }, "uni-wei": { "symbol": "axlUNI", "decimals": 18, "name": "Uniswap", "is_native": false, - "address": "ibc/392F7936508B675F7F794504F4829D6F459C0E7488EDE6B2C4E9192037E3F03F" + "address": "ibc/133B6981CB7857696D1CEEBB1D3A953B507D602241C3DE90EAAC1F7C92067BAD" }, "shib-wei": { "symbol": "axlSHIB", "decimals": 18, "name": "SHIBA INU", "is_native": false, - "address": "ibc/D1F6A3A1A3C2E25A7039B4537E8D1B08490B6A3F57D758AB8C08AA512CE3E51A" + "address": "ibc/D8006E3E5D69B1B3A167E79E87A2A56999EE1EF060CCA62C4D15C1046F586C39" }, - "wfil-wei": { - "symbol": "axlFIL", + "wmnt-wei": { + "symbol": "WMNT", "decimals": 18, - "name": "Wrapped FIL", + "name": "Wrapped Mantle", "is_native": false, - "address": "ibc/E2422AEF428C089CD74169065BF478C26499FAEE1FE936B87A95905BCFDB6E33" + "address": "ibc/80225543AE8CFD1729533264C3672442769B79AC1C80AA66ED0646D9BE02EFF2" } }, - "ethereum": { + "celestia": { + "utia": { + "symbol": "TIA", + "decimals": 6, + "name": "Axelar Wrapped TIA", + "is_native": true, + "address": "utia" + } + }, + "celo": { "uusdc": { - "symbol": "USDC", + "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", - "is_native": true, - "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" + "is_native": false, + "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "0x467719aD09025FcC6cF6F8311755809d45a5E5f3" + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, "dai-wei": { - "symbol": "DAI", + "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", - "is_native": true, - "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F" + "is_native": false, + "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7" }, "uusdt": { - "symbol": "USDT", + "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", - "is_native": true, - "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7" + "is_native": false, + "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" }, "wbtc-satoshi": { - "symbol": "WBTC", + "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", - "is_native": true, - "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599" + "is_native": false, + "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" }, - "pepe-wei": { - "symbol": "PEPE", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Pepe", - "is_native": true, - "address": "0x6982508145454Ce325dDbE47a25d4ec3d2311933" + "name": "Wrapped Ether", + "is_native": false, + "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" }, "wmai-wei": { - "symbol": "WMAI", + "symbol": "axlWMAI", "decimals": 18, "name": "Wrapped MAI", - "is_native": true, - "address": "0x05770332D4410b6D7f07Fd497E4c00F8F7bFb74A" + "is_native": false, + "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" }, - "busd-wei": { - "symbol": "BUSD", + "wusdm-wei": { + "symbol": "wUSDM", "decimals": 18, - "name": "Binance USD", - "is_native": true, - "address": "0x4Fabb145d64652a948d72533023f6E7A623C7C53" + "name": "Wrapped Mountain Protocol USD", + "is_native": false, + "address": "0xa2B9e3a4c575aA54224dd202F2739F596Ea1ce7e" }, - "wsteth-wei": { - "symbol": "wstETH", - "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", - "is_native": true, - "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0" + "ueuroc": { + "symbol": "axlEUROC", + "decimals": 6, + "name": "Euro Coin", + "is_native": false, + "address": "0x061cc5a2C863E0C1Cb404006D559dB18A34C762d" }, - "cbeth-wei": { - "symbol": "cbETH", + "cusd-wei": { + "symbol": "cUSD", "decimals": 18, - "name": "Coinbase Wrapped Staked ETH", + "name": "Celo Dollar", "is_native": true, - "address": "0xBe9895146f7AF43049ca1c1AE358B0541Ea49704" + "address": "0x765DE816845861e75A25fCA122bb6898B8B1282a" }, "sfrxeth-wei": { "symbol": "sfrxETH", "decimals": 18, "name": "Staked Frax Ether", - "is_native": true, - "address": "0xac3E018457B222d93114458476f3E3416Abbe38F" + "is_native": false, + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" }, - "reth-wei": { - "symbol": "rETH", + "frxeth-wei": { + "symbol": "frxETH", "decimals": 18, - "name": "Rocket Pool ETH", - "is_native": true, - "address": "0xae78736Cd615f374D3085123A210448E74Fc6393" + "name": "Frax Ether", + "is_native": false, + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D" + }, + "sfrax-wei": { + "symbol": "sFRAX", + "decimals": 18, + "name": "Staked FRAX", + "is_native": false, + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" + }, + "fxs-wei": { + "symbol": "FXS", + "decimals": 18, + "name": "Frax Share", + "is_native": false, + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721" + }, + "oath-wei": { + "symbol": "OATH", + "decimals": 18, + "name": "Oath Token", + "is_native": false, + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + }, + "knc-wei": { + "symbol": "axlKNC", + "decimals": 18, + "name": "Kyber Network Crystal v2", + "is_native": false, + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" }, "stuatom": { "symbol": "stATOM", "decimals": 6, - "name": null, + "name": "Stride Staked Atom", "is_native": false, - "address": "0x2924894E7886C6B9018179946EE389bb06534021" + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" }, "ustrd": { "symbol": "STRD", "decimals": 6, - "name": null, + "name": "Stride", "is_native": false, - "address": "0x85eBBf7253295d37C5FC98bE5Aac87CA4378c2e2" - }, - "weth-wei": { - "symbol": "WETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": true, - "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F" }, "uatom": { "symbol": "axlATOM", "decimals": 6, "name": "Cosmoshub staking ATOM", "is_native": false, - "address": "0x27292cf0016E5dF1d8b37306B2A98588aCbD6fCA" - }, - "uluna": { - "symbol": "LUNC", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x31DAB3430f3081dfF3Ccd80F17AD98583437B213" - }, - "uusd": { - "symbol": "USTC", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x085416975fe14C2A731a97eC38B9bF8135231F62" - }, - "rai-wei": { - "symbol": "RAI", - "decimals": 18, - "name": "Rai Reflex Index", - "is_native": true, - "address": "0x03ab458634910AaD20eF5f1C8ee96F1D6ac54919" - }, - "link-wei": { - "symbol": "LINK", - "decimals": 18, - "name": "ChainLink Token", - "is_native": true, - "address": "0x514910771AF9Ca656af840dff83E8264EcF986CA" + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" }, "frax-wei": { - "symbol": "FRAX", + "symbol": "axlFRAX", "decimals": 18, "name": "Frax", - "is_native": true, - "address": "0x853d955aCEf822Db058eb8505911ED77F175b99e" - }, - "mkr-wei": { - "symbol": "MKR", - "decimals": 18, - "name": "Maker", - "is_native": true, - "address": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2" - }, - "uni-wei": { - "symbol": "UNI", - "decimals": 18, - "name": "Uniswap", - "is_native": true, - "address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984" + "is_native": false, + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" }, - "shib-wei": { - "symbol": "SHIB", + "fpi-wei": { + "symbol": "FPI", "decimals": 18, - "name": "SHIBA INU", - "is_native": true, - "address": "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE" + "name": "Frax Price Index", + "is_native": false, + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f" }, "wfil-wei": { "symbol": "axlFIL", "decimals": 18, "name": "Wrapped FIL", "is_native": false, - "address": "0x6A7b717aE5Ed65F85BA25403D5063D368239828e" - }, - "yieldusd-wei": { - "symbol": "YieldUSD", - "decimals": 18, - "name": "Real Yield USD", - "is_native": true, - "address": "0x97e6E0a40a3D02F12d1cEC30ebfbAE04e37C119E" - }, - "yieldeth-wei": { - "symbol": "YieldETH", - "decimals": 18, - "name": "Real Yield ETH", - "is_native": true, - "address": "0xb5b29320d2Dde5BA5BAFA1EbcD270052070483ec" + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" }, - "ern-wei": { - "symbol": "ERN", - "decimals": 18, - "name": "Ethos Reserve Note", + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", "is_native": false, - "address": "0x91A69021b0BaeF3445E51726458a0CE601471846" + "address": "0x809c55916bb542c1419724022B3F0162087E3C88" }, - "uumee": { - "symbol": "UMEE", + "uhuahua": { + "symbol": "HUAHUA", "decimals": 6, - "name": null, + "name": "Chihuahua native asset", "is_native": false, - "address": "0x923e030f951A2401426a3407a9bcc7EB715d9a0b" + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B" }, - "lqdr-wei": { - "symbol": "axlLqdr", - "decimals": 18, - "name": "LqdrV2", + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", "is_native": false, - "address": "0x98504C8afa7c74c87a0641a7bb0F7968d4e8F471" - }, - "wdoge-wei": { - "symbol": "WDOGE", - "decimals": 8, - "name": "Wrapped DOGE", - "is_native": true, - "address": "0x8aa9381b2544b48c26f3b850F6e07E2c5161EB3e" + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5" }, - "oath-wei": { - "symbol": "OATH", - "decimals": 18, - "name": "Oath Token", + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", "is_native": false, - "address": "0xd20523b39fAF1D6e9023a4D6085f87B7b0DE7926" - }, - "pols-wei": { - "symbol": "POLS", - "decimals": 18, - "name": "PolkastarterToken", - "is_native": true, - "address": "0x83e6f1E41cdd28eAcEB20Cb649155049Fac3D5Aa" - }, - "knc-wei": { - "symbol": "KNC", - "decimals": 18, - "name": "Kyber Network Crystal v2", - "is_native": true, - "address": "0xdeFA4e8a7bcBA345F687a2f1456F5Edd9CE97202" - }, - "orbs-wei": { - "symbol": "ORBS", - "decimals": 18, - "name": "Orbs", - "is_native": true, - "address": "0xff56Cc6b1E6dEd347aA0B7676C85AB0B3D08B0FA" + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5" }, - "gdx-wei": { - "symbol": "GDX", - "decimals": 18, - "name": "Gridex", + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", "is_native": false, - "address": "0x89901994b5Ed81cbbcBC4E5A7e0cC4e7F58e5458" + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6" }, - "deus-wei": { - "symbol": "axlDEUS", + "aISLM": { + "symbol": "ISLM", "decimals": 18, - "name": "DEUS", + "name": "Islamic Coin", "is_native": false, - "address": "0x69e557b926F4eEf6d9400e36DBBFEb9600Af2880" + "address": "0x2a98d978817949D45a5528013850772E762B7F12" }, - "stern-wei": { - "symbol": "stERN", - "decimals": 18, - "name": "Staked ERN Vault", + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", "is_native": false, - "address": "0xeA0cFDC2667bE69ED724c8069d358502fF41cA18" + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D" }, - "ueuroc": { - "symbol": "EUROC", + "stutia": { + "symbol": "stTIA.axl", "decimals": 6, - "name": "Euro Coin", - "is_native": true, - "address": "0x1aBaEA1f7C830bD89Acc67eC4af516284b1bC33c" + "name": "Stride Staked Tia", + "is_native": false, + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61" }, - "vext-wei": { - "symbol": "VEXT", - "decimals": 18, - "name": "Veloce", + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", "is_native": false, - "address": "0x593Dc8C08387c9F4C8d522B49C76dD18518F4d7e" + "address": "0x520391D410314451E12A85D79970a61915Bc315D" }, - "bal-wei": { - "symbol": "BAL", - "decimals": 18, - "name": "Balancer", - "is_native": true, - "address": "0xba100000625a3754423978a60c9317c58a424e3D" + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", + "is_native": false, + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8" }, - "utia": { - "symbol": "axlTIA", + "ubtsg": { + "symbol": "BTSG", "decimals": 6, - "name": null, + "name": "BTSG native asset", "is_native": false, - "address": "0x65e3fA51C4ce0af1B9CD5CBC7C5fDb80a09D431D" + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7" }, - "wusdm-wei": { - "symbol": "wUSDM", - "decimals": 18, - "name": "Wrapped Mountain Protocol USD", - "is_native": true, - "address": "0x57F5E098CaD7A3D1Eed53991D4d66C45C9AF7812" + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7" }, - "sfrax-wei": { - "symbol": "sFRAX", - "decimals": 18, - "name": "Staked FRAX", - "is_native": true, - "address": "0xA663B02CF0a4b149d2aD41910CB81e23e1c41c32" + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF" } }, - "evmos": { + "centrifuge": {}, + "chihuahua": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/63C53CBDF471D4E867366ABE2E631197257118D1B2BEAD1946C8A408F96464C3" + "address": "ibc/3816292E7134C03F261BA0E1CF4ED8E46E74DEF348A8BD4DF72E337CCFA482A6" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/CBA4784581AD4BEF308C536A3CD44D4A940A520E61B0D1E4FB115C539F61DEE5" + "address": "ibc/F48B3B627C171F624981E7B7FD35E2CBB1D1E6FFA7B2AA21D061E5F5311EE967" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/F11C8CB7743E4B5FDCEA7C97F3B2C115E1931C5614B84C183DAC439B4C919D94" + "address": "ibc/2C83DBEAE95BA3AF162A2967039596F7B465D2800F0F7A7F9F981800FC6ADF0A" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/C834CD421B4FD910BBC97E06E86B5E6F64EA2FE36D6AE0E4304C2E1FB1E7333C" + "address": "ibc/2E80C27E71B1FBC42DF7F91531E529CB742F4F31BAE0CEB1937D3B509F975010" }, - "pepe-wei": { - "symbol": "axlPEPE", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Pepe", + "name": "Wrapped Ether", "is_native": false, - "address": "ibc/26E6508A1757E12B15A087E951F5D35E73CF036F0D97BC809E1598D1DD870BED" + "address": "ibc/E614301CF4F54C23FAEEBF50F33D247AC743E9F247AB094AC57F68DB3A80635C" }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, "name": "xcDOT", "is_native": false, - "address": "ibc/80938A67AB5C2302E74919802F40F9F3A9CCE40FC878361AA4A53734EC40AF5A" + "address": "ibc/DD3177CE3C8E5FBAFC70007BAAF7D4798C527FD6C7E6145BF7ADF3E92C6F09E3" }, "busd-wei": { "symbol": "axlBUSD", "decimals": 18, "name": "Binance USD", "is_native": false, - "address": "ibc/3A7C0D680D0F50A98115966A22C01594897FAE924FAF324E13C5FFB89F6864BF" + "address": "ibc/F56FA94F0B3C96D03EB180A6D783FA1C8687E2C14E783AA5AAF27A5202877039" }, - "wsteth-wei": { - "symbol": "axl-wstETH", + "wmatic-wei": { + "symbol": "axlMATIC", "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "name": "Wrapped Matic", "is_native": false, - "address": "ibc/43BD3A576550CDCD183BC093AEB610B3C2057AD12BA3C27D67AE9F4BCA74F2C8" + "address": "ibc/90CC92BD6683D3D39933223D50FB678B6C2EDC4F4B048E21BF358570B2087916" }, - "cusd-wei": { - "symbol": "cUSD", + "wavax-wei": { + "symbol": "axlAVAX", "decimals": 18, - "name": "Celo Dollar", + "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/F3D7473CC857F9D631A2EC0A1D61382C437BDB6BC98D4A512A4DD79A341C8CC4" + "address": "ibc/0D2A39F3DF653685ED16DED245C83A51B9DD6CB8A55DE2C39D194BE44C108765" }, - "cbeth-wei": { - "symbol": "cbETH", + "wglmr-wei": { + "symbol": "axlGLMR", + "decimals": 18, + "name": "Wrapped GLMR", + "is_native": false, + "address": "ibc/0455906690F45688133B2A3509613334F06E8CE0EA601A73DC5907348DF79769" + }, + "wbnb-wei": { + "symbol": "axlBNB", + "decimals": 18, + "name": "Wrapped BNB", + "is_native": false, + "address": "ibc/B01BF7CF633570B1541B601B1D538B890005436D5F0903FF4398166A7CBDB77F" + }, + "wftm-wei": { + "symbol": "axlFTM", + "decimals": 18, + "name": "Wrapped Fantom", + "is_native": false, + "address": "ibc/95482BCD668E74C030E1B8CE0874A447A593C144C8E9DB41BE05B7A9495ECDD7" + }, + "rai-wei": { + "symbol": "axlRAI", + "decimals": 18, + "name": "Rai Reflex Index", + "is_native": false, + "address": "ibc/C44E99E2E15ED8FE3510DCCD1122B2B992E8ACAE981CD8C35ABF720909493E96" + }, + "link-wei": { + "symbol": "axlLINK", + "decimals": 18, + "name": "ChainLink Token", + "is_native": false, + "address": "ibc/B8BBF468B7BBD7BB5270CCBA5D3E0F763364B20D7AD661DA2E3D8D4392F8033A" + }, + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", + "is_native": false, + "address": "ibc/8B3C7322C23BACEF0943A4B967FF188B4553D2960401CC4C82691CFAFE825C4E" + }, + "mkr-wei": { + "symbol": "axlMKR", + "decimals": 18, + "name": "Maker", + "is_native": false, + "address": "ibc/F6A041E3BD6A8FDE1BDD3412C8E88E61FDA3D88A36EE3AAC3A9002ADF15496D7" + }, + "uni-wei": { + "symbol": "axlUNI", + "decimals": 18, + "name": "Uniswap", + "is_native": false, + "address": "ibc/06885C16A675F4014E987D26D3873710B6FC5519C1AED535B8CB5AFE0EE2FFCB" + }, + "shib-wei": { + "symbol": "axlSHIB", + "decimals": 18, + "name": "SHIBA INU", + "is_native": false, + "address": "ibc/0B3614BED25B82953A184B4AB7F2F96661443BEB2645ACACA85F3B32BF45B329" + }, + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", + "is_native": true, + "address": "uhuahua" + }, + "pepe-wei": { + "symbol": "axlPEPE", + "decimals": 18, + "name": "Pepe", + "is_native": false, + "address": "ibc/62039EAA4748958D1F4CB46A63CDF68CC7E9771FA422D0E1504363FD9A1C8A8C" + }, + "wdoge-wei": { + "symbol": "axlWDOGE", + "decimals": 8, + "name": "Wrapped DOGE", + "is_native": false, + "address": "ibc/6F2ADA3FFD9C40004392E3BBAA8864D4AE88A1C5D8F96D0E300620335A64AE75" + } + }, + "comdex": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "ibc/E1616E7C19EA474C565737709A628D6F8A23FF9D3E9A7A6871306CF5E0A5341E" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "ibc/54DEF693B7C4BF171E7FFF3ABFE2B54D6A3B8A047A32BAAE9F1417A378594EC6" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "ibc/F0BEB4540AF9E0C6C4DD6FA1635C9AE1F99FCA15366671C9219B1140AAC3FCB1" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "ibc/0A6F20FA34BEBB63568E44C81C6E154C63ED061BA45E7EBC144B24C0DBBD0A4F" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/81C3A46287D7664A8FD19843AC8D0CFD6C284EF1F750C661C48B3544277B1B29" + }, + "dot-planck": { + "symbol": "axlDOT", + "decimals": 10, + "name": "xcDOT", + "is_native": false, + "address": "ibc/212040AC44BB9576E4E1B4DF0584C9D1C2D96C17D7ADC765927265D5D06ACF9D" + }, + "busd-wei": { + "symbol": "axlBUSD", + "decimals": 18, + "name": "Binance USD", + "is_native": false, + "address": "ibc/F960753B47A20B18DF578FFDD51FB8B32AF5BF77FF8718580421333F7458E690" + }, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "ibc/DE312320E73AA1DECADE6C221DE2558C019F98738A0236BAB0CDCA0978D3108F" + }, + "cusd-wei": { + "symbol": "cUSD", + "decimals": 18, + "name": "Celo Dollar", + "is_native": false, + "address": "ibc/BFFA844BCA844A82500E99E5576A844C9C12377B8EEAB7D1916AA81089965F97" + }, + "cbeth-wei": { + "symbol": "cbETH", "decimals": 18, "name": "Coinbase Wrapped Staked ETH", "is_native": false, - "address": "ibc/1D1A84E64A5AD847ABBE3195DDB39F3B2E1BCEC2B42FBB3DBEE4BA856F0ACA67" + "address": "ibc/D43B0D7A298CD9AAA888FB8498C2D0130A2D25C95DCA23F310BD7401D4E1D2DF" }, "sfrxeth-wei": { "symbol": "sfrxETH", "decimals": 18, "name": "Staked Frax Ether", "is_native": false, - "address": "ibc/0C9C3EAE01AB2438F14032341507E51759FD1871BACF35078361A10AB02F3BE1" + "address": "ibc/3A2B63D5098AEBD42CE789B2EE64E46FA8197431F6C687051934C48AAF53B8F6" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "ibc/79CD5764EEFEDCBB95E745DAAA5E1C1B1B6C161EA0F8FE1AC305A27865165B4E" }, "reth-wei": { "symbol": "rETH", "decimals": 18, "name": "Rocket Pool ETH", "is_native": false, - "address": "ibc/6A3538834873D16F00D0268B295A8D6FD9B005952787AA14726D0013A51042AC" + "address": "ibc/801ACB1F9C49F88425A7173ACC5ADEE347271C0D7826AAA5060B1FE358C4667B" }, "arb-wei": { "symbol": "axlARB", "decimals": 18, "name": "Arbitrum", "is_native": false, - "address": "ibc/9FD0BDCFC4BA32643C3CAE55BE9C80C5F5B99871BABDC8C13DE922449B9188D2" - }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/356EDE917394B2AEF7F915EB24FA683A0CCB8D16DD4ECCEDC2AD0CEC6B66AC81" + "address": "ibc/1398C0819479AA74844272A00CBFA44D1E7222E70CC7CC06DE4AAC96527C3B67" }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/7883D6C40128A175BF42226F013671C0B190F2AC2CA9215896EBD6F7F7097A77" + "address": "ibc/E8F0355CBC21AFD4C758E93383D28404D19AEB81E8251A63FAA0C250672ADBEF" }, "wavax-wei": { "symbol": "axlAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/990770DB97A9567A0B794EB5A3A9BD02C939CE538661FA2DB44DD791CF16DC0E" + "address": "ibc/1D5738BD39B3189714B7A5C7CE8A206861ECAE79F7E29C45DA98151571F017E7" }, "wglmr-wei": { "symbol": "axlGLMR", "decimals": 18, "name": "Wrapped GLMR", "is_native": false, - "address": "ibc/E9528EEB1589F209D5EA99BA6BDB1634A65DFD883769D53072DDD26FE7DE8CA3" + "address": "ibc/14308B897F7966AD643E337853EC613200E9A123D159984DE7B59FE151BCE867" }, "wbnb-wei": { "symbol": "axlBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/5BDA280DA1EA865301F0DB343F87971D6E6C399152B335D8CE475EEA2BA38D21" + "address": "ibc/EC7576E3F8D254787264F0972E6518E42CFFB5305EC9D0BC7DD7B7FFEFACB28A" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "ibc/B389DF077401C819F7A4235167AC1399790FB819983191A3AFC646C7364D24C9" + "address": "ibc/78A0828C273648513517BC6C10D9F7F2768472DD5C0F88B27CB54E346CB57D59" + }, + "pepe-wei": { + "symbol": "axlPEPE", + "decimals": 18, + "name": "Pepe", + "is_native": false, + "address": "ibc/A55A949CB5EE326933173D5CC23A97446EB4578D4F80F30C41B4D83E2643B37A" }, "rai-wei": { "symbol": "axlRAI", "decimals": 18, "name": "Rai Reflex Index", "is_native": false, - "address": "ibc/4811C8371D83DFFFB92E0F51B70E6324E8F2BAA3AD406E20A1935D44E67BE15B" + "address": "ibc/7FB70D35FF8085A02BDCDCB1DD2A2E6E5B56928853E34846F7C80C78AE3D5F1E" }, "link-wei": { "symbol": "axlLINK", "decimals": 18, "name": "ChainLink Token", "is_native": false, - "address": "ibc/0867589CE15E292BB84404A025BC883CE7FB58000C1809040A090701AEB20FE5" + "address": "ibc/E37C113A206A0E27EC76453E66C045B1FB926F4A96E345D1C07455367BC4BE70" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "ibc/6659354677AD62F7B4B30AEEB613E1100550D373366AFE33D54C5927BA868137" + "address": "ibc/B0C60517B4B854164D87224AFF2D7633959BACD2402EB0BA460B64E95ED8D1ED" }, "mkr-wei": { "symbol": "axlMKR", "decimals": 18, "name": "Maker", "is_native": false, - "address": "ibc/620628A7B308C0B1CCC109A9CFD9BC8089F9A527674C91733B1E15D9A65CF567" + "address": "ibc/74C6699525ADB582D2893666CE2F62616BA90041A6D486A65B1C94AD163D6670" }, "uni-wei": { "symbol": "axlUNI", "decimals": 18, "name": "Uniswap", "is_native": false, - "address": "ibc/7B9ED005F19A3E02972D6CE0703EA8535D8E19C6C9064173B26DAFFBCB089D5E" + "address": "ibc/B101E08F99A58A725E02F7B3F6683F43F2ABA152CA63AD1522C526A54FEDEBD8" }, "shib-wei": { "symbol": "axlSHIB", "decimals": 18, "name": "SHIBA INU", "is_native": false, - "address": "ibc/C89E6FC9D23CE6A43F8B9B1219AA4B68F795F92F33685A87522E9A09EA6A1E20" + "address": "ibc/1F18934D62FFDA25C75ED7974EE34DB018BA004B58C42D46EB49AF41BB01AF01" }, "wfil-wei": { "symbol": "axlFIL", "decimals": 18, "name": "Wrapped FIL", "is_native": false, - "address": "ibc/8CB83D948B63CB15AFF6F4E19EE9B35C65FEEEE514457965DA67E3A339F3975A" + "address": "ibc/A781E56F6FA3F0C596212E23163B069CB95883FC4C8B364B961820206547544C" } }, - "fantom": { + "cosmoshub": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "0x1B6382DBDEa11d97f24495C9A90b7c88469134a4" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x8b1f4432F943c465A973FeDC6d7aa50Fc96f1f65" + "address": "ibc/932D6003DA334ECBC5B23A071B4287D0A5CC97331197FE9F1C0689BA002A8421" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "0xD5d5350F42CB484036A1C1aF5F2DF77eAFadcAFF" + "address": "ibc/4A98C8AC2C35498162346F28EEBF3206CBEF81F44725FE62A3DB0CC10E88E695" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "0xd226392C23fb3476274ED6759D4a478db3197d82" + "address": "ibc/5662412372381F56C5F83A0404DC7209E5143ABD32EF67B5705DBE8D9C2BF001" }, - "pepe-wei": { - "symbol": "axlPEPE", - "decimals": 18, - "name": "Pepe", + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", "is_native": false, - "address": "0xE3a4277eFBe777B6B17CB7fFB7fEAf8C92cBE65A" + "address": "ibc/97F15E1BC69D4AAD938CAAA6CA5C963F6159C93059481246A8A26A113BC6BD2C" }, - "wmai-wei": { - "symbol": "axlWMAI", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Wrapped MAI", + "name": "Wrapped Ether", "is_native": false, - "address": "0x501e3d716A72E11E1e22eDcf0365556b357DA0c9" - }, - "mpx-wei": { - "symbol": "MPX", - "decimals": 18, - "name": "MPX", - "is_native": true, - "address": "0x66eEd5FF1701E6ed8470DC391F05e27B1d0657eb" + "address": "ibc/3C168643B15498A2F8BA843649D7CF207EA2F5A7C8AE77BC175EC2FBF21B1BAA" }, - "stuatom": { - "symbol": "stATOM", - "decimals": 6, - "name": null, + "dot-planck": { + "symbol": "axlDOT", + "decimals": 10, + "name": "xcDOT", "is_native": false, - "address": "0x4Bd3231E7eFc193F13a89b23ED6970776a91CF63" + "address": "ibc/0D33E2077E140784912451ED189B11D78A4CD10C480C39E0CD91C67B1406B69F" }, - "ustrd": { - "symbol": "STRD", - "decimals": 6, - "name": null, + "busd-wei": { + "symbol": "axlBUSD", + "decimals": 18, + "name": "Binance USD", "is_native": false, - "address": "0x922946A8A2FAE7a8b4506bd54Ea361482Eff95dD" + "address": "ibc/242AFD9038727F23A8CD966BFACAED25609FFA67DDD6BA5F3FB8FBEE1ED66FE3" }, - "wavax-wei": { - "symbol": "axlAVAX", + "wsteth-wei": { + "symbol": "axl-wstETH", "decimals": 18, - "name": "Wrapped AVAX", + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "0x879e73005C36d9a549fFb9846851fe5d1d91b681" + "address": "ibc/11F00C6AA654FE1F7D5A8FBDC7D2E04A65B3101B306E82E3C35B35956161FED6" }, - "wftm-wei": { - "symbol": "WFTM", + "cusd-wei": { + "symbol": "cUSD", "decimals": 18, - "name": "Wrapped Fantom", - "is_native": true, - "address": "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83" + "name": "Celo Dollar", + "is_native": false, + "address": "ibc/E2AB763BC802DCEAAF86730EEAD634FD3030E031ACF7628E156B6971D15884E9" }, - "uatom": { - "symbol": "axlATOM", - "decimals": 6, - "name": "Cosmoshub staking ATOM", + "cbeth-wei": { + "symbol": "cbETH", + "decimals": 18, + "name": "Coinbase Wrapped Staked ETH", "is_native": false, - "address": "0x3bB68cb55Fc9C22511467c18E42D14E8c959c4dA" + "address": "ibc/32E40D2A360F537E5A3074854AEB65F2A8D6A130F9007422D704080BE5DAFAF2" }, - "uluna": { - "symbol": "LUNC", - "decimals": 6, - "name": null, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", "is_native": false, - "address": "0x5e3C572A97D898Fe359a2Cea31c7D46ba5386895" + "address": "ibc/0871D26D2C71319765EA323D6EB8B8A074706AD253FC7EB51E88E269A4CDB911" }, - "uusd": { - "symbol": "USTC", - "decimals": 6, - "name": null, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", "is_native": false, - "address": "0x2B9d3F168905067D88d93F094C938BACEe02b0cB" + "address": "ibc/0E84FB53D675629D8ABBDBB01EB2A025B8437EC19A402A3E67D25F48523F0FB4" }, - "frax-wei": { - "symbol": "axlFRAX", + "reth-wei": { + "symbol": "rETH", "decimals": 18, - "name": "Frax", + "name": "Rocket Pool ETH", "is_native": false, - "address": "0xbE71e68fB36d14565F523C9c36ab2A8Be0c26D55" + "address": "ibc/516D98745F74798AABF395663BAB55AA4EDFC385D3083AF219F727955A1B94AF" }, - "wfil-wei": { - "symbol": "axlFIL", + "arb-wei": { + "symbol": "axlARB", "decimals": 18, - "name": "Wrapped FIL", + "name": "Arbitrum", "is_native": false, - "address": "0x49517abB880359eb873bDc08d09eBc0c478d3CA2" + "address": "ibc/0C0633DD7E89F87C13194513268F6E99C52F499A4EE511C560356F45B7C68433" }, - "ern-wei": { - "symbol": "ERN", + "wmatic-wei": { + "symbol": "axlMATIC", "decimals": 18, - "name": "Ethos Reserve Note", + "name": "Wrapped Matic", "is_native": false, - "address": "0xce1E3cc1950D2aAEb47dE04DE2dec2Dc86380E0A" + "address": "ibc/BB5D7FBBA895E6E43EAD8D49E084319663139CA438E41796A0ACB657AE64E8F3" }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", + "wavax-wei": { + "symbol": "axlAVAX", + "decimals": 18, + "name": "Wrapped AVAX", "is_native": false, - "address": "0x448d59B4302aB5d2dadf9611bED9457491926c8e" + "address": "ibc/E8F578B93A25BAE12A8BAD4C6973CF6D3BEB9AC019C8C77E566CE1FFB8F010F3" }, - "weth-wei": { - "symbol": "axlETH", + "wglmr-wei": { + "symbol": "axlGLMR", "decimals": 18, - "name": "Wrapped Ether", + "name": "Wrapped GLMR", "is_native": false, - "address": "0xfe7eDa5F2c56160d406869A8aA4B2F365d544C7B" + "address": "ibc/6CB279447A96B991FA8986DC4C22C866D215DE1DCDF5F833B81180329FE8001A" }, - "lqdr-wei": { - "symbol": "axlLqdr", + "wbnb-wei": { + "symbol": "axlBNB", "decimals": 18, - "name": "LqdrV2", + "name": "Wrapped BNB", "is_native": false, - "address": "0x4b6B3d425F82248996D77EcC3F3df1E500aaC1db" + "address": "ibc/771FB23883042F959CDCB02F3D0501CC7F32EF4E28835EE4D7DA8CA7E8CF16F6" }, - "oath-wei": { - "symbol": "OATH", + "wftm-wei": { + "symbol": "axlFTM", "decimals": 18, - "name": "Oath Token", + "name": "Wrapped Fantom", + "is_native": false, + "address": "ibc/80A8DBDCDC0AD1CF1781110E8438D894199BA2E4240A65DBB833A665E41620CB" + }, + "uatom": { + "symbol": "ATOM", + "decimals": 6, + "name": "Cosmoshub staking ATOM", "is_native": true, - "address": "0x21Ada0D2aC28C3A5Fa3cD2eE30882dA8812279B6" + "address": "uatom" }, - "ring-wei": { - "symbol": "RING", + "pepe-wei": { + "symbol": "axlPEPE", "decimals": 18, - "name": "OneRing", - "is_native": true, - "address": "0x582423C10c9e83387a96d00A69bA3D11ee47B7b5" + "name": "Pepe", + "is_native": false, + "address": "ibc/8558CA5E183C44947A9B63FC9BD75A18D0A2407025898A3B64AD782C4F3DBBCB" }, - "knc-wei": { - "symbol": "axlKNC", + "rai-wei": { + "symbol": "axlRAI", "decimals": 18, - "name": "Kyber Network Crystal v2", + "name": "Rai Reflex Index", "is_native": false, - "address": "0xDF34bE7f242EE338644d8d1a1f4D11a807b4Da5f" + "address": "ibc/C2B86F0F77B3293EAB92C516CF249BD4CD5A168E5AC3BA5997F07A8D660CDEF2" }, - "orbs-wei": { - "symbol": "ORBS", + "link-wei": { + "symbol": "axlLINK", "decimals": 18, - "name": "Orbs", + "name": "ChainLink Token", "is_native": false, - "address": "0x43a8cab15D06d3a5fE5854D714C37E7E9246F170" + "address": "ibc/501C5C52E5D83DB2BA46067694AEEA51C4DC7BF56AA47BD34B12655BAF8B0DF1" }, - "stern-wei": { - "symbol": "stERN", + "frax-wei": { + "symbol": "axlFRAX", "decimals": 18, - "name": "Staked ERN Vault", + "name": "Frax", "is_native": false, - "address": "0x34A279Ece38f260a28C8872f416319e9B6Aa428e" + "address": "ibc/3792246C7C422C037C603C955F8383B4E32E7555D693344F9A029A67FE221C57" }, - "deus-wei": { - "symbol": "axlDEUS", + "mkr-wei": { + "symbol": "axlMKR", "decimals": 18, - "name": "DEUS", + "name": "Maker", "is_native": false, - "address": "0x912922e25ac79D524734d8eC0C882B035c5b356f" + "address": "ibc/61AC3A1AED345729B29DA6EC644431B70C1EEA3FFE95DAF2ED241F84EEA37638" + }, + "uni-wei": { + "symbol": "axlUNI", + "decimals": 18, + "name": "Uniswap", + "is_native": false, + "address": "ibc/A912768BDDAC10A4337F50D91A033DA13EE41285732E82F929EF34E1B2FB3630" + }, + "shib-wei": { + "symbol": "axlSHIB", + "decimals": 18, + "name": "SHIBA INU", + "is_native": false, + "address": "ibc/30A1266CA3CEC8347C2FB57E70041A484FD14BE06A089DBAFCD8F7FE8F2D36B3" + }, + "wfil-wei": { + "symbol": "axlFIL", + "decimals": 18, + "name": "Wrapped FIL", + "is_native": false, + "address": "ibc/C201372C3C7295C707363ADA2B84E215E0D0B324A025E28136F4FA305D32251E" } }, - "fetch": { + "crescent": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/8AF69BC1E1D72B447738B50C28B382F62F2AF65DE303021E45C0B7C851B4B2E1" + "address": "ibc/BFF0D3805B50D93E2FA5C0B2DDF7E0B30A631076CD80BC12A48C0E95404B4A41" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "ibc/0634D0993744740D675AD01E81156EAC945AEAAE17C074918DC7FF52F41B263E" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/32C90ACA7008E4602398C02619D60C5ED36F7F4A245BA6ED870B6640FE418FC2" + "address": "ibc/2017AFA149C1C42DBF54EC910DA168E9E4F928DF0D3A8E841189994A9339FED9" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/E22116A7B0450692B8B8F9BBA6D987EB46CA48F5EDDEEE683D15C34F6B4E55B6" + "address": "ibc/11FB4C0BC2FCCFF2B01976C0070F468D82DAE8D1F565F80E64063BFDBEE4A5BD" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/036052021926396A2AC57F52171B24C6A8DBF79755A3926DB0E2FE8B57F389C6" + "address": "ibc/7FFC60524C4513A3A8E0A407CC89BFF5A861EC624209D72EB26FC10ADAEBA70E" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/F1806958CA98757B91C3FA1573ECECD24F6FA3804F074A6977658914A49E65A3" }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, "name": "xcDOT", "is_native": false, - "address": "ibc/2F814A5F5947FADE9001EAC258E147DDA67CB8217762969569FFA4E1972ED2E4" + "address": "ibc/3208C8E45C27903988E437162134A172880BE112C0530B86117FB5DA7A5DF8B9" }, "busd-wei": { "symbol": "axlBUSD", "decimals": 18, "name": "Binance USD", "is_native": false, - "address": "ibc/4DBD7165A95A4CE5DF31575D9745AF85060A68D6E91050CEB6326958EC92CFDF" + "address": "ibc/A7A2B8871CD2E999EB1D9E901B4F744617C80816CE94DE84CA1200109651C903" }, - "weth-wei": { - "symbol": "axlETH", + "wsteth-wei": { + "symbol": "axl-wstETH", "decimals": 18, - "name": "Wrapped Ether", + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "ibc/74712D58FE426053FE962D71BCA5BE80BF83F1BC3508E5E16EBE70241D4E73BE" + "address": "ibc/F5BBAD34906B6ED73EB17652C47F7F34D2FFB8AC06712E0396F2F28E69DB40C0" + }, + "cusd-wei": { + "symbol": "cUSD", + "decimals": 18, + "name": "Celo Dollar", + "is_native": false, + "address": "ibc/EE7021E472B8DB0DB824CB409AB30822E50BBFBE5FB78C3B4719904911A36A22" + }, + "cbeth-wei": { + "symbol": "cbETH", + "decimals": 18, + "name": "Coinbase Wrapped Staked ETH", + "is_native": false, + "address": "ibc/CBBAAEAB4BD5DDD23E38311BA333E519EFC66116BB6E5338AF51DA59A606F015" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": false, + "address": "ibc/11261571EB3E679315BA19C51F42F143113A139F598729D97624B45043C4D7C0" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "ibc/53F32BBFDFEF82276725A599CEFD92C0C6D4DF1AE6DCE600ACBBFDF9579625DE" + }, + "reth-wei": { + "symbol": "rETH", + "decimals": 18, + "name": "Rocket Pool ETH", + "is_native": false, + "address": "ibc/6026097599D36D6882664C0FC14A67A5DDA0AE76EDCC07062A8E7B74FA8A8D59" + }, + "arb-wei": { + "symbol": "axlARB", + "decimals": 18, + "name": "Arbitrum", + "is_native": false, + "address": "ibc/BAF32343C8B21CCEB63BA035621B6ED86CFA883AC71B8217D9F9DA32CDA2E3B4" }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/F4B35F5F93407AED0909071A36ADDBBFF7757DFBFFDF4AD134539CA415407D30" + "address": "ibc/C322C7D0867CC3EE6FA3495DC9685E5A0F49B506369341287FDA1E110841A950" }, "wavax-wei": { "symbol": "axlAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/D3D50F09F6F9A6339A8827A8A89462CAA0C349754B94EABC46D0AEEAF0E41E11" + "address": "ibc/0886E3462B7DD438353781848DBDF90E58BB7DE90266E3F95E41B3FA8ED1B453" }, "wglmr-wei": { "symbol": "axlGLMR", "decimals": 18, "name": "Wrapped GLMR", "is_native": false, - "address": "ibc/BD3F897C555871388A0F8CCA1B4AA0F02280FA9DD2F34E62BBCC7947A89442AD" + "address": "ibc/A7C06A800850847DBCC36213185EC5AAD3C719D42D1F0623F9C1F9EFF456F673" }, "wbnb-wei": { "symbol": "axlBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/26786027D954FD05D66A965F3081891D513001B5B2487BD01820E0109598E07E" + "address": "ibc/3D4499D811B055223D0EFB06D2211F84772CAEF0FB987F71BAE716191714B391" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "ibc/D504766328F350B25FD8189529ADACB32C365EBEC92D9A719D151BFD0B016E47" + "address": "ibc/23B62EFD1B9444733889B42362570C774801430A1C656A0A3F8D6D69AE93ED8B" + }, + "pepe-wei": { + "symbol": "axlPEPE", + "decimals": 18, + "name": "Pepe", + "is_native": false, + "address": "ibc/796FAF4E82B4EB778E18F4E0A2C67C9CF55D5ACD176F3B6FD6DC420ABDDBABC1" }, "rai-wei": { "symbol": "axlRAI", "decimals": 18, "name": "Rai Reflex Index", "is_native": false, - "address": "ibc/31EAFBEC62CA1060AAF732A0FEFF34E72AC4FF9E03E42AC42E2C0D8C20B98C21" + "address": "ibc/A1F1BAE8D0CF9F8080C22FE2B0C60DFD25E96F4F985AC27C7E11F5A597CEE83D" }, "link-wei": { "symbol": "axlLINK", "decimals": 18, "name": "ChainLink Token", "is_native": false, - "address": "ibc/9F1700554275639AF465CBDE9EA8074D4A2D4A8689CDA3C765FBF2C8829324F1" + "address": "ibc/1AD2DD08D1AADAE7F667F82767425FEC119BAFEA5F514FCEA22E6E4E446BEADA" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "ibc/5E7CFACA9194BFFC56D36F463E134B4441F72BF44F1E4640FE5BBE5291B82EFA" + "address": "ibc/21DB3093824F38A29399E7466B5870559AEC683D0D09D746F9EC47BB8505CBF7" }, "mkr-wei": { "symbol": "axlMKR", "decimals": 18, "name": "Maker", "is_native": false, - "address": "ibc/C41CCB1D2E6C17E0FB02866DAFCAF0C7AA574077CE517B0AABBA6A57F23E76D8" + "address": "ibc/1E8149AC74041CF61448A57858887B2D2C221B9B194509120BD3AD6E4278AAB0" + }, + "uni-wei": { + "symbol": "axlUNI", + "decimals": 18, + "name": "Uniswap", + "is_native": false, + "address": "ibc/392F7936508B675F7F794504F4829D6F459C0E7488EDE6B2C4E9192037E3F03F" + }, + "shib-wei": { + "symbol": "axlSHIB", + "decimals": 18, + "name": "SHIBA INU", + "is_native": false, + "address": "ibc/D1F6A3A1A3C2E25A7039B4537E8D1B08490B6A3F57D758AB8C08AA512CE3E51A" + }, + "wfil-wei": { + "symbol": "axlFIL", + "decimals": 18, + "name": "Wrapped FIL", + "is_native": false, + "address": "ibc/E2422AEF428C089CD74169065BF478C26499FAEE1FE936B87A95905BCFDB6E33" + } + }, + "ethereum": { + "uusdc": { + "symbol": "USDC", + "decimals": 6, + "name": "USD Coin", + "is_native": true, + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x467719aD09025FcC6cF6F8311755809d45a5E5f3" + }, + "dai-wei": { + "symbol": "DAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": true, + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F" + }, + "uusdt": { + "symbol": "USDT", + "decimals": 6, + "name": "Tether USD", + "is_native": true, + "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7" + }, + "wbtc-satoshi": { + "symbol": "WBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": true, + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599" + }, + "weth-wei": { + "symbol": "WETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": true, + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" + }, + "wmai-wei": { + "symbol": "WMAI", + "decimals": 18, + "name": "Wrapped MAI", + "is_native": true, + "address": "0x05770332D4410b6D7f07Fd497E4c00F8F7bFb74A" + }, + "busd-wei": { + "symbol": "BUSD", + "decimals": 18, + "name": "Binance USD", + "is_native": true, + "address": "0x4Fabb145d64652a948d72533023f6E7A623C7C53" + }, + "wsteth-wei": { + "symbol": "wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": true, + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0" + }, + "wusdm-wei": { + "symbol": "wUSDM", + "decimals": 18, + "name": "Wrapped Mountain Protocol USD", + "is_native": true, + "address": "0x57F5E098CaD7A3D1Eed53991D4d66C45C9AF7812" + }, + "ueuroc": { + "symbol": "EUROC", + "decimals": 6, + "name": "Euro Coin", + "is_native": true, + "address": "0x1aBaEA1f7C830bD89Acc67eC4af516284b1bC33c" + }, + "lqdr-wei": { + "symbol": "axlLqdr", + "decimals": 18, + "name": "LqdrV2", + "is_native": false, + "address": "0x98504C8afa7c74c87a0641a7bb0F7968d4e8F471" + }, + "ern-wei": { + "symbol": "ERN", + "decimals": 18, + "name": "Ethos Reserve Note", + "is_native": false, + "address": "0x91A69021b0BaeF3445E51726458a0CE601471846" + }, + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", + "is_native": false, + "address": "0xeA0cFDC2667bE69ED724c8069d358502fF41cA18" + }, + "wdoge-wei": { + "symbol": "WDOGE", + "decimals": 8, + "name": "Wrapped DOGE", + "is_native": true, + "address": "0x8aa9381b2544b48c26f3b850F6e07E2c5161EB3e" + }, + "ukuji": { + "symbol": "KUJI", + "decimals": 6, + "name": "Kujira native asset", + "is_native": false, + "address": "0x5e354e4f52D14FF07662CF0493d0d588d38a44A6" + }, + "cbeth-wei": { + "symbol": "cbETH", + "decimals": 18, + "name": "Coinbase Wrapped Staked ETH", + "is_native": true, + "address": "0xBe9895146f7AF43049ca1c1AE358B0541Ea49704" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": true, + "address": "0xac3E018457B222d93114458476f3E3416Abbe38F" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": true, + "address": "0x5E8422345238F34275888049021821E8E08CAa1f" + }, + "sfrax-wei": { + "symbol": "sFRAX", + "decimals": 18, + "name": "Staked FRAX", + "is_native": true, + "address": "0xA663B02CF0a4b149d2aD41910CB81e23e1c41c32" + }, + "fxs-wei": { + "symbol": "FXS", + "decimals": 18, + "name": "Frax Share", + "is_native": true, + "address": "0x3432B6A60D23Ca0dFCa7761B7ab56459D9C964D0" + }, + "reth-wei": { + "symbol": "rETH", + "decimals": 18, + "name": "Rocket Pool ETH", + "is_native": true, + "address": "0xae78736Cd615f374D3085123A210448E74Fc6393" + }, + "bal-wei": { + "symbol": "BAL", + "decimals": 18, + "name": "Balancer", + "is_native": true, + "address": "0xba100000625a3754423978a60c9317c58a424e3D" + }, + "vext-wei": { + "symbol": "VEXT", + "decimals": 18, + "name": "Veloce", + "is_native": false, + "address": "0x593Dc8C08387c9F4C8d522B49C76dD18518F4d7e" + }, + "oath-wei": { + "symbol": "OATH", + "decimals": 18, + "name": "Oath Token", + "is_native": false, + "address": "0xd20523b39fAF1D6e9023a4D6085f87B7b0DE7926" + }, + "pols-wei": { + "symbol": "POLS", + "decimals": 18, + "name": "PolkastarterToken", + "is_native": true, + "address": "0x83e6f1E41cdd28eAcEB20Cb649155049Fac3D5Aa" + }, + "knc-wei": { + "symbol": "KNC", + "decimals": 18, + "name": "Kyber Network Crystal v2", + "is_native": true, + "address": "0xdeFA4e8a7bcBA345F687a2f1456F5Edd9CE97202" + }, + "orbs-wei": { + "symbol": "ORBS", + "decimals": 18, + "name": "Orbs", + "is_native": true, + "address": "0xff56Cc6b1E6dEd347aA0B7676C85AB0B3D08B0FA" + }, + "gdx-wei": { + "symbol": "GDX", + "decimals": 18, + "name": "Gridex", + "is_native": false, + "address": "0x89901994b5Ed81cbbcBC4E5A7e0cC4e7F58e5458" + }, + "deus-wei": { + "symbol": "axlDEUS", + "decimals": 18, + "name": "DEUS", + "is_native": false, + "address": "0x69e557b926F4eEf6d9400e36DBBFEb9600Af2880" + }, + "uumee": { + "symbol": "UMEE", + "decimals": 6, + "name": "Umee native token", + "is_native": false, + "address": "0x923e030f951A2401426a3407a9bcc7EB715d9a0b" + }, + "stuatom": { + "symbol": "stATOM", + "decimals": 6, + "name": "Stride Staked Atom", + "is_native": false, + "address": "0x2924894E7886C6B9018179946EE389bb06534021" + }, + "ustrd": { + "symbol": "STRD", + "decimals": 6, + "name": "Stride", + "is_native": false, + "address": "0x85eBBf7253295d37C5FC98bE5Aac87CA4378c2e2" + }, + "uatom": { + "symbol": "axlATOM", + "decimals": 6, + "name": "Cosmoshub staking ATOM", + "is_native": false, + "address": "0x27292cf0016E5dF1d8b37306B2A98588aCbD6fCA" + }, + "utia": { + "symbol": "axlTIA", + "decimals": 6, + "name": "Axelar Wrapped TIA", + "is_native": false, + "address": "0x65e3fA51C4ce0af1B9CD5CBC7C5fDb80a09D431D" + }, + "pepe-wei": { + "symbol": "PEPE", + "decimals": 18, + "name": "Pepe", + "is_native": true, + "address": "0x6982508145454Ce325dDbE47a25d4ec3d2311933" + }, + "uluna": { + "symbol": "LUNC", + "decimals": 6, + "name": "Axelar Wrapped LUNC", + "is_native": false, + "address": "0x31DAB3430f3081dfF3Ccd80F17AD98583437B213" + }, + "uusd": { + "symbol": "USTC", + "decimals": 6, + "name": "Axelar Wrapped USTC", + "is_native": false, + "address": "0x085416975fe14C2A731a97eC38B9bF8135231F62" + }, + "rai-wei": { + "symbol": "RAI", + "decimals": 18, + "name": "Rai Reflex Index", + "is_native": true, + "address": "0x03ab458634910AaD20eF5f1C8ee96F1D6ac54919" + }, + "link-wei": { + "symbol": "LINK", + "decimals": 18, + "name": "ChainLink Token", + "is_native": true, + "address": "0x514910771AF9Ca656af840dff83E8264EcF986CA" + }, + "frax-wei": { + "symbol": "FRAX", + "decimals": 18, + "name": "Frax", + "is_native": true, + "address": "0x853d955aCEf822Db058eb8505911ED77F175b99e" + }, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": true, + "address": "0x5Ca135cB8527d76e932f34B5145575F9d8cbE08E" + }, + "mkr-wei": { + "symbol": "MKR", + "decimals": 18, + "name": "Maker", + "is_native": true, + "address": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2" + }, + "uni-wei": { + "symbol": "UNI", + "decimals": 18, + "name": "Uniswap", + "is_native": true, + "address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984" + }, + "shib-wei": { + "symbol": "SHIB", + "decimals": 18, + "name": "SHIBA INU", + "is_native": true, + "address": "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE" + }, + "wfil-wei": { + "symbol": "axlFIL", + "decimals": 18, + "name": "Wrapped FIL", + "is_native": false, + "address": "0x6A7b717aE5Ed65F85BA25403D5063D368239828e" + }, + "yieldusd-wei": { + "symbol": "YieldUSD", + "decimals": 18, + "name": "Real Yield USD", + "is_native": true, + "address": "0x97e6E0a40a3D02F12d1cEC30ebfbAE04e37C119E" + }, + "yieldeth-wei": { + "symbol": "YieldETH", + "decimals": 18, + "name": "Real Yield ETH", + "is_native": true, + "address": "0xb5b29320d2Dde5BA5BAFA1EbcD270052070483ec" + }, + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", + "is_native": false, + "address": "0x010cddfA5518f74c43Efe911db29Af71b44b4E1C" + }, + "usdy-wei": { + "symbol": "USDY", + "decimals": 18, + "name": "Ondo U.S. Dollar Yield", + "is_native": true, + "address": "0x96F6eF951840721AdBF46Ac996b59E0235CB985C" + }, + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", + "is_native": false, + "address": "0xF7C79FfDa0d13b68081761BB0a5a66cFC48D97f5" + }, + "ox-wei": { + "symbol": "OX", + "decimals": 18, + "name": "Open Exchange Token", + "is_native": true, + "address": "0x78a0A62Fba6Fb21A83FE8a3433d44C73a4017A6f" + }, + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", + "is_native": false, + "address": "0xbBd788E2873d391F9eE7E965D9ef93305909Da3E" + }, + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", + "is_native": false, + "address": "0xBA09B04F38310aCF7f098DaC6017D1AFcfB6411d" + }, + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", + "is_native": false, + "address": "0x0Fd8d9F028d1594ff24697a10035D6EC265769b0" + }, + "aISLM": { + "symbol": "ISLM", + "decimals": 18, + "name": "Islamic Coin", + "is_native": false, + "address": "0xF10c41cA085FC8d9326a65408D14Dae28A3E69a5" + }, + "factory/sei10hud5e5er4aul2l7sp2u9qp2lag5u4xf8mvyx38cnjvqhlgsrcls5qn5ke/seilor": { + "symbol": "axlSEILOR", + "decimals": 6, + "name": "Axelar Wrapped SEILOR", + "is_native": false, + "address": "0xdb4AFBA424b624068D3d63F565C55D5D79543245" + }, + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", + "is_native": false, + "address": "0xF2605EaB29c67d06E71372CA9dfA8aDfd2d34BbF" + }, + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", + "is_native": false, + "address": "0xF84131c858EB4C51cda2ccF0Eb614994c456c9E7" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", + "is_native": false, + "address": "0x24a6f525636d75eF3e4E090b44B75FeB440e9697" + }, + "unls": { + "symbol": "NLS", + "decimals": 6, + "name": "NLS native asset", + "is_native": false, + "address": "0xb34e17562e4f1f63A2D4cF684eD8bC124e519771" + }, + "yum-wei": { + "symbol": "YUM", + "decimals": 18, + "name": "Yum", + "is_native": true, + "address": "0xcE682c89C63d2850Cb2ca898E44D6c7c30d897a6" + }, + "metal-wei": { + "symbol": "METAL", + "decimals": 18, + "name": "METAL", + "is_native": false, + "address": "0x27C1D5925852c40ee712A089112E62A68d0cfFC0" + }, + "mee-wei": { + "symbol": "MEE", + "decimals": 18, + "name": "MEE Governance Token", + "is_native": false, + "address": "0xB468Fd557B9F996D0fc89952e94D0F8491279DBf" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": true, + "address": "0x3c8D2FCE49906e11e71cB16Fa0fFeB2B16C29638" + }, + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", + "is_native": false, + "address": "0xD454b59f16D42667Be2fA55292d16647E27f40C4" + }, + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "0x2140f9DD6253417389699f396CaFC0e47597410a" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0xF42fCFfc27A5B8d0afEC45659407B82f9F32fA98" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0x8b21c0E5672F8937177d9a74B0d87AD7974BDA5D" + }, + "lbtc-satoshi": { + "symbol": "LBTC", + "decimals": 8, + "name": "Lombard Staked Bitcoin", + "is_native": true, + "address": "0x8236a87084f8B84306f72007F36F2618A5634494" + } + }, + "evmos": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "ibc/63C53CBDF471D4E867366ABE2E631197257118D1B2BEAD1946C8A408F96464C3" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "ibc/CBA4784581AD4BEF308C536A3CD44D4A940A520E61B0D1E4FB115C539F61DEE5" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "ibc/F11C8CB7743E4B5FDCEA7C97F3B2C115E1931C5614B84C183DAC439B4C919D94" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "ibc/C834CD421B4FD910BBC97E06E86B5E6F64EA2FE36D6AE0E4304C2E1FB1E7333C" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/356EDE917394B2AEF7F915EB24FA683A0CCB8D16DD4ECCEDC2AD0CEC6B66AC81" + }, + "dot-planck": { + "symbol": "axlDOT", + "decimals": 10, + "name": "xcDOT", + "is_native": false, + "address": "ibc/80938A67AB5C2302E74919802F40F9F3A9CCE40FC878361AA4A53734EC40AF5A" + }, + "busd-wei": { + "symbol": "axlBUSD", + "decimals": 18, + "name": "Binance USD", + "is_native": false, + "address": "ibc/3A7C0D680D0F50A98115966A22C01594897FAE924FAF324E13C5FFB89F6864BF" + }, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "ibc/43BD3A576550CDCD183BC093AEB610B3C2057AD12BA3C27D67AE9F4BCA74F2C8" + }, + "cusd-wei": { + "symbol": "cUSD", + "decimals": 18, + "name": "Celo Dollar", + "is_native": false, + "address": "ibc/F3D7473CC857F9D631A2EC0A1D61382C437BDB6BC98D4A512A4DD79A341C8CC4" + }, + "cbeth-wei": { + "symbol": "cbETH", + "decimals": 18, + "name": "Coinbase Wrapped Staked ETH", + "is_native": false, + "address": "ibc/1D1A84E64A5AD847ABBE3195DDB39F3B2E1BCEC2B42FBB3DBEE4BA856F0ACA67" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": false, + "address": "ibc/0C9C3EAE01AB2438F14032341507E51759FD1871BACF35078361A10AB02F3BE1" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "ibc/7779A3C6ECF4840CB1E3638DED6672593900F444766DE98DFF41746B103D3172" + }, + "reth-wei": { + "symbol": "rETH", + "decimals": 18, + "name": "Rocket Pool ETH", + "is_native": false, + "address": "ibc/6A3538834873D16F00D0268B295A8D6FD9B005952787AA14726D0013A51042AC" + }, + "arb-wei": { + "symbol": "axlARB", + "decimals": 18, + "name": "Arbitrum", + "is_native": false, + "address": "ibc/9FD0BDCFC4BA32643C3CAE55BE9C80C5F5B99871BABDC8C13DE922449B9188D2" + }, + "wmatic-wei": { + "symbol": "axlMATIC", + "decimals": 18, + "name": "Wrapped Matic", + "is_native": false, + "address": "ibc/7883D6C40128A175BF42226F013671C0B190F2AC2CA9215896EBD6F7F7097A77" + }, + "wavax-wei": { + "symbol": "axlAVAX", + "decimals": 18, + "name": "Wrapped AVAX", + "is_native": false, + "address": "ibc/990770DB97A9567A0B794EB5A3A9BD02C939CE538661FA2DB44DD791CF16DC0E" + }, + "wglmr-wei": { + "symbol": "axlGLMR", + "decimals": 18, + "name": "Wrapped GLMR", + "is_native": false, + "address": "ibc/E9528EEB1589F209D5EA99BA6BDB1634A65DFD883769D53072DDD26FE7DE8CA3" + }, + "wbnb-wei": { + "symbol": "axlBNB", + "decimals": 18, + "name": "Wrapped BNB", + "is_native": false, + "address": "ibc/5BDA280DA1EA865301F0DB343F87971D6E6C399152B335D8CE475EEA2BA38D21" + }, + "wftm-wei": { + "symbol": "axlFTM", + "decimals": 18, + "name": "Wrapped Fantom", + "is_native": false, + "address": "ibc/B389DF077401C819F7A4235167AC1399790FB819983191A3AFC646C7364D24C9" + }, + "pepe-wei": { + "symbol": "axlPEPE", + "decimals": 18, + "name": "Pepe", + "is_native": false, + "address": "ibc/26E6508A1757E12B15A087E951F5D35E73CF036F0D97BC809E1598D1DD870BED" + }, + "rai-wei": { + "symbol": "axlRAI", + "decimals": 18, + "name": "Rai Reflex Index", + "is_native": false, + "address": "ibc/4811C8371D83DFFFB92E0F51B70E6324E8F2BAA3AD406E20A1935D44E67BE15B" + }, + "link-wei": { + "symbol": "axlLINK", + "decimals": 18, + "name": "ChainLink Token", + "is_native": false, + "address": "ibc/0867589CE15E292BB84404A025BC883CE7FB58000C1809040A090701AEB20FE5" + }, + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", + "is_native": false, + "address": "ibc/6659354677AD62F7B4B30AEEB613E1100550D373366AFE33D54C5927BA868137" + }, + "mkr-wei": { + "symbol": "axlMKR", + "decimals": 18, + "name": "Maker", + "is_native": false, + "address": "ibc/620628A7B308C0B1CCC109A9CFD9BC8089F9A527674C91733B1E15D9A65CF567" + }, + "uni-wei": { + "symbol": "axlUNI", + "decimals": 18, + "name": "Uniswap", + "is_native": false, + "address": "ibc/7B9ED005F19A3E02972D6CE0703EA8535D8E19C6C9064173B26DAFFBCB089D5E" + }, + "shib-wei": { + "symbol": "axlSHIB", + "decimals": 18, + "name": "SHIBA INU", + "is_native": false, + "address": "ibc/C89E6FC9D23CE6A43F8B9B1219AA4B68F795F92F33685A87522E9A09EA6A1E20" + }, + "wfil-wei": { + "symbol": "axlFIL", + "decimals": 18, + "name": "Wrapped FIL", + "is_native": false, + "address": "ibc/8CB83D948B63CB15AFF6F4E19EE9B35C65FEEEE514457965DA67E3A339F3975A" + } + }, + "fantom": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "0x1B6382DBDEa11d97f24495C9A90b7c88469134a4" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x8b1f4432F943c465A973FeDC6d7aa50Fc96f1f65" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "0xD5d5350F42CB484036A1C1aF5F2DF77eAFadcAFF" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "0xd226392C23fb3476274ED6759D4a478db3197d82" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "0x448d59B4302aB5d2dadf9611bED9457491926c8e" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "0xfe7eDa5F2c56160d406869A8aA4B2F365d544C7B" + }, + "wmai-wei": { + "symbol": "axlWMAI", + "decimals": 18, + "name": "Wrapped MAI", + "is_native": false, + "address": "0x501e3d716A72E11E1e22eDcf0365556b357DA0c9" + }, + "lqdr-wei": { + "symbol": "axlLqdr", + "decimals": 18, + "name": "LqdrV2", + "is_native": false, + "address": "0x4b6B3d425F82248996D77EcC3F3df1E500aaC1db" + }, + "ern-wei": { + "symbol": "ERN", + "decimals": 18, + "name": "Ethos Reserve Note", + "is_native": false, + "address": "0xce1E3cc1950D2aAEb47dE04DE2dec2Dc86380E0A" + }, + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", + "is_native": false, + "address": "0x34A279Ece38f260a28C8872f416319e9B6Aa428e" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": false, + "address": "0x4E30B1B79bfF30840755FafafD9ce8e408131552" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "0x39Db1A30122031751e803Fabf329C44efBBfBf4B" + }, + "sfrax-wei": { + "symbol": "sFRAX", + "decimals": 18, + "name": "Staked FRAX", + "is_native": false, + "address": "0xa0F18d6Cc2BBE1Da31DE214389BBEfb73a0C836b" + }, + "fxs-wei": { + "symbol": "FXS", + "decimals": 18, + "name": "Frax Share", + "is_native": false, + "address": "0x05E7857Cb748F0018C0CBCe3dfd575B0d8677aeF" + }, + "mpx-wei": { + "symbol": "MPX", + "decimals": 18, + "name": "MPX", + "is_native": true, + "address": "0x66eEd5FF1701E6ed8470DC391F05e27B1d0657eb" + }, + "oath-wei": { + "symbol": "OATH", + "decimals": 18, + "name": "Oath Token", + "is_native": true, + "address": "0x21Ada0D2aC28C3A5Fa3cD2eE30882dA8812279B6" + }, + "ring-wei": { + "symbol": "RING", + "decimals": 18, + "name": "OneRing", + "is_native": true, + "address": "0x582423C10c9e83387a96d00A69bA3D11ee47B7b5" + }, + "knc-wei": { + "symbol": "axlKNC", + "decimals": 18, + "name": "Kyber Network Crystal v2", + "is_native": false, + "address": "0xDF34bE7f242EE338644d8d1a1f4D11a807b4Da5f" + }, + "orbs-wei": { + "symbol": "ORBS", + "decimals": 18, + "name": "Orbs", + "is_native": false, + "address": "0x43a8cab15D06d3a5fE5854D714C37E7E9246F170" + }, + "deus-wei": { + "symbol": "axlDEUS", + "decimals": 18, + "name": "DEUS", + "is_native": false, + "address": "0x912922e25ac79D524734d8eC0C882B035c5b356f" + }, + "stuatom": { + "symbol": "stATOM", + "decimals": 6, + "name": "Stride Staked Atom", + "is_native": false, + "address": "0x4Bd3231E7eFc193F13a89b23ED6970776a91CF63" + }, + "ustrd": { + "symbol": "STRD", + "decimals": 6, + "name": "Stride", + "is_native": false, + "address": "0x922946A8A2FAE7a8b4506bd54Ea361482Eff95dD" + }, + "wavax-wei": { + "symbol": "axlAVAX", + "decimals": 18, + "name": "Wrapped AVAX", + "is_native": false, + "address": "0x879e73005C36d9a549fFb9846851fe5d1d91b681" + }, + "wftm-wei": { + "symbol": "WFTM", + "decimals": 18, + "name": "Wrapped Fantom", + "is_native": true, + "address": "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83" + }, + "uatom": { + "symbol": "axlATOM", + "decimals": 6, + "name": "Cosmoshub staking ATOM", + "is_native": false, + "address": "0x3bB68cb55Fc9C22511467c18E42D14E8c959c4dA" + }, + "pepe-wei": { + "symbol": "axlPEPE", + "decimals": 18, + "name": "Pepe", + "is_native": false, + "address": "0xE3a4277eFBe777B6B17CB7fFB7fEAf8C92cBE65A" + }, + "uluna": { + "symbol": "LUNC", + "decimals": 6, + "name": "Axelar Wrapped LUNC", + "is_native": false, + "address": "0x5e3C572A97D898Fe359a2Cea31c7D46ba5386895" + }, + "uusd": { + "symbol": "USTC", + "decimals": 6, + "name": "Axelar Wrapped USTC", + "is_native": false, + "address": "0x2B9d3F168905067D88d93F094C938BACEe02b0cB" + }, + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", + "is_native": false, + "address": "0xbE71e68fB36d14565F523C9c36ab2A8Be0c26D55" + }, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": false, + "address": "0x78d24B91F0988F79AB9f370D607Ffc820d0779B8" + }, + "wfil-wei": { + "symbol": "axlFIL", + "decimals": 18, + "name": "Wrapped FIL", + "is_native": false, + "address": "0x49517abB880359eb873bDc08d09eBc0c478d3CA2" + }, + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", + "is_native": false, + "address": "0x11eDFA12d70e8AC9e94DE019eBa278430873f8C3" + }, + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", + "is_native": false, + "address": "0x9fD470124903957f299a1C90fEdA9043A4619cc6" + }, + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", + "is_native": false, + "address": "0xeB3e10979280aDd77f3E59cf220885646A852784" + }, + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", + "is_native": false, + "address": "0x57FeE7e92887d7A4792b5917354D2ce557aa63e9" + }, + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", + "is_native": false, + "address": "0xfc59C4212122CBb52C9b22c9D59830Ab5b8E9c71" + }, + "aISLM": { + "symbol": "ISLM", + "decimals": 18, + "name": "Islamic Coin", + "is_native": false, + "address": "0xB208C4451bc3DE576a836406bD785951b939503E" + }, + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", + "is_native": false, + "address": "0xC3CAC4AE38cCf6985EF9039ACC1abBc874DdcBB0" + }, + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", + "is_native": false, + "address": "0x3Ef52A56Ce63f9d22F5ACdDA4e5Bd8b0c65C37a5" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", + "is_native": false, + "address": "0x27443B27dfDf632390521C0b8A6fDaFe07d8f79f" + }, + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", + "is_native": false, + "address": "0xd060040976a02f0e330d3ADFEb5dc418f41Da80A" + }, + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "0xceBd6A207FEFfc6140AE37a2D2B3b3818F1aF0Ad" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0x15C6cadcc3B920D7D811c1Bbec96FA5e6f449eF9" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0xFfeB8287dE7DC756067e171e9919c730f0636680" + } + }, + "fetch": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "ibc/8AF69BC1E1D72B447738B50C28B382F62F2AF65DE303021E45C0B7C851B4B2E1" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "ibc/32C90ACA7008E4602398C02619D60C5ED36F7F4A245BA6ED870B6640FE418FC2" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "ibc/E22116A7B0450692B8B8F9BBA6D987EB46CA48F5EDDEEE683D15C34F6B4E55B6" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "ibc/036052021926396A2AC57F52171B24C6A8DBF79755A3926DB0E2FE8B57F389C6" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/74712D58FE426053FE962D71BCA5BE80BF83F1BC3508E5E16EBE70241D4E73BE" + }, + "dot-planck": { + "symbol": "axlDOT", + "decimals": 10, + "name": "xcDOT", + "is_native": false, + "address": "ibc/2F814A5F5947FADE9001EAC258E147DDA67CB8217762969569FFA4E1972ED2E4" + }, + "busd-wei": { + "symbol": "axlBUSD", + "decimals": 18, + "name": "Binance USD", + "is_native": false, + "address": "ibc/4DBD7165A95A4CE5DF31575D9745AF85060A68D6E91050CEB6326958EC92CFDF" + }, + "wmatic-wei": { + "symbol": "axlMATIC", + "decimals": 18, + "name": "Wrapped Matic", + "is_native": false, + "address": "ibc/F4B35F5F93407AED0909071A36ADDBBFF7757DFBFFDF4AD134539CA415407D30" + }, + "wavax-wei": { + "symbol": "axlAVAX", + "decimals": 18, + "name": "Wrapped AVAX", + "is_native": false, + "address": "ibc/D3D50F09F6F9A6339A8827A8A89462CAA0C349754B94EABC46D0AEEAF0E41E11" + }, + "wglmr-wei": { + "symbol": "axlGLMR", + "decimals": 18, + "name": "Wrapped GLMR", + "is_native": false, + "address": "ibc/BD3F897C555871388A0F8CCA1B4AA0F02280FA9DD2F34E62BBCC7947A89442AD" + }, + "wbnb-wei": { + "symbol": "axlBNB", + "decimals": 18, + "name": "Wrapped BNB", + "is_native": false, + "address": "ibc/26786027D954FD05D66A965F3081891D513001B5B2487BD01820E0109598E07E" + }, + "wftm-wei": { + "symbol": "axlFTM", + "decimals": 18, + "name": "Wrapped Fantom", + "is_native": false, + "address": "ibc/D504766328F350B25FD8189529ADACB32C365EBEC92D9A719D151BFD0B016E47" + }, + "rai-wei": { + "symbol": "axlRAI", + "decimals": 18, + "name": "Rai Reflex Index", + "is_native": false, + "address": "ibc/31EAFBEC62CA1060AAF732A0FEFF34E72AC4FF9E03E42AC42E2C0D8C20B98C21" + }, + "link-wei": { + "symbol": "axlLINK", + "decimals": 18, + "name": "ChainLink Token", + "is_native": false, + "address": "ibc/9F1700554275639AF465CBDE9EA8074D4A2D4A8689CDA3C765FBF2C8829324F1" + }, + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", + "is_native": false, + "address": "ibc/5E7CFACA9194BFFC56D36F463E134B4441F72BF44F1E4640FE5BBE5291B82EFA" + }, + "mkr-wei": { + "symbol": "axlMKR", + "decimals": 18, + "name": "Maker", + "is_native": false, + "address": "ibc/C41CCB1D2E6C17E0FB02866DAFCAF0C7AA574077CE517B0AABBA6A57F23E76D8" + }, + "uni-wei": { + "symbol": "axlUNI", + "decimals": 18, + "name": "Uniswap", + "is_native": false, + "address": "ibc/6B74A1C555CC76DCCBD3D0FEF57A03A585F809D3D69D82576FA36A7DB750B96C" + }, + "shib-wei": { + "symbol": "axlSHIB", + "decimals": 18, + "name": "SHIBA INU", + "is_native": false, + "address": "ibc/EA3B16A45C6B2DF71053149CC13928FDE737F65B7EE3B0E134EA0886E6C01D58" + } + }, + "filecoin": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" + }, + "wmai-wei": { + "symbol": "axlWMAI", + "decimals": 18, + "name": "Wrapped MAI", + "is_native": false, + "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": false, + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D" + }, + "sfrax-wei": { + "symbol": "sFRAX", + "decimals": 18, + "name": "Staked FRAX", + "is_native": false, + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" + }, + "fxs-wei": { + "symbol": "FXS", + "decimals": 18, + "name": "Frax Share", + "is_native": false, + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721" + }, + "oath-wei": { + "symbol": "OATH", + "decimals": 18, + "name": "Oath Token", + "is_native": false, + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + }, + "knc-wei": { + "symbol": "axlKNC", + "decimals": 18, + "name": "Kyber Network Crystal v2", + "is_native": false, + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" + }, + "uatom": { + "symbol": "axlATOM", + "decimals": 6, + "name": "Cosmoshub staking ATOM", + "is_native": false, + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" + }, + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", + "is_native": false, + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" + }, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": false, + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f" + }, + "wfil-wei": { + "symbol": "WFIL", + "decimals": 18, + "name": "Wrapped FIL", + "is_native": true, + "address": "0x60E1773636CF5E4A227d9AC24F20fEca034ee25A" + }, + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", + "is_native": false, + "address": "0x809c55916bb542c1419724022B3F0162087E3C88" + }, + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", + "is_native": false, + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B" + }, + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", + "is_native": false, + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5" + }, + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", + "is_native": false, + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5" + }, + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", + "is_native": false, + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6" + }, + "aISLM": { + "symbol": "ISLM", + "decimals": 18, + "name": "Islamic Coin", + "is_native": false, + "address": "0x2a98d978817949D45a5528013850772E762B7F12" + }, + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", + "is_native": false, + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D" + }, + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", + "is_native": false, + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", + "is_native": false, + "address": "0x520391D410314451E12A85D79970a61915Bc315D" + }, + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", + "is_native": false, + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8" + }, + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF" + } + }, + "haqq": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "ibc/65D0BEC6DAD96C7F5043D1E54E54B6BB5D5B3AEC3FF6CEBB75B9E059F3580EA3" + }, + "aISLM": { + "symbol": "ISLM", + "decimals": 18, + "name": "Islamic Coin", + "is_native": true, + "address": "aISLM" + } + }, + "ixo": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "ibc/2658C97FC74B74AB1898982081523C455561BBE3C705E47707021D47F3D94B38" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "ibc/9D1D4A9B69982D1E46851B9622F41BE18DFD73869BA6328D27BB391117494662" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "ibc/E4A8CC9F31A9598F6F92CAE5992380161389AC4BB22CAA154A508A14473740CC" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "ibc/0C41C965F14BA706011DDB3DAFAED259DAAED38D90941B4A816FA0A722063A9D" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/346392E297585AFCCDDA1E9D24AEED98FF67CB2B5ACE3160CD0D82618A658CC2" + } + }, + "immutable": { + "metal-wei": { + "symbol": "METAL", + "decimals": 18, + "name": "METAL", + "is_native": false, + "address": "0x2A644D2d996820ce5Ca4256cc68E53F4DE29B444" + }, + "mee-wei": { + "symbol": "MEE", + "decimals": 18, + "name": "MEE Governance Token", + "is_native": false, + "address": "0x9f6884b94c36cb32519440F0497E12a8F0dE7130" + }, + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" + } + }, + "injective": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "ibc/7E1AF94AD246BE522892751046F0C959B768642E5671CC3742264068D49553C0" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "ibc/265ABC4B9F767AF45CAC6FB76E930548D835EDA3E94BC56B70582A55A73D8C90" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "ibc/90C6F06139D663CFD7949223D257C5B5D241E72ED61EBD12FFDDA6F068715E47" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "ibc/4C8A332AE4FDE42709649B5F9A2A336192158C4465DF74B4513F5AD0C583EA6F" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/65A6973F7A4013335AE5FFE623FE019A78A1FEEE9B8982985099978837D764A7" + }, + "dot-planck": { + "symbol": "axlDOT", + "decimals": 10, + "name": "xcDOT", + "is_native": false, + "address": "ibc/624BA9DD171915A2B9EA70F69638B2CEA179959850C1A586F6C485498F29EDD4" + }, + "busd-wei": { + "symbol": "axlBUSD", + "decimals": 18, + "name": "Binance USD", + "is_native": false, + "address": "ibc/A62F794AAEC56B6828541224D91DA3E21423AB0DC4D21ECB05E4588A07BD934C" + }, + "wmatic-wei": { + "symbol": "axlMATIC", + "decimals": 18, + "name": "Wrapped Matic", + "is_native": false, + "address": "ibc/7E23647941230DA0AB4ED10F599647D9BE34E1C991D0DA032B5A1522941EBA73" + }, + "wavax-wei": { + "symbol": "axlAVAX", + "decimals": 18, + "name": "Wrapped AVAX", + "is_native": false, + "address": "ibc/A4FF8E161D2835BA06A7522684E874EFC91004AD0CD14E038F37940562158D73" + }, + "wglmr-wei": { + "symbol": "axlGLMR", + "decimals": 18, + "name": "Wrapped GLMR", + "is_native": false, + "address": "ibc/8FF72FB47F07B4AFA8649500A168683BEFCB9EE164BD331FA597D26224D51055" + }, + "wbnb-wei": { + "symbol": "axlBNB", + "decimals": 18, + "name": "Wrapped BNB", + "is_native": false, + "address": "ibc/B877B8EF095028B807370AB5C7790CA0C328777C9FF09AA7F5436BA7FAE4A86F" + }, + "wftm-wei": { + "symbol": "axlFTM", + "decimals": 18, + "name": "Wrapped Fantom", + "is_native": false, + "address": "ibc/31E8DDA49D53535F358B29CFCBED1B9224DAAFE82788C0477930DCDE231DA878" + }, + "rai-wei": { + "symbol": "axlRAI", + "decimals": 18, + "name": "Rai Reflex Index", + "is_native": false, + "address": "ibc/27817BAE3958FFB2BFBD8F4F6165153DFD230779994A7C42A91E0E45E8201768" + }, + "link-wei": { + "symbol": "axlLINK", + "decimals": 18, + "name": "ChainLink Token", + "is_native": false, + "address": "ibc/AC447F1D6EDAF817589C5FECECB6CD3B9E9EFFD33C7E16FE8820009F92A2F585" + }, + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", + "is_native": false, + "address": "ibc/3E5504815B2D69DCC32B1FF54CDAC28D7DA2C445BD29C496A83732DC1D52DB90" + }, + "mkr-wei": { + "symbol": "axlMKR", + "decimals": 18, + "name": "Maker", + "is_native": false, + "address": "ibc/E8C65EFAB7804152191B8311F61877A36779277E316883D8812D3CBEFC79AE4F" + }, + "uni-wei": { + "symbol": "axlUNI", + "decimals": 18, + "name": "Uniswap", + "is_native": false, + "address": "ibc/3E3A8A403AE81114F4341962A6D73162D586C9DF4CE3BE7C7B459108430675F7" + }, + "shib-wei": { + "symbol": "axlSHIB", + "decimals": 18, + "name": "SHIBA INU", + "is_native": false, + "address": "ibc/E68343A4DEF4AFBE7C5A9004D4C11888EE755A7B43B3F1AFA52F2C34C07990D5" + } + }, + "juno": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "ibc/EAC38D55372F38F1AFD68DF7FE9EF762DCF69F26520643CF3F9D292A738D8034" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "ibc/EBE900AED8FF6BB2E186B17B066138F647CDD9647EF4FBE2DE6C8D4013A2C990" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "ibc/171E8F6687D290D378678310F9F15D367DCD245BF06184532B703A92054A8A4F" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "ibc/B22D08F0E3D08968FB3CBEE2C1E993581A99AAAA60D0490C1AF7DCE567D5FDDA" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "ibc/5EF597EA4E863132BFD3E051AC6BAA0175F00913D3256A41F11DC425C39527D6" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/95A45A81521EAFDBEDAEEB6DA975C02E55B414C95AD3CE50709272366A90CA17" + }, + "dot-planck": { + "symbol": "axlDOT", + "decimals": 10, + "name": "xcDOT", + "is_native": false, + "address": "ibc/5D681936B803C055E34687752EE1AA3117EACCA98260F98CC1706E040DCBAC4D" + }, + "busd-wei": { + "symbol": "axlBUSD", + "decimals": 18, + "name": "Binance USD", + "is_native": false, + "address": "ibc/01D29B33757B631D6E02A4AE8A852969273E2476ED83CB3F947D4AA5DB9F151E" + }, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "ibc/D5D1F7B6004D1918CE125862C942F3289DE06E271661C2DD32E3F71479BAF751" + }, + "cusd-wei": { + "symbol": "cUSD", + "decimals": 18, + "name": "Celo Dollar", + "is_native": false, + "address": "ibc/F155E10E083EFFC0E1E69E2787C732AF257EE9AA7832AD616E5C536D0582429F" + }, + "cbeth-wei": { + "symbol": "cbETH", + "decimals": 18, + "name": "Coinbase Wrapped Staked ETH", + "is_native": false, + "address": "ibc/847E4A6698D469C9328F1BE68759C78C82891F90B42B7B13BC86462B7F2BE12B" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": false, + "address": "ibc/39A90E0FA128DAE477510F0B9BE848B0D3C6D3BE2A464667B79EAD9BB847CC47" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "ibc/9DBEF73DA119E34AF557B89F6C161FCAD928AEB1DA0AA45C095F2A2E7FF038BE" + }, + "reth-wei": { + "symbol": "rETH", + "decimals": 18, + "name": "Rocket Pool ETH", + "is_native": false, + "address": "ibc/10B9D995E2011BA306A3FFDBCD2B6A091002EF225DE02ACED49694B42940DD1F" + }, + "arb-wei": { + "symbol": "axlARB", + "decimals": 18, + "name": "Arbitrum", + "is_native": false, + "address": "ibc/CFBDAF961EC673ADC67091377E56D338E390B8A0953F5FED80387B765E8DCD53" + }, + "wmatic-wei": { + "symbol": "axlMATIC", + "decimals": 18, + "name": "Wrapped Matic", + "is_native": false, + "address": "ibc/C3A8C0BA97F3CD808F828E422CCBB39A5206644DF0A65FA79160E4413684EE14" + }, + "wavax-wei": { + "symbol": "axlAVAX", + "decimals": 18, + "name": "Wrapped AVAX", + "is_native": false, + "address": "ibc/02B88E41C96FCADA33F15642CEE961EE17A63866EDCA4098EDDB6F9C6671EB92" + }, + "wglmr-wei": { + "symbol": "axlGLMR", + "decimals": 18, + "name": "Wrapped GLMR", + "is_native": false, + "address": "ibc/5539E7CB6FF8FDA12AE6BF20E8862513D787BF1712296EB4AA06DD86920FFBC1" + }, + "wbnb-wei": { + "symbol": "axlBNB", + "decimals": 18, + "name": "Wrapped BNB", + "is_native": false, + "address": "ibc/735AFF12D7AF5EEC8F4339448BBF001547AEA05CCA6F1CAA60C139AE87828EB1" + }, + "wftm-wei": { + "symbol": "axlFTM", + "decimals": 18, + "name": "Wrapped Fantom", + "is_native": false, + "address": "ibc/BCA8E085B8D4D9D89D5316165E51545B826C5E034EACD6C00A7464C58F318379" + }, + "pepe-wei": { + "symbol": "axlPEPE", + "decimals": 18, + "name": "Pepe", + "is_native": false, + "address": "ibc/3406FBBAEB20E62FF238FF6FD061BCF21F515E1546D3E9FF8571B12BDA29DDBB" + }, + "rai-wei": { + "symbol": "axlRAI", + "decimals": 18, + "name": "Rai Reflex Index", + "is_native": false, + "address": "ibc/4AA19294AE89888CE7DB64CA76781EE2FE9A0B703B8A5F156AD258428F7A77C4" + }, + "link-wei": { + "symbol": "axlLINK", + "decimals": 18, + "name": "ChainLink Token", + "is_native": false, + "address": "ibc/0409596DFE559E1B05D821CA3A5F8E290A7C2C3408B4872595CA0E22F13A09FE" + }, + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", + "is_native": false, + "address": "ibc/1CE15165C83F70C7DB18B19C417321B02512A85BCB9FB8E553FC10070D122036" + }, + "mkr-wei": { + "symbol": "axlMKR", + "decimals": 18, + "name": "Maker", + "is_native": false, + "address": "ibc/4A59932EAD8A140F66554E8E2B5CB80DCA5314A75A889F0AA2E648D96B69847F" + }, + "uni-wei": { + "symbol": "axlUNI", + "decimals": 18, + "name": "Uniswap", + "is_native": false, + "address": "ibc/0313AD311FA169EC5A130DB2EF0840CBA4B300ADB6B85A79FBA952FBD3E7B107" + }, + "shib-wei": { + "symbol": "axlSHIB", + "decimals": 18, + "name": "SHIBA INU", + "is_native": false, + "address": "ibc/D66D0A82177FF29CBB8A83705C26C28D45A14678579E350B10493D359ECFD851" + }, + "wfil-wei": { + "symbol": "axlFIL", + "decimals": 18, + "name": "Wrapped FIL", + "is_native": false, + "address": "ibc/9DC98F4F0ED2816422497CA3D1BE02E38D0656F031173654903ADD248A1C3720" + } + }, + "kava": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" + }, + "wmai-wei": { + "symbol": "axlWMAI", + "decimals": 18, + "name": "Wrapped MAI", + "is_native": false, + "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" + }, + "lqdr-wei": { + "symbol": "axlLqdr", + "decimals": 18, + "name": "LqdrV2", + "is_native": false, + "address": "0x332c72dd7E77070740F01d2d35851c461585D5d0" + }, + "ern-wei": { + "symbol": "ERN", + "decimals": 18, + "name": "Ethos Reserve Note", + "is_native": false, + "address": "0xa334884bF6b0A066d553D19e507315E839409e62" + }, + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", + "is_native": false, + "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" + }, + "uosmo": { + "symbol": "axlOSMO", + "decimals": 6, + "name": "Axelar Wrapped OSMO", + "is_native": false, + "address": "0x0adCfE03525252A1f5cdca30e49b2752938A7B90" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": false, + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D" + }, + "sfrax-wei": { + "symbol": "sFRAX", + "decimals": 18, + "name": "Staked FRAX", + "is_native": false, + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" + }, + "fxs-wei": { + "symbol": "FXS", + "decimals": 18, + "name": "Frax Share", + "is_native": false, + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721" + }, + "oath-wei": { + "symbol": "OATH", + "decimals": 18, + "name": "Oath Token", + "is_native": false, + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + }, + "knc-wei": { + "symbol": "axlKNC", + "decimals": 18, + "name": "Kyber Network Crystal v2", + "is_native": false, + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" + }, + "orbs-wei": { + "symbol": "ORBS", + "decimals": 18, + "name": "Orbs", + "is_native": false, + "address": "0xf3C091ed43de9c270593445163a41A876A0bb3dd" + }, + "deus-wei": { + "symbol": "axlDEUS", + "decimals": 18, + "name": "DEUS", + "is_native": false, + "address": "0xebD4A18034C78A415088DF8508f102421eD693b1" + }, + "uatom": { + "symbol": "axlATOM", + "decimals": 6, + "name": "Cosmoshub staking ATOM", + "is_native": false, + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" + }, + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", + "is_native": false, + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" + }, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": false, + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f" + }, + "wfil-wei": { + "symbol": "axlFIL", + "decimals": 18, + "name": "Wrapped FIL", + "is_native": false, + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" + }, + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", + "is_native": false, + "address": "0x809c55916bb542c1419724022B3F0162087E3C88" + }, + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", + "is_native": false, + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B" + }, + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", + "is_native": false, + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5" + }, + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", + "is_native": false, + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5" + }, + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", + "is_native": false, + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6" + }, + "aISLM": { + "symbol": "ISLM", + "decimals": 18, + "name": "Islamic Coin", + "is_native": false, + "address": "0x2a98d978817949D45a5528013850772E762B7F12" + }, + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", + "is_native": false, + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D" + }, + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", + "is_native": false, + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61" + }, + "busd-wei": { + "symbol": "axlBUSD", + "decimals": 18, + "name": "Binance USD", + "is_native": false, + "address": "0x4D84E25cEa9447581867fE9f2329B972f532Da2c" + }, + "wbnb-wei": { + "symbol": "axlBNB", + "decimals": 18, + "name": "Wrapped BNB", + "is_native": false, + "address": "0x23A6486099f740B7688A0bb7AED7C912015cA2F0" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", + "is_native": false, + "address": "0x520391D410314451E12A85D79970a61915Bc315D" + }, + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", + "is_native": false, + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8" + }, + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF" + } + }, + "ki": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "ibc/E1E3674A0E4E1EF9C69646F9AF8D9497173821826074622D831BAB73CCB99A2D" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "ibc/B5172730CC62ACC6BCB4853D9B6F2C723438A6D7EA9009F44D8096D41FF04166" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "ibc/386A4031D68DE6370B85F9FF7E89CEF8DE7CDE01CC193CBD87BD3ED60F6662CE" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "ibc/911B721F15A40ABB29636CBF8AE630076DDF62841ACE7E6D879405CA8870CEA2" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/9B68CC79EFF12D25AF712EB805C5062B8F97B2CCE5F3FE55B107EE03095514A3" + }, + "dot-planck": { + "symbol": "axlDOT", + "decimals": 10, + "name": "xcDOT", + "is_native": false, + "address": "ibc/684772AC22DBD0C4F798F76A17B54CAC4D0935FED4E8A8B3E853F94BE842FDC9" + }, + "busd-wei": { + "symbol": "axlBUSD", + "decimals": 18, + "name": "Binance USD", + "is_native": false, + "address": "ibc/D51641D8F6C96ADE0858FC97F9F002F8436CB3E2EE9B08DAE04E1D942349C777" + }, + "wmatic-wei": { + "symbol": "axlMATIC", + "decimals": 18, + "name": "Wrapped Matic", + "is_native": false, + "address": "ibc/45368D217CE1F76A1214FA6F1F31493B5F127793E6AB4873B39A81A8CE21A18E" + }, + "wavax-wei": { + "symbol": "axlAVAX", + "decimals": 18, + "name": "Wrapped AVAX", + "is_native": false, + "address": "ibc/496812EE3F92871345EAFC70A2E747D30B13B1D99DB19538076F954DEF4B5B1D" + }, + "wglmr-wei": { + "symbol": "axlGLMR", + "decimals": 18, + "name": "Wrapped GLMR", + "is_native": false, + "address": "ibc/927DA5BD557C059E3FA6816B2023B24EE4C1B149CDBFBC70A771F8C425DBB91A" + }, + "wbnb-wei": { + "symbol": "axlBNB", + "decimals": 18, + "name": "Wrapped BNB", + "is_native": false, + "address": "ibc/F4B1551A3470D93A725460F109FB57990702B703790D8A21C7DC66AEF3BACBF4" + }, + "wftm-wei": { + "symbol": "axlFTM", + "decimals": 18, + "name": "Wrapped Fantom", + "is_native": false, + "address": "ibc/CC7B0778EABFED87BA0B91C38A9127524DB191BFD6C230FA1862456BE04424A4" + }, + "rai-wei": { + "symbol": "axlRAI", + "decimals": 18, + "name": "Rai Reflex Index", + "is_native": false, + "address": "ibc/783AB835CDB043AFB003843BCEEE5CF16D10BA4B5F113360ACC24730E25E6648" + }, + "link-wei": { + "symbol": "axlLINK", + "decimals": 18, + "name": "ChainLink Token", + "is_native": false, + "address": "ibc/1B31416323D25DAAD779DBC59DE5C31A187F1E8A5EAB57B0892789F9855B973C" + }, + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", + "is_native": false, + "address": "ibc/5F659691870E909D0F48F3B12D06DF64854D711B4B5927DC2352175A972197E5" + }, + "mkr-wei": { + "symbol": "axlMKR", + "decimals": 18, + "name": "Maker", + "is_native": false, + "address": "ibc/6FEC4D9AFC20E22A9388B6466F27D91479CADED5D0E6F7AADBBD9B6E30A494EC" + }, + "uni-wei": { + "symbol": "axlUNI", + "decimals": 18, + "name": "Uniswap", + "is_native": false, + "address": "ibc/6C33F08AFE906E0FBC9ED78CAA2B189D2691F2F49972577D7AF5E43F77118410" + }, + "shib-wei": { + "symbol": "axlSHIB", + "decimals": 18, + "name": "SHIBA INU", + "is_native": false, + "address": "ibc/4CD89078E929E478404487FEEC097E968FCB331C12A2FA1D87108A118A413772" + } + }, + "kujira": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "ibc/295548A78785A1007F232DE286149A6FF512F180AF5657780FC89C009E2C348F" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "ibc/C01154C2547F4CB10A985EA78E7CD4BA891C1504360703A37E1D7043F06B5E1F" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "ibc/3914BDEF46F429A26917E4D8D434620EC4817DC6B6E68FB327E190902F1E9242" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "ibc/F2331645B9683116188EF36FC04A809C28BD36B54555E8705A37146D0182F045" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "ibc/301DAF9CB0A9E247CD478533EF0E21F48FF8118C4A51F77C8BC3EB70E5566DBC" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/1B38805B1C75352B28169284F96DF56BDEBD9E8FAC005BDCC8CF0378C82AA8E7" + }, + "dot-planck": { + "symbol": "axlDOT", + "decimals": 10, + "name": "xcDOT", + "is_native": false, + "address": "ibc/B37E4D9FB5B30F3E1E20A4B2DE2A005E584C5C822C44527546556AE2470B4539" + }, + "busd-wei": { + "symbol": "axlBUSD", + "decimals": 18, + "name": "Binance USD", + "is_native": false, + "address": "ibc/65CD60D7E37EF830BC6B6A6DF4E3E3884A96C0905A7D271C48DC0440B1989EC7" + }, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "ibc/B572E6F30E7C33D78A50D8B4E973A9C118C30F848DF31A95FAA5E4C7450A8BD0" + }, + "cusd-wei": { + "symbol": "cUSD", + "decimals": 18, + "name": "Celo Dollar", + "is_native": false, + "address": "ibc/03FEA3C82EA1987EC2B074E71D2156AA55764D5DAFA3916D38309F18C3256A51" + }, + "ukuji": { + "symbol": "KUJI", + "decimals": 6, + "name": "Kujira native asset", + "is_native": true, + "address": "ukuji" + }, + "cbeth-wei": { + "symbol": "cbETH", + "decimals": 18, + "name": "Coinbase Wrapped Staked ETH", + "is_native": false, + "address": "ibc/3F782FAA0722C47BA753F60010148DB067BD916F3894931552F5007CF5F5F2BC" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": false, + "address": "ibc/579194AD6EB1B02FE30D7031EF284C1BB7B272EE5F7700462CD8B3DECB542175" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "ibc/109344A54219780F810CF9EFC1FE0EC1209E66F27B2B6F9C7187521EA62D0A9B" + }, + "sfrax-wei": { + "symbol": "sFRAX", + "decimals": 18, + "name": "Staked FRAX", + "is_native": false, + "address": "ibc/E727C3108CCF0299A0331BBC7C62909644BB92D4D01421073154A209A3D80F28" + }, + "fxs-wei": { + "symbol": "FXS", + "decimals": 18, + "name": "Frax Share", + "is_native": false, + "address": "ibc/6EC52E4E4105A3647FE4626767F6E169DBC56CE99862DF62935CD273F3F92CD1" + }, + "reth-wei": { + "symbol": "rETH", + "decimals": 18, + "name": "Rocket Pool ETH", + "is_native": false, + "address": "ibc/0ABEC6EE026C0BEE3712CE58BC0A5D7A7B8B8130535094E459152CB562C1EC85" + }, + "arb-wei": { + "symbol": "axlARB", + "decimals": 18, + "name": "Arbitrum", + "is_native": false, + "address": "ibc/96179F5B44CCC15E03AB43D7118E714B4D5CE8F187F7D8A60F2A514299761EA9" + }, + "wmatic-wei": { + "symbol": "axlMATIC", + "decimals": 18, + "name": "Wrapped Matic", + "is_native": false, + "address": "ibc/A64467480BBE4CCFC3CF7E25AD1446AA9BDBD4F5BCB9EF6038B83D6964C784E6" + }, + "wavax-wei": { + "symbol": "axlAVAX", + "decimals": 18, + "name": "Wrapped AVAX", + "is_native": false, + "address": "ibc/004EBF085BBED1029326D56BE8A2E67C08CECE670A94AC1947DF413EF5130EB2" + }, + "wglmr-wei": { + "symbol": "axlGLMR", + "decimals": 18, + "name": "Wrapped GLMR", + "is_native": false, + "address": "ibc/C8D63703F5805CE6A2B20555139CF6ED9CDFA870389648EB08D688B94B0AE2C1" + }, + "wbnb-wei": { + "symbol": "axlBNB", + "decimals": 18, + "name": "Wrapped BNB", + "is_native": false, + "address": "ibc/DADB399E742FCEE71853E98225D13E44E90292852CD0033DF5CABAB96F80B833" + }, + "wftm-wei": { + "symbol": "axlFTM", + "decimals": 18, + "name": "Wrapped Fantom", + "is_native": false, + "address": "ibc/E67ADA2204A941CD4743E70771BA08E24885E1ADD6FD140CE1F9E0FEBB68C6B2" + }, + "pepe-wei": { + "symbol": "axlPEPE", + "decimals": 18, + "name": "Pepe", + "is_native": false, + "address": "ibc/0447761C090DB521DAC0268E8CB4EBF567E519B937DE6FECD2472AA6A1EDE658" + }, + "rai-wei": { + "symbol": "axlRAI", + "decimals": 18, + "name": "Rai Reflex Index", + "is_native": false, + "address": "ibc/4CA23432A78B272A9EB7010CB72A15A199066D239F1B13BB583F3945EB8A315C" + }, + "link-wei": { + "symbol": "axlLINK", + "decimals": 18, + "name": "ChainLink Token", + "is_native": false, + "address": "ibc/FC59D6840A41252352263CEA2B832BB86D68D03CBA194263CB9F3C15946796FB" + }, + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", + "is_native": false, + "address": "ibc/7B11FE7D6385B46B9F3598B298B81A773CB20A8BA12001D87A78580314218364" + }, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": false, + "address": "ibc/27987DF83B82160E42FA9487986B2BBCFEB9B43C8B321485A8B69502773B62C0" + }, + "mkr-wei": { + "symbol": "axlMKR", + "decimals": 18, + "name": "Maker", + "is_native": false, + "address": "ibc/31A4E6623063E702FB9CF2E7B616DFCCDE319CA2FC4775CDFF26F29F628E7ACF" + }, + "uni-wei": { + "symbol": "axlUNI", + "decimals": 18, + "name": "Uniswap", + "is_native": false, + "address": "ibc/0A88A08F3E9573DB9D8CB74AA3746F6D23C41C3EE7B6CC5AA4695A1DD74FF86B" + }, + "shib-wei": { + "symbol": "axlSHIB", + "decimals": 18, + "name": "SHIBA INU", + "is_native": false, + "address": "ibc/43BF3152103ED706E207005E7C433AB3440572C1D444FFE49321A0EF6A8EFC82" + }, + "wfil-wei": { + "symbol": "axlFIL", + "decimals": 18, + "name": "Wrapped FIL", + "is_native": false, + "address": "ibc/12B075C6C552060240E92A4A215CAF4DB0F1CA98F90897AB30282B9A15842595" + }, + "yieldusd-wei": { + "symbol": "axlYieldUSD", + "decimals": 18, + "name": "Real Yield USD", + "is_native": false, + "address": "ibc/2DA5C8103F4BAFEF39901CA418EE2CAAE53BF661FA648E80A9EF1EEE925696B4" + }, + "yieldeth-wei": { + "symbol": "axlYieldETH", + "decimals": 18, + "name": "Real Yield ETH", + "is_native": false, + "address": "ibc/B4B3B08FE5FEA65CB25E467C9D95D180A6CDB0EBE730E7BB20CA1BF6C9A80D9B" + }, + "yum-wei": { + "symbol": "YUM", + "decimals": 18, + "name": "Yum", + "is_native": false, + "address": "ibc/507BE7E33F06026652F519AD4D36716251F2D34DF04514A905D3B19A7D8130F7" + } + }, + "linea": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" + }, + "wmai-wei": { + "symbol": "axlWMAI", + "decimals": 18, + "name": "Wrapped MAI", + "is_native": false, + "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" + }, + "busd-wei": { + "symbol": "axlBUSD", + "decimals": 18, + "name": "Binance USD", + "is_native": false, + "address": "0x4D84E25cEa9447581867fE9f2329B972f532Da2c" + }, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" + }, + "ern-wei": { + "symbol": "ERN", + "decimals": 18, + "name": "Ethos Reserve Note", + "is_native": false, + "address": "0xa334884bF6b0A066d553D19e507315E839409e62" + }, + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", + "is_native": false, + "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": false, + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D" + }, + "sfrax-wei": { + "symbol": "sFRAX", + "decimals": 18, + "name": "Staked FRAX", + "is_native": false, + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" + }, + "fxs-wei": { + "symbol": "FXS", + "decimals": 18, + "name": "Frax Share", + "is_native": false, + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721" + }, + "arb-wei": { + "symbol": "axlARB", + "decimals": 18, + "name": "Arbitrum", + "is_native": false, + "address": "0x87b6c94c435F6e49789ad34FAf0d048F2D9043a2" + }, + "mpx-wei": { + "symbol": "MPX", + "decimals": 18, + "name": "MPX", + "is_native": false, + "address": "0xa5325A8EBBbdb12CAF6b76218a7375a71f9f3b41" + }, + "ovn-wei": { + "symbol": "OVN", + "decimals": 18, + "name": "OVN", + "is_native": false, + "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396" + }, + "hzn-wei": { + "symbol": "HZN", + "decimals": 18, + "name": "Horizon", + "is_native": true, + "address": "0x0B1A02A7309dFbfAD1Cd4adC096582C87e8A3Ac1" + }, + "oath-wei": { + "symbol": "OATH", + "decimals": 18, + "name": "Oath Token", + "is_native": false, + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + }, + "knc-wei": { + "symbol": "axlKNC", + "decimals": 18, + "name": "Kyber Network Crystal v2", + "is_native": false, + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" + }, + "gdx-wei": { + "symbol": "GDX", + "decimals": 18, + "name": "Gridex", + "is_native": false, + "address": "0x91c415FEcD651F11D24aC4b72Ed08dbEb9868D43" + }, + "stuatom": { + "symbol": "stATOM", + "decimals": 6, + "name": "Stride Staked Atom", + "is_native": false, + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" + }, + "ustrd": { + "symbol": "STRD", + "decimals": 6, + "name": "Stride", + "is_native": false, + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F" + }, + "wmatic-wei": { + "symbol": "axlMATIC", + "decimals": 18, + "name": "Wrapped Matic", + "is_native": false, + "address": "0xE3ce47AC96d8502824627d7cBCFDA49414beDa9C" + }, + "wavax-wei": { + "symbol": "axlAVAX", + "decimals": 18, + "name": "Wrapped AVAX", + "is_native": false, + "address": "0x6E76A241Ae6fcaD51C064Ac70fe6e676502b91c5" + }, + "wbnb-wei": { + "symbol": "axlBNB", + "decimals": 18, + "name": "Wrapped BNB", + "is_native": false, + "address": "0x23A6486099f740B7688A0bb7AED7C912015cA2F0" + }, + "wftm-wei": { + "symbol": "axlFTM", + "decimals": 18, + "name": "Wrapped Fantom", + "is_native": false, + "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8" + }, + "uatom": { + "symbol": "axlATOM", + "decimals": 6, + "name": "Cosmoshub staking ATOM", + "is_native": false, + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" + }, + "utia": { + "symbol": "axlTIA", + "decimals": 6, + "name": "Axelar Wrapped TIA", + "is_native": false, + "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97" + }, + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", + "is_native": false, + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" + }, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": false, + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f" + }, + "wfil-wei": { + "symbol": "axlFIL", + "decimals": 18, + "name": "Wrapped FIL", + "is_native": false, + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" + }, + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", + "is_native": false, + "address": "0x809c55916bb542c1419724022B3F0162087E3C88" + }, + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", + "is_native": false, + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B" + }, + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", + "is_native": false, + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5" + }, + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", + "is_native": false, + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5" + }, + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", + "is_native": false, + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6" + }, + "aISLM": { + "symbol": "ISLM", + "decimals": 18, + "name": "Islamic Coin", + "is_native": false, + "address": "0x2a98d978817949D45a5528013850772E762B7F12" + }, + "lqdr-wei": { + "symbol": "axlLqdr", + "decimals": 18, + "name": "LqdrV2", + "is_native": false, + "address": "0x332c72dd7E77070740F01d2d35851c461585D5d0" + }, + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", + "is_native": false, + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D" + }, + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", + "is_native": false, + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", + "is_native": false, + "address": "0x520391D410314451E12A85D79970a61915Bc315D" + }, + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", + "is_native": false, + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8" + }, + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF" + } + }, + "mantle": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + }, + "dai-wei": { + "symbol": "axlDAI", + "decimals": 18, + "name": "Dai Stablecoin", + "is_native": false, + "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7" + }, + "uusdt": { + "symbol": "axlUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" + }, + "wmai-wei": { + "symbol": "axlWMAI", + "decimals": 18, + "name": "Wrapped MAI", + "is_native": false, + "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" }, - "uni-wei": { - "symbol": "axlUNI", + "wsteth-wei": { + "symbol": "axl-wstETH", "decimals": 18, - "name": "Uniswap", + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "ibc/6B74A1C555CC76DCCBD3D0FEF57A03A585F809D3D69D82576FA36A7DB750B96C" + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" }, - "shib-wei": { - "symbol": "axlSHIB", + "ern-wei": { + "symbol": "ERN", "decimals": 18, - "name": "SHIBA INU", + "name": "Ethos Reserve Note", "is_native": false, - "address": "ibc/EA3B16A45C6B2DF71053149CC13928FDE737F65B7EE3B0E134EA0886E6C01D58" + "address": "0xa334884bF6b0A066d553D19e507315E839409e62" + }, + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", + "is_native": false, + "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": false, + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D" + }, + "sfrax-wei": { + "symbol": "sFRAX", + "decimals": 18, + "name": "Staked FRAX", + "is_native": false, + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" + }, + "fxs-wei": { + "symbol": "FXS", + "decimals": 18, + "name": "Frax Share", + "is_native": false, + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721" + }, + "ktc-wei": { + "symbol": "KTC", + "decimals": 18, + "name": "KTX Community Token", + "is_native": false, + "address": "0x01C5ED019A1Bc07d3A320a09C83C398d91f8fd5D" + }, + "oath-wei": { + "symbol": "OATH", + "decimals": 18, + "name": "Oath Token", + "is_native": false, + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + }, + "knc-wei": { + "symbol": "axlKNC", + "decimals": 18, + "name": "Kyber Network Crystal v2", + "is_native": false, + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" + }, + "stuatom": { + "symbol": "stATOM", + "decimals": 6, + "name": "Stride Staked Atom", + "is_native": false, + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" + }, + "ustrd": { + "symbol": "STRD", + "decimals": 6, + "name": "Stride", + "is_native": false, + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F" + }, + "wftm-wei": { + "symbol": "axlFTM", + "decimals": 18, + "name": "Wrapped Fantom", + "is_native": false, + "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8" + }, + "uatom": { + "symbol": "axlATOM", + "decimals": 6, + "name": "Cosmoshub staking ATOM", + "is_native": false, + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" + }, + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", + "is_native": false, + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" + }, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": false, + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f" + }, + "wfil-wei": { + "symbol": "axlFIL", + "decimals": 18, + "name": "Wrapped FIL", + "is_native": false, + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" + }, + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", + "is_native": false, + "address": "0x809c55916bb542c1419724022B3F0162087E3C88" + }, + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", + "is_native": false, + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B" + }, + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", + "is_native": false, + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5" + }, + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", + "is_native": false, + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5" + }, + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", + "is_native": false, + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6" + }, + "aISLM": { + "symbol": "ISLM", + "decimals": 18, + "name": "Islamic Coin", + "is_native": false, + "address": "0x2a98d978817949D45a5528013850772E762B7F12" + }, + "wmnt-wei": { + "symbol": "WMNT", + "decimals": 18, + "name": "Wrapped Mantle", + "is_native": true, + "address": "0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8" + }, + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", + "is_native": false, + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D" + }, + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", + "is_native": false, + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", + "is_native": false, + "address": "0x520391D410314451E12A85D79970a61915Bc315D" + }, + "usomm": { + "symbol": "axlSOMM", + "decimals": 6, + "name": "Axelar Wrapped SOMM", + "is_native": false, + "address": "0x4e914bbDCDE0f455A8aC9d59d3bF739c46287Ed2" + }, + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", + "is_native": false, + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8" + }, + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF" + }, + "fbtc-satoshi": { + "symbol": "FBTC", + "decimals": 8, + "name": "Fire Bitcoin", + "is_native": true, + "address": "0xC96dE26018A54D51c097160568752c4E3BD6C364" } }, - "filecoin": { + "migaloo": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" + "address": "ibc/3808384ECC813CAF207992BE997BD18E18560E473D5368F1B4B77C3822262C4D" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "ibc/B65E189D3168DB40C88C6A6C92CA3D3BB0A8B6310325D4C43AB5702F06ECD60B" + }, + "wavax-wei": { + "symbol": "axlAVAX", + "decimals": 18, + "name": "Wrapped AVAX", + "is_native": false, + "address": "ibc/E09B0B8169A4DCE24AAE8C44E02477143A328D0AAE5EE67D9D645BA75F0C1C05" + } + }, + "moonbeam": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "0xCa01a1D0993565291051daFF390892518ACfAD3A" }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + "address": "0x467719aD09025FcC6cF6F8311755809d45a5E5f3" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7" + "address": "0x14dF360966a1c4582d2b18EDbdae432EA0A27575" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" + "address": "0xDFd74aF792bC6D45D1803F425CE62Dd16f8Ae038" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + "address": "0x8e9a09bc94689c157Cd7f6aB5d4577ED6f44Ba1E" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "0x85a8B472d116585E2cc10eB1e0e3E3127E1f5D3f" }, "wmai-wei": { "symbol": "axlWMAI", "decimals": 18, "name": "Wrapped MAI", "is_native": false, - "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" + "address": "0xbFE3Acdca835bB60A6B51Ee6B947779A02eCE911" }, - "weth-wei": { - "symbol": "axlETH", + "dot-planck": { + "symbol": "DOT", + "decimals": 10, + "name": "xcDOT", + "is_native": true, + "address": "0xFfFFfFff1FcaCBd218EDc0EbA20Fc2308C778080" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", "decimals": 18, - "name": "Wrapped Ether", + "name": "Staked Frax Ether", "is_native": false, - "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" + "address": "0xa30d75990F80eC49944D5fC30157D43Fc28777b3" }, - "uatom": { - "symbol": "axlATOM", - "decimals": 6, - "name": "Cosmoshub staking ATOM", + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", "is_native": false, - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" + "address": "0x29C795559e4Db87054Ba70fafC454214c20aDbD4" }, - "frax-wei": { - "symbol": "axlFRAX", + "sfrax-wei": { + "symbol": "sFRAX", "decimals": 18, - "name": "Frax", + "name": "Staked FRAX", "is_native": false, - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" + "address": "0x481Fbf0d866b777e817bbC3f96970B44fc929Ba7" }, - "wfil-wei": { - "symbol": "WFIL", + "fxs-wei": { + "symbol": "FXS", "decimals": 18, - "name": "Wrapped FIL", - "is_native": true, - "address": "0x60E1773636CF5E4A227d9AC24F20fEca034ee25A" + "name": "Frax Share", + "is_native": false, + "address": "0x151904806a266EEe52700E195D2937891fb8eD59" }, "oath-wei": { "symbol": "OATH", "decimals": 18, "name": "Oath Token", "is_native": false, - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + "address": "0xd20523b39fAF1D6e9023a4D6085f87B7b0DE7926" }, "knc-wei": { "symbol": "axlKNC", "decimals": 18, "name": "Kyber Network Crystal v2", "is_native": false, - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" - } - }, - "injective": { - "uusdc": { - "symbol": "axlUSDC", + "address": "0x5Ac3aD1acC0A3EFd6fB89791967656128e86d8C5" + }, + "stuatom": { + "symbol": "stATOM", + "decimals": 6, + "name": "Stride Staked Atom", + "is_native": false, + "address": "0x2924894E7886C6B9018179946EE389bb06534021" + }, + "ustrd": { + "symbol": "STRD", + "decimals": 6, + "name": "Stride", + "is_native": false, + "address": "0x85eBBf7253295d37C5FC98bE5Aac87CA4378c2e2" + }, + "wglmr-wei": { + "symbol": "WGLMR", + "decimals": 18, + "name": "Wrapped GLMR", + "is_native": true, + "address": "0xAcc15dC74880C9944775448304B263D191c6077F" + }, + "uatom": { + "symbol": "axlATOM", "decimals": 6, - "name": "USD Coin", + "name": "Cosmoshub staking ATOM", "is_native": false, - "address": "ibc/7E1AF94AD246BE522892751046F0C959B768642E5671CC3742264068D49553C0" + "address": "0x27292cf0016E5dF1d8b37306B2A98588aCbD6fCA" }, - "dai-wei": { - "symbol": "axlDAI", + "pepe-wei": { + "symbol": "axlPEPE", "decimals": 18, - "name": "Dai Stablecoin", + "name": "Pepe", "is_native": false, - "address": "ibc/265ABC4B9F767AF45CAC6FB76E930548D835EDA3E94BC56B70582A55A73D8C90" + "address": "0xd67eB3e8eb74F5Ea6A1A9E87B4a6AE433AD829EC" }, - "uusdt": { - "symbol": "axlUSDT", + "uluna": { + "symbol": "LUNC", "decimals": 6, - "name": "Tether USD", + "name": "Axelar Wrapped LUNC", "is_native": false, - "address": "ibc/90C6F06139D663CFD7949223D257C5B5D241E72ED61EBD12FFDDA6F068715E47" + "address": "0x31DAB3430f3081dfF3Ccd80F17AD98583437B213" }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", + "uusd": { + "symbol": "USTC", + "decimals": 6, + "name": "Axelar Wrapped USTC", "is_native": false, - "address": "ibc/4C8A332AE4FDE42709649B5F9A2A336192158C4465DF74B4513F5AD0C583EA6F" + "address": "0x085416975fe14C2A731a97eC38B9bF8135231F62" }, - "dot-planck": { - "symbol": "axlDOT", - "decimals": 10, - "name": "xcDOT", + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", "is_native": false, - "address": "ibc/624BA9DD171915A2B9EA70F69638B2CEA179959850C1A586F6C485498F29EDD4" + "address": "0x61C82805453a989E99B544DFB7031902e9bac448" }, - "busd-wei": { - "symbol": "axlBUSD", + "fpi-wei": { + "symbol": "FPI", "decimals": 18, - "name": "Binance USD", + "name": "Frax Price Index", "is_native": false, - "address": "ibc/A62F794AAEC56B6828541224D91DA3E21423AB0DC4D21ECB05E4588A07BD934C" + "address": "0xFA3fd4CDAf85f65849A13a6Af9c3e5c20f71aD60" }, - "weth-wei": { - "symbol": "axlETH", + "wfil-wei": { + "symbol": "axlFIL", "decimals": 18, - "name": "Wrapped Ether", + "name": "Wrapped FIL", "is_native": false, - "address": "ibc/65A6973F7A4013335AE5FFE623FE019A78A1FEEE9B8982985099978837D764A7" + "address": "0x6A7b717aE5Ed65F85BA25403D5063D368239828e" }, - "wmatic-wei": { - "symbol": "axlMATIC", - "decimals": 18, - "name": "Wrapped Matic", + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", "is_native": false, - "address": "ibc/7E23647941230DA0AB4ED10F599647D9BE34E1C991D0DA032B5A1522941EBA73" + "address": "0x010cddfA5518f74c43Efe911db29Af71b44b4E1C" }, - "wavax-wei": { - "symbol": "axlAVAX", - "decimals": 18, - "name": "Wrapped AVAX", + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", "is_native": false, - "address": "ibc/A4FF8E161D2835BA06A7522684E874EFC91004AD0CD14E038F37940562158D73" + "address": "0xF7C79FfDa0d13b68081761BB0a5a66cFC48D97f5" }, - "wglmr-wei": { - "symbol": "axlGLMR", - "decimals": 18, - "name": "Wrapped GLMR", + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", "is_native": false, - "address": "ibc/8FF72FB47F07B4AFA8649500A168683BEFCB9EE164BD331FA597D26224D51055" + "address": "0xbBd788E2873d391F9eE7E965D9ef93305909Da3E" }, - "wbnb-wei": { - "symbol": "axlBNB", - "decimals": 18, - "name": "Wrapped BNB", + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", "is_native": false, - "address": "ibc/B877B8EF095028B807370AB5C7790CA0C328777C9FF09AA7F5436BA7FAE4A86F" + "address": "0xBA09B04F38310aCF7f098DaC6017D1AFcfB6411d" }, - "wftm-wei": { - "symbol": "axlFTM", - "decimals": 18, - "name": "Wrapped Fantom", + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", "is_native": false, - "address": "ibc/31E8DDA49D53535F358B29CFCBED1B9224DAAFE82788C0477930DCDE231DA878" + "address": "0x0Fd8d9F028d1594ff24697a10035D6EC265769b0" }, - "rai-wei": { - "symbol": "axlRAI", + "aISLM": { + "symbol": "ISLM", "decimals": 18, - "name": "Rai Reflex Index", + "name": "Islamic Coin", "is_native": false, - "address": "ibc/27817BAE3958FFB2BFBD8F4F6165153DFD230779994A7C42A91E0E45E8201768" + "address": "0xF10c41cA085FC8d9326a65408D14Dae28A3E69a5" }, - "link-wei": { - "symbol": "axlLINK", - "decimals": 18, - "name": "ChainLink Token", + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", "is_native": false, - "address": "ibc/AC447F1D6EDAF817589C5FECECB6CD3B9E9EFFD33C7E16FE8820009F92A2F585" + "address": "0xF2605EaB29c67d06E71372CA9dfA8aDfd2d34BbF" }, - "frax-wei": { - "symbol": "axlFRAX", - "decimals": 18, - "name": "Frax", + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", "is_native": false, - "address": "ibc/3E5504815B2D69DCC32B1FF54CDAC28D7DA2C445BD29C496A83732DC1D52DB90" + "address": "0xF84131c858EB4C51cda2ccF0Eb614994c456c9E7" }, - "mkr-wei": { - "symbol": "axlMKR", - "decimals": 18, - "name": "Maker", + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", "is_native": false, - "address": "ibc/E8C65EFAB7804152191B8311F61877A36779277E316883D8812D3CBEFC79AE4F" + "address": "0x24a6f525636d75eF3e4E090b44B75FeB440e9697" }, - "uni-wei": { - "symbol": "axlUNI", - "decimals": 18, - "name": "Uniswap", + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", "is_native": false, - "address": "ibc/3E3A8A403AE81114F4341962A6D73162D586C9DF4CE3BE7C7B459108430675F7" + "address": "0xD454b59f16D42667Be2fA55292d16647E27f40C4" }, - "shib-wei": { - "symbol": "axlSHIB", - "decimals": 18, - "name": "SHIBA INU", + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", "is_native": false, - "address": "ibc/E68343A4DEF4AFBE7C5A9004D4C11888EE755A7B43B3F1AFA52F2C34C07990D5" + "address": "0x2140f9DD6253417389699f396CaFC0e47597410a" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0xF42fCFfc27A5B8d0afEC45659407B82f9F32fA98" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0x8b21c0E5672F8937177d9a74B0d87AD7974BDA5D" } }, - "juno": { + "neutron": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/EAC38D55372F38F1AFD68DF7FE9EF762DCF69F26520643CF3F9D292A738D8034" + "address": "ibc/F082B65C88E4B6D5EF1DB243CDA1D331D002759E938A0F5CD3FFDC5D53B3E349" }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "ibc/EBE900AED8FF6BB2E186B17B066138F647CDD9647EF4FBE2DE6C8D4013A2C990" + "address": "ibc/C0E66D1C81D8AAF0E6896E05190FDFBC222367148F86AC3EA679C28327A763CD" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/171E8F6687D290D378678310F9F15D367DCD245BF06184532B703A92054A8A4F" + "address": "ibc/626DBDAD47E2867EE930907A2C97B9F61043523C40FB9C4FEEC980933D1F6790" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/B22D08F0E3D08968FB3CBEE2C1E993581A99AAAA60D0490C1AF7DCE567D5FDDA" + "address": "ibc/57503D7852EF4E1899FE6D71C5E81D7C839F76580F86F21E39348FC2BC9D7CE2" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/5EF597EA4E863132BFD3E051AC6BAA0175F00913D3256A41F11DC425C39527D6" + "address": "ibc/DF8722298D192AAB85D86D0462E8166234A6A9A572DD4A2EA7996029DF4DB363" }, - "pepe-wei": { - "symbol": "axlPEPE", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Pepe", + "name": "Wrapped Ether", "is_native": false, - "address": "ibc/3406FBBAEB20E62FF238FF6FD061BCF21F515E1546D3E9FF8571B12BDA29DDBB" + "address": "ibc/A585C2D15DCD3B010849B453A2CFCB5E213208A5AB665691792684C26274304D" }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, "name": "xcDOT", "is_native": false, - "address": "ibc/5D681936B803C055E34687752EE1AA3117EACCA98260F98CC1706E040DCBAC4D" + "address": "ibc/E74CD453F834EE007B02F1298EFFF4DCD9C97FB58DF7F6080FF935145B73C6A6" }, "busd-wei": { "symbol": "axlBUSD", "decimals": 18, "name": "Binance USD", "is_native": false, - "address": "ibc/01D29B33757B631D6E02A4AE8A852969273E2476ED83CB3F947D4AA5DB9F151E" + "address": "ibc/71BA048E21A9AEAC5E23FB7D91BE0E8730D50AB8993A01307616AA0C7EA618E3" }, "wsteth-wei": { "symbol": "axl-wstETH", "decimals": 18, "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "ibc/D5D1F7B6004D1918CE125862C942F3289DE06E271661C2DD32E3F71479BAF751" - }, - "cusd-wei": { - "symbol": "cUSD", - "decimals": 18, - "name": "Celo Dollar", - "is_native": false, - "address": "ibc/F155E10E083EFFC0E1E69E2787C732AF257EE9AA7832AD616E5C536D0582429F" - }, - "cbeth-wei": { - "symbol": "cbETH", - "decimals": 18, - "name": "Coinbase Wrapped Staked ETH", - "is_native": false, - "address": "ibc/847E4A6698D469C9328F1BE68759C78C82891F90B42B7B13BC86462B7F2BE12B" - }, - "sfrxeth-wei": { - "symbol": "sfrxETH", - "decimals": 18, - "name": "Staked Frax Ether", - "is_native": false, - "address": "ibc/39A90E0FA128DAE477510F0B9BE848B0D3C6D3BE2A464667B79EAD9BB847CC47" - }, - "reth-wei": { - "symbol": "rETH", - "decimals": 18, - "name": "Rocket Pool ETH", - "is_native": false, - "address": "ibc/10B9D995E2011BA306A3FFDBCD2B6A091002EF225DE02ACED49694B42940DD1F" - }, - "arb-wei": { - "symbol": "axlARB", - "decimals": 18, - "name": "Arbitrum", - "is_native": false, - "address": "ibc/CFBDAF961EC673ADC67091377E56D338E390B8A0953F5FED80387B765E8DCD53" - }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/95A45A81521EAFDBEDAEEB6DA975C02E55B414C95AD3CE50709272366A90CA17" + "address": "ibc/4D04085167777659C11784A356D6B0D13D5C7F0CE77F7DB1152FE03A2DE2CBF2" }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/C3A8C0BA97F3CD808F828E422CCBB39A5206644DF0A65FA79160E4413684EE14" + "address": "ibc/14767887A69DBEFF3B99AA3E5B176C7989B1DAD2395A1E843F48EE981AC4F83F" }, "wavax-wei": { "symbol": "axlAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/02B88E41C96FCADA33F15642CEE961EE17A63866EDCA4098EDDB6F9C6671EB92" + "address": "ibc/7B6FFC996FC2984AA98DBA4CEBFBF790E55F4D7E65360DD614F2BE2D08F4D324" }, "wglmr-wei": { "symbol": "axlGLMR", "decimals": 18, "name": "Wrapped GLMR", "is_native": false, - "address": "ibc/5539E7CB6FF8FDA12AE6BF20E8862513D787BF1712296EB4AA06DD86920FFBC1" + "address": "ibc/5103F3B79845E445F46120B476A8336D76DE39A16E77132B2BB19BEA3857AF9B" }, "wbnb-wei": { "symbol": "axlBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/735AFF12D7AF5EEC8F4339448BBF001547AEA05CCA6F1CAA60C139AE87828EB1" + "address": "ibc/5CB2E12B07D0B6D8EC24A68BA6B6E6E8D5BF85B7D22091D3A480DCDD61C6AC84" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "ibc/BCA8E085B8D4D9D89D5316165E51545B826C5E034EACD6C00A7464C58F318379" + "address": "ibc/A96863E0BDFA3F2D96625FD5A649AF53F62F97521EF78FBBFE5B4199C3E23ABD" }, "rai-wei": { "symbol": "axlRAI", "decimals": 18, "name": "Rai Reflex Index", "is_native": false, - "address": "ibc/4AA19294AE89888CE7DB64CA76781EE2FE9A0B703B8A5F156AD258428F7A77C4" + "address": "ibc/8F93A962F1ACCC0C55B45358ACCEA4557206AE71A8BC73A2044525EE43EF5D31" }, "link-wei": { "symbol": "axlLINK", "decimals": 18, "name": "ChainLink Token", "is_native": false, - "address": "ibc/0409596DFE559E1B05D821CA3A5F8E290A7C2C3408B4872595CA0E22F13A09FE" + "address": "ibc/73D01D9D032390E81CBC20B7E0507B84DF54F3CE5302BFF52776E7D8930F2A6C" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "ibc/1CE15165C83F70C7DB18B19C417321B02512A85BCB9FB8E553FC10070D122036" + "address": "ibc/59034348F9F2DBA4EAE6621D9DDA9ADF190F60BDDDD2DC99E226F800886F70B5" }, "mkr-wei": { "symbol": "axlMKR", "decimals": 18, "name": "Maker", "is_native": false, - "address": "ibc/4A59932EAD8A140F66554E8E2B5CB80DCA5314A75A889F0AA2E648D96B69847F" + "address": "ibc/F2C3F097E1EFD9B54CF374BA1FA64C5FF995F228CC389CDFB094BF7942B8F00F" }, "uni-wei": { "symbol": "axlUNI", "decimals": 18, "name": "Uniswap", "is_native": false, - "address": "ibc/0313AD311FA169EC5A130DB2EF0840CBA4B300ADB6B85A79FBA952FBD3E7B107" + "address": "ibc/ED457C0D88A8893E3BFEA226630E761C887AA2433F6C7BBCC29B591349A65BB7" }, "shib-wei": { "symbol": "axlSHIB", "decimals": 18, "name": "SHIBA INU", "is_native": false, - "address": "ibc/D66D0A82177FF29CBB8A83705C26C28D45A14678579E350B10493D359ECFD851" + "address": "ibc/6C18438B29DF9D62583F6890FFAA77770CB612C386E74425AD1C1BB6535D8FCB" }, - "wfil-wei": { - "symbol": "axlFIL", + "yum-wei": { + "symbol": "YUM", "decimals": 18, - "name": "Wrapped FIL", + "name": "Yum", "is_native": false, - "address": "ibc/9DC98F4F0ED2816422497CA3D1BE02E38D0656F031173654903ADD248A1C3720" + "address": "ibc/DACFE1C02C87F472E73638E60E1DC75E0EC6A70176AA9BFD0F4BBF1B1E8AD896" } }, - "kava": { + "optimism": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, @@ -3698,7 +7283,7 @@ "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, @@ -3721,63 +7306,105 @@ "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" + }, + "wmai-wei": { + "symbol": "axlWMAI", + "decimals": 18, + "name": "Wrapped MAI", + "is_native": false, + "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" + }, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" }, - "wmai-wei": { - "symbol": "axlWMAI", + "lqdr-wei": { + "symbol": "axlLqdr", "decimals": 18, - "name": "Wrapped MAI", + "name": "LqdrV2", "is_native": false, - "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" + "address": "0x332c72dd7E77070740F01d2d35851c461585D5d0" }, - "uosmo": { - "symbol": "axlOSMO", + "ern-wei": { + "symbol": "ERN", + "decimals": 18, + "name": "Ethos Reserve Note", + "is_native": true, + "address": "0xc5b001DC33727F8F26880B184090D3E252470D45" + }, + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", + "is_native": true, + "address": "0x3eE6107d9C93955acBb3f39871D32B02F82B78AB" + }, + "ukuji": { + "symbol": "KUJI", "decimals": 6, - "name": null, + "name": "Kujira native asset", "is_native": false, - "address": "0x0adCfE03525252A1f5cdca30e49b2752938A7B90" + "address": "0x3A18dcC9745eDcD1Ef33ecB93b0b6eBA5671e7Ca" }, - "weth-wei": { - "symbol": "axlETH", + "sfrxeth-wei": { + "symbol": "sfrxETH", "decimals": 18, - "name": "Wrapped Ether", + "name": "Staked Frax Ether", "is_native": false, - "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" }, - "uatom": { - "symbol": "axlATOM", - "decimals": 6, - "name": "Cosmoshub staking ATOM", + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", "is_native": false, - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D" }, - "frax-wei": { - "symbol": "axlFRAX", + "sfrax-wei": { + "symbol": "sFRAX", "decimals": 18, - "name": "Frax", + "name": "Staked FRAX", "is_native": false, - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" }, - "wfil-wei": { - "symbol": "axlFIL", + "fxs-wei": { + "symbol": "FXS", "decimals": 18, - "name": "Wrapped FIL", + "name": "Frax Share", "is_native": false, - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721" }, - "ern-wei": { - "symbol": "ERN", + "op-wei": { + "symbol": "OP", "decimals": 18, - "name": "Ethos Reserve Note", - "is_native": false, - "address": "0xa334884bF6b0A066d553D19e507315E839409e62" + "name": "Optimism", + "is_native": true, + "address": "0x4200000000000000000000000000000000000042" }, - "lqdr-wei": { - "symbol": "axlLqdr", + "bal-wei": { + "symbol": "axlBAL", "decimals": 18, - "name": "LqdrV2", + "name": "Balancer", "is_native": false, - "address": "0x332c72dd7E77070740F01d2d35851c461585D5d0" + "address": "0x11C1879227D463b60db18C17c20aE739aE8E961a" + }, + "ovn-wei": { + "symbol": "OVN", + "decimals": 18, + "name": "OVN", + "is_native": true, + "address": "0x3b08fcd15280e7B5A6e404c4abb87F7C774D1B2e" }, "oath-wei": { "symbol": "OATH", @@ -3786,6 +7413,20 @@ "is_native": false, "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" }, + "ring-wei": { + "symbol": "RING", + "decimals": 18, + "name": "OneRing", + "is_native": false, + "address": "0x259c1C2ED264402b5ed2f02bc7dC25A15C680c18" + }, + "zyb-wei": { + "symbol": "ZYB", + "decimals": 18, + "name": "Zyber Token", + "is_native": false, + "address": "0xb4F2cF13b262C9f0ddB9B2A9143af753EF184E98" + }, "knc-wei": { "symbol": "axlKNC", "decimals": 18, @@ -3793,6 +7434,13 @@ "is_native": false, "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" }, + "gdx-wei": { + "symbol": "GDX", + "decimals": 18, + "name": "Gridex", + "is_native": false, + "address": "0x91c415FEcD651F11D24aC4b72Ed08dbEb9868D43" + }, "deus-wei": { "symbol": "axlDEUS", "decimals": 18, @@ -3800,1742 +7448,1752 @@ "is_native": false, "address": "0xebD4A18034C78A415088DF8508f102421eD693b1" }, - "stern-wei": { - "symbol": "stERN", + "sonne-wei": { + "symbol": "SONNE", "decimals": 18, - "name": "Staked ERN Vault", - "is_native": false, - "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" + "name": "Sonne", + "is_native": true, + "address": "0x1DB2466d9F5e10D7090E7152B68d62703a2245F0" }, - "orbs-wei": { - "symbol": "ORBS", - "decimals": 18, - "name": "Orbs", - "is_native": false, - "address": "0xf3C091ed43de9c270593445163a41A876A0bb3dd" - } - }, - "ki": { - "uusdc": { - "symbol": "axlUSDC", + "stuatom": { + "symbol": "stATOM", "decimals": 6, - "name": "USD Coin", + "name": "Stride Staked Atom", "is_native": false, - "address": "ibc/E1E3674A0E4E1EF9C69646F9AF8D9497173821826074622D831BAB73CCB99A2D" + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" }, - "dai-wei": { - "symbol": "axlDAI", - "decimals": 18, - "name": "Dai Stablecoin", + "ustrd": { + "symbol": "STRD", + "decimals": 6, + "name": "Stride", "is_native": false, - "address": "ibc/B5172730CC62ACC6BCB4853D9B6F2C723438A6D7EA9009F44D8096D41FF04166" + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F" }, - "uusdt": { - "symbol": "axlUSDT", + "uatom": { + "symbol": "axlATOM", "decimals": 6, - "name": "Tether USD", + "name": "Cosmoshub staking ATOM", "is_native": false, - "address": "ibc/386A4031D68DE6370B85F9FF7E89CEF8DE7CDE01CC193CBD87BD3ED60F6662CE" + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", + "utia": { + "symbol": "axlTIA", + "decimals": 6, + "name": "Axelar Wrapped TIA", "is_native": false, - "address": "ibc/911B721F15A40ABB29636CBF8AE630076DDF62841ACE7E6D879405CA8870CEA2" + "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97" }, - "dot-planck": { - "symbol": "axlDOT", - "decimals": 10, - "name": "xcDOT", + "frax-wei": { + "symbol": "axlFRAX", + "decimals": 18, + "name": "Frax", "is_native": false, - "address": "ibc/684772AC22DBD0C4F798F76A17B54CAC4D0935FED4E8A8B3E853F94BE842FDC9" + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" }, - "busd-wei": { - "symbol": "axlBUSD", + "fpi-wei": { + "symbol": "FPI", "decimals": 18, - "name": "Binance USD", + "name": "Frax Price Index", "is_native": false, - "address": "ibc/D51641D8F6C96ADE0858FC97F9F002F8436CB3E2EE9B08DAE04E1D942349C777" + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f" }, - "weth-wei": { - "symbol": "axlETH", + "wfil-wei": { + "symbol": "axlFIL", "decimals": 18, - "name": "Wrapped Ether", + "name": "Wrapped FIL", "is_native": false, - "address": "ibc/9B68CC79EFF12D25AF712EB805C5062B8F97B2CCE5F3FE55B107EE03095514A3" + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" }, - "wmatic-wei": { - "symbol": "axlMATIC", - "decimals": 18, - "name": "Wrapped Matic", + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", "is_native": false, - "address": "ibc/45368D217CE1F76A1214FA6F1F31493B5F127793E6AB4873B39A81A8CE21A18E" + "address": "0x809c55916bb542c1419724022B3F0162087E3C88" }, - "wavax-wei": { - "symbol": "axlAVAX", - "decimals": 18, - "name": "Wrapped AVAX", + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", "is_native": false, - "address": "ibc/496812EE3F92871345EAFC70A2E747D30B13B1D99DB19538076F954DEF4B5B1D" + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B" }, - "wglmr-wei": { - "symbol": "axlGLMR", - "decimals": 18, - "name": "Wrapped GLMR", + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", "is_native": false, - "address": "ibc/927DA5BD557C059E3FA6816B2023B24EE4C1B149CDBFBC70A771F8C425DBB91A" + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5" }, - "wbnb-wei": { - "symbol": "axlBNB", - "decimals": 18, - "name": "Wrapped BNB", + "usomm": { + "symbol": "axlSOMM", + "decimals": 6, + "name": "Axelar Wrapped SOMM", "is_native": false, - "address": "ibc/F4B1551A3470D93A725460F109FB57990702B703790D8A21C7DC66AEF3BACBF4" + "address": "0x4e914bbDCDE0f455A8aC9d59d3bF739c46287Ed2" }, - "wftm-wei": { - "symbol": "axlFTM", - "decimals": 18, - "name": "Wrapped Fantom", + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", "is_native": false, - "address": "ibc/CC7B0778EABFED87BA0B91C38A9127524DB191BFD6C230FA1862456BE04424A4" + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5" }, - "rai-wei": { - "symbol": "axlRAI", - "decimals": 18, - "name": "Rai Reflex Index", + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", "is_native": false, - "address": "ibc/783AB835CDB043AFB003843BCEEE5CF16D10BA4B5F113360ACC24730E25E6648" + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6" }, - "link-wei": { - "symbol": "axlLINK", + "aISLM": { + "symbol": "ISLM", "decimals": 18, - "name": "ChainLink Token", + "name": "Islamic Coin", "is_native": false, - "address": "ibc/1B31416323D25DAAD779DBC59DE5C31A187F1E8A5EAB57B0892789F9855B973C" + "address": "0x2a98d978817949D45a5528013850772E762B7F12" }, - "frax-wei": { - "symbol": "axlFRAX", - "decimals": 18, - "name": "Frax", + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", "is_native": false, - "address": "ibc/5F659691870E909D0F48F3B12D06DF64854D711B4B5927DC2352175A972197E5" + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D" }, - "mkr-wei": { - "symbol": "axlMKR", - "decimals": 18, - "name": "Maker", + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", "is_native": false, - "address": "ibc/6FEC4D9AFC20E22A9388B6466F27D91479CADED5D0E6F7AADBBD9B6E30A494EC" + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61" }, - "uni-wei": { - "symbol": "axlUNI", - "decimals": 18, - "name": "Uniswap", + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", "is_native": false, - "address": "ibc/6C33F08AFE906E0FBC9ED78CAA2B189D2691F2F49972577D7AF5E43F77118410" + "address": "0x520391D410314451E12A85D79970a61915Bc315D" }, - "shib-wei": { - "symbol": "axlSHIB", + "yum-wei": { + "symbol": "YUM", "decimals": 18, - "name": "SHIBA INU", + "name": "Yum", "is_native": false, - "address": "ibc/4CD89078E929E478404487FEEC097E968FCB331C12A2FA1D87108A118A413772" + "address": "0x9F41b34f42058a7b74672055a5fae22c4b113Fd1" + }, + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", + "is_native": false, + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8" + }, + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF" + }, + "optimism-uusdt": { + "symbol": "USDT", + "decimals": 6, + "name": "Tether USD", + "is_native": true, + "address": "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58" } }, - "kujira": { + "osmosis": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/295548A78785A1007F232DE286149A6FF512F180AF5657780FC89C009E2C348F" + "address": "ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858" }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "ibc/C01154C2547F4CB10A985EA78E7CD4BA891C1504360703A37E1D7043F06B5E1F" + "address": "ibc/903A61A498756EA560B85A85132D3AEE21B5DEDD41213725D22ABF276EA6945E" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/3914BDEF46F429A26917E4D8D434620EC4817DC6B6E68FB327E190902F1E9242" + "address": "ibc/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/F2331645B9683116188EF36FC04A809C28BD36B54555E8705A37146D0182F045" + "address": "ibc/8242AD24008032E457D2E12D46588FD39FB54FB29680C6C7663D296B383C37C4" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/301DAF9CB0A9E247CD478533EF0E21F48FF8118C4A51F77C8BC3EB70E5566DBC" + "address": "ibc/D1542AA8762DB13087D8364F3EA6509FD6F009A34F00426AF9E4F9FA85CBBF1F" }, - "pepe-wei": { - "symbol": "axlPEPE", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Pepe", + "name": "Wrapped Ether", "is_native": false, - "address": "ibc/0447761C090DB521DAC0268E8CB4EBF567E519B937DE6FECD2472AA6A1EDE658" + "address": "ibc/EA1D43981D5C9A1C4AAEA9C23BB1D4FA126BA9BC7020A25E0AE4AA841EA25DC5" }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, "name": "xcDOT", "is_native": false, - "address": "ibc/B37E4D9FB5B30F3E1E20A4B2DE2A005E584C5C822C44527546556AE2470B4539" + "address": "ibc/3FF92D26B407FD61AE95D975712A7C319CDE28DE4D80BDC9978D935932B991D7" }, "busd-wei": { "symbol": "axlBUSD", "decimals": 18, "name": "Binance USD", "is_native": false, - "address": "ibc/65CD60D7E37EF830BC6B6A6DF4E3E3884A96C0905A7D271C48DC0440B1989EC7" + "address": "ibc/6329DD8CF31A334DD5BE3F68C846C9FE313281362B37686A62343BAC1EB1546D" }, "wsteth-wei": { "symbol": "axl-wstETH", "decimals": 18, "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "ibc/B572E6F30E7C33D78A50D8B4E973A9C118C30F848DF31A95FAA5E4C7450A8BD0" + "address": "ibc/B2BD584CD2A0A9CE53D4449667E26160C7D44A9C41AF50F602C201E5B3CCA46C" }, - "cusd-wei": { - "symbol": "cUSD", + "wusdm-wei": { + "symbol": "wUSDM", "decimals": 18, - "name": "Celo Dollar", + "name": "Wrapped Mountain Protocol USD", "is_native": false, - "address": "ibc/03FEA3C82EA1987EC2B074E71D2156AA55764D5DAFA3916D38309F18C3256A51" + "address": "ibc/E79C3DAA6E5E0180F61F30C1515B8933F1E9092E81020222080C405D1716C533" }, - "ukuji": { - "symbol": "KUJI", + "wdoge-wei": { + "symbol": "axlWDOGE", + "decimals": 8, + "name": "Wrapped DOGE", + "is_native": false, + "address": "ibc/C5E95745A3176F1D30356E6EC157ECB50979E5EFEA0AD385FA100E05307446EA" + }, + "uosmo": { + "symbol": "OSMO", "decimals": 6, - "name": null, + "name": "Axelar Wrapped OSMO", "is_native": true, - "address": "ukuji" + "address": "uosmo" + }, + "cusd-wei": { + "symbol": "cUSD", + "decimals": 18, + "name": "Celo Dollar", + "is_native": false, + "address": "ibc/73ACC8C994C1335BDEE9F473865EE46ED6529D345B1FE8905ED1FD5F2628AADA" }, "cbeth-wei": { "symbol": "cbETH", "decimals": 18, "name": "Coinbase Wrapped Staked ETH", "is_native": false, - "address": "ibc/3F782FAA0722C47BA753F60010148DB067BD916F3894931552F5007CF5F5F2BC" + "address": "ibc/4D7A6F2A7744B1534C984A21F9EDFFF8809FC71A9E9243FFB702073E7FCA513A" }, "sfrxeth-wei": { "symbol": "sfrxETH", "decimals": 18, "name": "Staked Frax Ether", "is_native": false, - "address": "ibc/579194AD6EB1B02FE30D7031EF284C1BB7B272EE5F7700462CD8B3DECB542175" + "address": "ibc/81F578C39006EB4B27FFFA9460954527910D73390991B379C03B18934D272F46" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "ibc/64228F1A548B1D1FD04BBA6E974C2450BEDA07DBB1D3FD9C6913CD210BBC1276" + }, + "sfrax-wei": { + "symbol": "sFRAX", + "decimals": 18, + "name": "Staked FRAX", + "is_native": false, + "address": "ibc/4062A80E72B08BFF5AD591BB43CF4891D94EFAD7D591F8E574D1D1AC5DB2241A" + }, + "fxs-wei": { + "symbol": "FXS", + "decimals": 18, + "name": "Frax Share", + "is_native": false, + "address": "ibc/56FA051C097D26D3285D7A3ABA5F9F18F6654517E50E99A9F3F2D0E6FECDB433" }, "reth-wei": { "symbol": "rETH", "decimals": 18, "name": "Rocket Pool ETH", "is_native": false, - "address": "ibc/0ABEC6EE026C0BEE3712CE58BC0A5D7A7B8B8130535094E459152CB562C1EC85" + "address": "ibc/E610B83FD5544E00A8A1967A2EB3BEF25F1A8CFE8650FE247A8BD4ECA9DC9222" }, "arb-wei": { "symbol": "axlARB", "decimals": 18, "name": "Arbitrum", "is_native": false, - "address": "ibc/96179F5B44CCC15E03AB43D7118E714B4D5CE8F187F7D8A60F2A514299761EA9" - }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/1B38805B1C75352B28169284F96DF56BDEBD9E8FAC005BDCC8CF0378C82AA8E7" + "address": "ibc/10E5E5B06D78FFBB61FD9F89209DEE5FD4446ED0550CBB8E3747DA79E10D9DC6" }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/A64467480BBE4CCFC3CF7E25AD1446AA9BDBD4F5BCB9EF6038B83D6964C784E6" + "address": "ibc/AB589511ED0DD5FA56171A39978AFBF1371DB986EC1C3526CE138A16377E39BB" }, "wavax-wei": { "symbol": "axlAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/004EBF085BBED1029326D56BE8A2E67C08CECE670A94AC1947DF413EF5130EB2" + "address": "ibc/6F62F01D913E3FFE472A38C78235B8F021B511BC6596ADFF02615C8F83D3B373" }, "wglmr-wei": { "symbol": "axlGLMR", "decimals": 18, "name": "Wrapped GLMR", "is_native": false, - "address": "ibc/C8D63703F5805CE6A2B20555139CF6ED9CDFA870389648EB08D688B94B0AE2C1" + "address": "ibc/1E26DB0E5122AED464D98462BD384FCCB595732A66B3970AE6CE0B58BAE0FC49" }, "wbnb-wei": { "symbol": "axlBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/DADB399E742FCEE71853E98225D13E44E90292852CD0033DF5CABAB96F80B833" + "address": "ibc/F4A070A6D78496D53127EA85C094A9EC87DFC1F36071B8CCDDBD020F933D213D" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "ibc/E67ADA2204A941CD4743E70771BA08E24885E1ADD6FD140CE1F9E0FEBB68C6B2" + "address": "ibc/5E2DFDF1734137302129EA1C1BA21A580F96F778D4F021815EA4F6DB378DA1A4" + }, + "pepe-wei": { + "symbol": "axlPEPE", + "decimals": 18, + "name": "Pepe", + "is_native": false, + "address": "ibc/E47F4E97C534C95B942729E1B25DBDE111EA791411CFF100515050BEA0AC0C6B" }, "rai-wei": { "symbol": "axlRAI", "decimals": 18, "name": "Rai Reflex Index", "is_native": false, - "address": "ibc/4CA23432A78B272A9EB7010CB72A15A199066D239F1B13BB583F3945EB8A315C" + "address": "ibc/BD796662F8825327D41C96355DF62045A5BA225BAE31C0A86289B9D88ED3F44E" }, "link-wei": { "symbol": "axlLINK", "decimals": 18, "name": "ChainLink Token", "is_native": false, - "address": "ibc/FC59D6840A41252352263CEA2B832BB86D68D03CBA194263CB9F3C15946796FB" + "address": "ibc/D3327A763C23F01EC43D1F0DB3CEFEC390C362569B6FD191F40A5192F8960049" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "ibc/7B11FE7D6385B46B9F3598B298B81A773CB20A8BA12001D87A78580314218364" + "address": "ibc/0E43EDE2E2A3AFA36D0CD38BDDC0B49FECA64FA426A82E102F304E430ECF46EE" + }, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": false, + "address": "ibc/CCF507932C95AC713079BE5FA0E5DF863434B1DBCC7F77524E3CF168EB266CD7" }, "mkr-wei": { "symbol": "axlMKR", "decimals": 18, "name": "Maker", "is_native": false, - "address": "ibc/31A4E6623063E702FB9CF2E7B616DFCCDE319CA2FC4775CDFF26F29F628E7ACF" + "address": "ibc/D27DDDF34BB47E5D5A570742CC667DE53277867116CCCA341F27785E899A70F3" }, "uni-wei": { "symbol": "axlUNI", "decimals": 18, "name": "Uniswap", "is_native": false, - "address": "ibc/0A88A08F3E9573DB9D8CB74AA3746F6D23C41C3EE7B6CC5AA4695A1DD74FF86B" + "address": "ibc/AE2719773D6FCDD05AC17B1ED63F672F5F9D84144A61965F348C86C2A83AD161" }, "shib-wei": { "symbol": "axlSHIB", "decimals": 18, "name": "SHIBA INU", "is_native": false, - "address": "ibc/43BF3152103ED706E207005E7C433AB3440572C1D444FFE49321A0EF6A8EFC82" + "address": "ibc/19305E20681911F14D1FB275E538CDE524C3BF88CF9AE5D5F78F4D4DA05E85B2" }, "wfil-wei": { "symbol": "axlFIL", "decimals": 18, "name": "Wrapped FIL", "is_native": false, - "address": "ibc/12B075C6C552060240E92A4A215CAF4DB0F1CA98F90897AB30282B9A15842595" + "address": "ibc/18FB5C09D9D2371F659D4846A956FA56225E377EE3C3652A2BF3542BF809159D" + }, + "polygon-uusdc": { + "symbol": "Polygon USDC", + "decimals": 6, + "name": "Polygon USDC", + "is_native": false, + "address": "ibc/231FD77ECCB2DB916D314019DA30FE013202833386B1908A191D16989AD80B5A" + }, + "avalanche-uusdc": { + "symbol": "Avalanche USDC", + "decimals": 6, + "name": "Avalanche USDC", + "is_native": false, + "address": "ibc/F17C9CA112815613C5B6771047A093054F837C3020CBA59DFFD9D780A8B2984C" }, "yieldusd-wei": { "symbol": "axlYieldUSD", "decimals": 18, "name": "Real Yield USD", "is_native": false, - "address": "ibc/2DA5C8103F4BAFEF39901CA418EE2CAAE53BF661FA648E80A9EF1EEE925696B4" + "address": "ibc/3ED2A5EA7913330BA28951F94D93EDA7C74139D1F18C18EDA2051C9461811A16" }, "yieldeth-wei": { "symbol": "axlYieldETH", "decimals": 18, "name": "Real Yield ETH", "is_native": false, - "address": "ibc/B4B3B08FE5FEA65CB25E467C9D95D180A6CDB0EBE730E7BB20CA1BF6C9A80D9B" + "address": "ibc/FBB3FEF80ED2344D821D4F95C31DBFD33E4E31D5324CAD94EF756E67B749F668" }, - "sfrax-wei": { - "symbol": "sFRAX", + "usdy-wei": { + "symbol": "axlUSDY", "decimals": 18, - "name": "Staked FRAX", - "is_native": false, - "address": "ibc/E727C3108CCF0299A0331BBC7C62909644BB92D4D01421073154A209A3D80F28" - } - }, - "moonbeam": { - "uusdc": { - "symbol": "axlUSDC", - "decimals": 6, - "name": "USD Coin", - "is_native": false, - "address": "0xCa01a1D0993565291051daFF390892518ACfAD3A" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, + "name": "Ondo U.S. Dollar Yield", "is_native": false, - "address": "0x467719aD09025FcC6cF6F8311755809d45a5E5f3" + "address": "ibc/EC0CAF0CBC780D4B55980E28E1C646D207ED05A22EA08C5F3B605AE00C9AB984" }, - "dai-wei": { - "symbol": "axlDAI", + "ox-wei": { + "symbol": "OX", "decimals": 18, - "name": "Dai Stablecoin", + "name": "Open Exchange Token", "is_native": false, - "address": "0x14dF360966a1c4582d2b18EDbdae432EA0A27575" + "address": "ibc/61DE6748CA641D2422C6D07C53F6C7215EEF7AE8BC61439B83A0DEA061B487E1" }, - "uusdt": { - "symbol": "axlUSDT", + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", "decimals": 6, - "name": "Tether USD", - "is_native": false, - "address": "0xDFd74aF792bC6D45D1803F425CE62Dd16f8Ae038" - }, - "wmai-wei": { - "symbol": "axlWMAI", - "decimals": 18, - "name": "Wrapped MAI", - "is_native": false, - "address": "0xbFE3Acdca835bB60A6B51Ee6B947779A02eCE911" - }, - "dot-planck": { - "symbol": "DOT", - "decimals": 10, - "name": "xcDOT", + "name": "Levana Governance Token", "is_native": true, - "address": "0xFfFFfFff1FcaCBd218EDc0EbA20Fc2308C778080" + "address": "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn" }, - "stuatom": { - "symbol": "stATOM", + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", "decimals": 6, - "name": null, - "is_native": false, - "address": "0x2924894E7886C6B9018179946EE389bb06534021" + "name": "milkTIA", + "is_native": true, + "address": "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA" }, - "ustrd": { - "symbol": "STRD", - "decimals": 6, - "name": null, + "op-wei": { + "symbol": "axlOP", + "decimals": 18, + "name": "Optimism", "is_native": false, - "address": "0x85eBBf7253295d37C5FC98bE5Aac87CA4378c2e2" + "address": "ibc/14A291DD362798D6805B7ABCB8D09AEEE02176108F89FA09AA43EA2EE096A2A9" }, - "wglmr-wei": { - "symbol": "WGLMR", + "wmnt-wei": { + "symbol": "WMNT", "decimals": 18, - "name": "Wrapped GLMR", - "is_native": true, - "address": "0xAcc15dC74880C9944775448304B263D191c6077F" - }, - "uatom": { - "symbol": "axlATOM", - "decimals": 6, - "name": "Cosmoshub staking ATOM", + "name": "Wrapped Mantle", "is_native": false, - "address": "0x27292cf0016E5dF1d8b37306B2A98588aCbD6fCA" + "address": "ibc/B788066425484BC6DE6B3EF62338E0DFC293690A18E8E090BC9F2C096317446E" }, - "uluna": { - "symbol": "LUNC", - "decimals": 6, - "name": null, + "yum-wei": { + "symbol": "YUM", + "decimals": 18, + "name": "Yum", "is_native": false, - "address": "0x31DAB3430f3081dfF3Ccd80F17AD98583437B213" + "address": "ibc/21D8071EF5B02A86D945430D859A594CBF28287D38104A264BB9FD3B22BBF5DE" }, - "uusd": { - "symbol": "USTC", - "decimals": 6, - "name": null, + "arbitrum-weth-wei": { + "symbol": "Arbitrum axlETH", + "decimals": 18, + "name": "Wrapped Ether", "is_native": false, - "address": "0x085416975fe14C2A731a97eC38B9bF8135231F62" + "address": "ibc/64E62451C9A5682FF3047429C6E4714A02CDC0C35DE35CAB01E18D1188004CEB" }, - "frax-wei": { - "symbol": "axlFRAX", + "base-weth-wei": { + "symbol": "Base axlETH", "decimals": 18, - "name": "Frax", + "name": "Wrapped Ether", "is_native": false, - "address": "0x61C82805453a989E99B544DFB7031902e9bac448" + "address": "ibc/D7D6DEF2A4F7ED0A6F5F0E266C1B2C9726E82F67EBBE49BBB47B3DEC289F8D7B" }, - "wfil-wei": { - "symbol": "axlFIL", + "polygon-weth-wei": { + "symbol": "Polygon axlETH", "decimals": 18, - "name": "Wrapped FIL", + "name": "Wrapped Ether", "is_native": false, - "address": "0x6A7b717aE5Ed65F85BA25403D5063D368239828e" + "address": "ibc/F9EB60AC212DBF05F4C5ED0FDE03BB9F08309B0EE9899A406AD4B904CF84968E" }, - "wbtc-satoshi": { - "symbol": "axlWBTC", + "cbbtc-satoshi": { + "symbol": "axl-cbBTC", "decimals": 8, - "name": "Wrapped BTC", + "name": "Coinbase Wrapped BTC", "is_native": false, - "address": "0x8e9a09bc94689c157Cd7f6aB5d4577ED6f44Ba1E" + "address": "ibc/616C2EA69BC328F245CE449785CB0B526B462C48F19DCF9B3D30699579B4308A" }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", + "fbtc-satoshi": { + "symbol": "axlFBTC", + "decimals": 8, + "name": "Fire Bitcoin", "is_native": false, - "address": "0x85a8B472d116585E2cc10eB1e0e3E3127E1f5D3f" + "address": "ibc/22C342A34DD0189AC2B2697EE76C360A9FBA53748ABA76E12C3A9E9F5F1E130F" }, - "oath-wei": { - "symbol": "OATH", - "decimals": 18, - "name": "Oath Token", + "lbtc-satoshi": { + "symbol": "axlLBTC", + "decimals": 8, + "name": "Lombard Staked Bitcoin", "is_native": false, - "address": "0xd20523b39fAF1D6e9023a4D6085f87B7b0DE7926" + "address": "ibc/4AC81C97BBB5482536F6401328E0E10BCCD98F0F471DCF64319A811E25E53CAB" }, - "knc-wei": { - "symbol": "axlKNC", - "decimals": 18, - "name": "Kyber Network Crystal v2", + "arbitrum-uusdt": { + "symbol": "axlArbitrumUSDT", + "decimals": 6, + "name": "Tether USD", "is_native": false, - "address": "0x5Ac3aD1acC0A3EFd6fB89791967656128e86d8C5" + "address": "ibc/57B63A0795B6BC0AC4EFD0D4DEE9FE71FCC1D0FFA87F6280C9CDEF4F6727A173" }, - "pepe-wei": { - "symbol": "axlPEPE", - "decimals": 18, - "name": "Pepe", + "polygon-uusdt": { + "symbol": "axlPolygonUSDT", + "decimals": 6, + "name": "(PoS) Tether USD", "is_native": false, - "address": "0xd67eB3e8eb74F5Ea6A1A9E87B4a6AE433AD829EC" + "address": "ibc/2F6003A92088B989A159C593C551DF7B04FA0A0419CA3ED087E45E0006ECFF6E" + }, + "optimism-uusdt": { + "symbol": "axlOptimismUSDT", + "decimals": 6, + "name": "Tether USD", + "is_native": false, + "address": "ibc/EEA21E12A250B7FBBCBBBD1F7AA78984F5C12D684B32EBEEFC585FF596A7BCDA" } }, - "neutron": { + "persistence": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/F082B65C88E4B6D5EF1DB243CDA1D331D002759E938A0F5CD3FFDC5D53B3E349" + "address": "ibc/34C83B3566255FBE18D4D6B6D1716DBC8993CC3FB2E6110A6BB47DFACA4B0A7A" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/626DBDAD47E2867EE930907A2C97B9F61043523C40FB9C4FEEC980933D1F6790" + "address": "ibc/89404A5E31BD61F409C7AA26B7E1FD164B997A0671E949DA2253E365816D1964" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/57503D7852EF4E1899FE6D71C5E81D7C839F76580F86F21E39348FC2BC9D7CE2" + "address": "ibc/B56D6A6284B153D6F054485A9B78AD1FCE5699D751DA511262268105983B147C" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/DF8722298D192AAB85D86D0462E8166234A6A9A572DD4A2EA7996029DF4DB363" + "address": "ibc/F581E33B07FA339E0C5ED441119582EF51A49A326131473F7003D4511D5AE6BE" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/43494E635D14726AEA1203EE63F4C3B27642345C3D9AF6091585CB7FDAB349D7" }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, "name": "xcDOT", "is_native": false, - "address": "ibc/E74CD453F834EE007B02F1298EFFF4DCD9C97FB58DF7F6080FF935145B73C6A6" + "address": "ibc/AF51552CCBACC37A6B39B2DF2A25BB8E5A98F92BDDB67422D3383A66650C0C82" }, "busd-wei": { "symbol": "axlBUSD", "decimals": 18, "name": "Binance USD", "is_native": false, - "address": "ibc/71BA048E21A9AEAC5E23FB7D91BE0E8730D50AB8993A01307616AA0C7EA618E3" - }, - "wsteth-wei": { - "symbol": "axl-wstETH", - "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", - "is_native": false, - "address": "ibc/4D04085167777659C11784A356D6B0D13D5C7F0CE77F7DB1152FE03A2DE2CBF2" + "address": "ibc/D93E39C5F90A03FCB8265B18410A64198928BA77CCFAB907C4D61072E801F021" }, - "weth-wei": { - "symbol": "axlETH", + "stkbnb-wei": { + "symbol": "stkBNB", "decimals": 18, - "name": "Wrapped Ether", + "name": "Staked BNB", "is_native": false, - "address": "ibc/A585C2D15DCD3B010849B453A2CFCB5E213208A5AB665691792684C26274304D" + "address": "ibc/525F28AACB70E540D19117E5AF4875DA8EB62F0C8C666233BCC4970C20D5CC32" }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/14767887A69DBEFF3B99AA3E5B176C7989B1DAD2395A1E843F48EE981AC4F83F" + "address": "ibc/B441047FD82738C278ADFB246EF75FF4F002B2671F9064719F7BDDD38FBFE35E" }, "wavax-wei": { "symbol": "axlAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/7B6FFC996FC2984AA98DBA4CEBFBF790E55F4D7E65360DD614F2BE2D08F4D324" + "address": "ibc/C77BFEFE5DCE9A10CBA3DE2A33DCBA5FEF6A171E0275F79E1BFCB8C28673A12B" }, "wglmr-wei": { "symbol": "axlGLMR", "decimals": 18, "name": "Wrapped GLMR", "is_native": false, - "address": "ibc/5103F3B79845E445F46120B476A8336D76DE39A16E77132B2BB19BEA3857AF9B" + "address": "ibc/BBBEA20BF5A4663B0ECBB76C652E8BC84D71B164DA900B0BDC86C440910396D2" }, "wbnb-wei": { "symbol": "axlBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/5CB2E12B07D0B6D8EC24A68BA6B6E6E8D5BF85B7D22091D3A480DCDD61C6AC84" + "address": "ibc/EB2462F292F42B402923F7C3808BB7295A2420C4691B35D43EBF018DDF7CB917" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "ibc/A96863E0BDFA3F2D96625FD5A649AF53F62F97521EF78FBBFE5B4199C3E23ABD" + "address": "ibc/3C3FFB6CB792D1A6336EEB8F20617C05B70ADC7C3D6AFD3FEDC5AACDA6E0EC45" }, "rai-wei": { "symbol": "axlRAI", "decimals": 18, "name": "Rai Reflex Index", "is_native": false, - "address": "ibc/8F93A962F1ACCC0C55B45358ACCEA4557206AE71A8BC73A2044525EE43EF5D31" + "address": "ibc/873216FB52952C680DA7F16880DCEC551B438009F954CB10161612955401582C" }, "link-wei": { "symbol": "axlLINK", "decimals": 18, "name": "ChainLink Token", "is_native": false, - "address": "ibc/73D01D9D032390E81CBC20B7E0507B84DF54F3CE5302BFF52776E7D8930F2A6C" + "address": "ibc/1226F5992220125F0F273047D4B5B44FCA386AA7E7994D4768F9B8CEA55A63C1" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "ibc/59034348F9F2DBA4EAE6621D9DDA9ADF190F60BDDDD2DC99E226F800886F70B5" + "address": "ibc/4760C346F88AF297467F2E5CA0A26184F479CAD2A69E2062E2270F668089A609" }, "mkr-wei": { "symbol": "axlMKR", "decimals": 18, "name": "Maker", "is_native": false, - "address": "ibc/F2C3F097E1EFD9B54CF374BA1FA64C5FF995F228CC389CDFB094BF7942B8F00F" + "address": "ibc/91F17C58A8BED8E5A20E13659E18638250BE46995CF6B7E805AFD251D980534C" }, "uni-wei": { "symbol": "axlUNI", "decimals": 18, "name": "Uniswap", "is_native": false, - "address": "ibc/ED457C0D88A8893E3BFEA226630E761C887AA2433F6C7BBCC29B591349A65BB7" + "address": "ibc/C5C067424F5467D2C600A2AEE5E37936C86F9553506A4FB1B26915A2E8C8267D" }, "shib-wei": { "symbol": "axlSHIB", "decimals": 18, "name": "SHIBA INU", "is_native": false, - "address": "ibc/6C18438B29DF9D62583F6890FFAA77770CB612C386E74425AD1C1BB6535D8FCB" + "address": "ibc/5DA50C9E4A8F363ABFC29FD4EA144E764E66C71735D9B84D3BBD39B71A42611C" }, - "uaxl": { - "symbol": "AXL", + "uxprt": { + "symbol": "XPRT", "decimals": 6, - "name": null, - "is_native": false, - "address": "ibc/C0E66D1C81D8AAF0E6896E05190FDFBC222367148F86AC3EA679C28327A763CD" + "name": "XPRT native asset", + "is_native": true, + "address": "uxprt" } }, - "optimism": { + "polygon": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" + "address": "0x750e4C4984a9e0f12978eA6742Bc1c5D248f40ed" }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + "address": "0x6e4E624106Cb12E168E6533F8ec7c82263358940" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7" + "address": "0xDDc9E2891FA11a4CC5C223145e8d14B44f3077c9" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" + "address": "0xCeED2671d8634e3ee65000EDbbEe66139b132fBf" + }, + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", + "is_native": false, + "address": "0x779661872e9C891027099C9E3fd101DCc8B96433" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "0x1280830F690D0E65195B3c61b028244C3A49f26D" }, "wmai-wei": { "symbol": "axlWMAI", "decimals": 18, "name": "Wrapped MAI", "is_native": false, - "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" + "address": "0x08aD99fB3f9f262853B54613249B4064901BD358" }, - "ukuji": { - "symbol": "KUJI", - "decimals": 6, - "name": null, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "0x3A18dcC9745eDcD1Ef33ecB93b0b6eBA5671e7Ca" + "address": "0xd7Bb095a60D7666D4A6f236423B47DDD6ae6Cfa7" + }, + "lqdr-wei": { + "symbol": "axlLqdr", + "decimals": 18, + "name": "LqdrV2", + "is_native": false, + "address": "0x0294D8eB7857D43FEb1210Db72456d41481f9Ede" + }, + "ern-wei": { + "symbol": "ERN", + "decimals": 18, + "name": "Ethos Reserve Note", + "is_native": false, + "address": "0xC3a9a54c043f348027fffAac0F2F996123A19bF4" + }, + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", + "is_native": false, + "address": "0x281c4746c902A322B9A951F07893AC51a7221Acc" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": false, + "address": "0x6013ee0C255d00BB885Fed03A3e1F1Ec3aD548AC" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "0x01e91A094f5559f211e4ad4bED01468aBb64Bde3" + }, + "sfrax-wei": { + "symbol": "sFRAX", + "decimals": 18, + "name": "Staked FRAX", + "is_native": false, + "address": "0x1ED2B2b097E92B2Fe95a172dd29840c71294F1d6" + }, + "fxs-wei": { + "symbol": "FXS", + "decimals": 18, + "name": "Frax Share", + "is_native": false, + "address": "0x75b33EAA41DBc1Aae041d718AdfA4D446dD35ACC" + }, + "bal-wei": { + "symbol": "axlBAL", + "decimals": 18, + "name": "Balancer", + "is_native": false, + "address": "0xA8e417f73D68A239cE7E7FbD73b8081BE419767B" + }, + "vext-wei": { + "symbol": "VEXT", + "decimals": 18, + "name": "Veloce", + "is_native": true, + "address": "0x27842334C55c01DDFE81Bf687425F906816c5141" + }, + "oath-wei": { + "symbol": "OATH", + "decimals": 18, + "name": "Oath Token", + "is_native": false, + "address": "0x7c603C3C0C97a565cf202c94AB5298bF8510f7dc" + }, + "knc-wei": { + "symbol": "axlKNC", + "decimals": 18, + "name": "Kyber Network Crystal v2", + "is_native": false, + "address": "0x46371C90fcCE4D7367a61CB43eA7922406bC707a" + }, + "gdx-wei": { + "symbol": "GDX", + "decimals": 18, + "name": "Gridex", + "is_native": false, + "address": "0xB0684AEb24b70A8973F2459DB4AB83a4be9139fB" + }, + "deus-wei": { + "symbol": "axlDEUS", + "decimals": 18, + "name": "DEUS", + "is_native": false, + "address": "0x12A80A285DfaBd23FC1DFe6c515F034A22d9cdCE" }, "stuatom": { "symbol": "stATOM", "decimals": 6, - "name": null, + "name": "Stride Staked Atom", "is_native": false, - "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" + "address": "0x9132ab3B9EcA438184588b8887CeD9dE0FCA19AE" }, "ustrd": { "symbol": "STRD", "decimals": 6, - "name": null, + "name": "Stride", "is_native": false, - "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F" + "address": "0x1D9b7C028e5018c7057c6F57366a1350c9CeADE5" + }, + "wmatic-wei": { + "symbol": "WMATIC", + "decimals": 18, + "name": "Wrapped Matic", + "is_native": true, + "address": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270" }, "uatom": { "symbol": "axlATOM", "decimals": 6, "name": "Cosmoshub staking ATOM", "is_native": false, - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" + "address": "0x33F8a5029264BcFB66e39157aF3FeA3E2a8a5067" + }, + "pepe-wei": { + "symbol": "axlPEPE", + "decimals": 18, + "name": "Pepe", + "is_native": false, + "address": "0x8baE3F5Eb10F39663E57Be19741FD9ccEF0E113a" + }, + "uluna": { + "symbol": "LUNC", + "decimals": 6, + "name": "Axelar Wrapped LUNC", + "is_native": false, + "address": "0xa17927fB75E9faEA10C08259902d0468b3DEad88" + }, + "uusd": { + "symbol": "USTC", + "decimals": 6, + "name": "Axelar Wrapped USTC", + "is_native": false, + "address": "0xeDDc6eDe8F3AF9B4971e1Fa9639314905458bE87" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" + "address": "0x53Adc464b488bE8C5d7269B9ABBCe8bA74195C3a" + }, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": false, + "address": "0x72eC87f05CC5eBC4D24Fddba84c179d5e216016B" }, "wfil-wei": { "symbol": "axlFIL", "decimals": 18, "name": "Wrapped FIL", "is_native": false, - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" + "address": "0xE440dc07b23faafF3a76bdbcf783221406eb00F1" }, - "ern-wei": { - "symbol": "ERN", - "decimals": 18, - "name": "Ethos Reserve Note", + "polygon-uusdc": { + "symbol": "USDC", + "decimals": 6, + "name": "Polygon USDC", "is_native": true, - "address": "0xc5b001DC33727F8F26880B184090D3E252470D45" + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174" }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", "is_native": false, - "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + "address": "0x69deD9B7658507ca8C5A6f1F6ff53276802ec228" }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", "is_native": false, - "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" + "address": "0xfecB6d3A5d3FdA8A37A072D5b9018709f690873b" }, - "lqdr-wei": { - "symbol": "axlLqdr", - "decimals": 18, - "name": "LqdrV2", + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", "is_native": false, - "address": "0x332c72dd7E77070740F01d2d35851c461585D5d0" + "address": "0x59BE025398162d0B911E0b9D8a6FEB52dF64637f" + }, + "usomm": { + "symbol": "axlSOMM", + "decimals": 6, + "name": "Axelar Wrapped SOMM", + "is_native": false, + "address": "0xDd96E9c50f5dA40180e3848e712D349Ad2511D57" }, - "wsteth-wei": { - "symbol": "axl-wstETH", - "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", "is_native": false, - "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" + "address": "0x290540d1E1EdFabD31315dF4f6a9d6638966d54F" }, - "oath-wei": { - "symbol": "OATH", - "decimals": 18, - "name": "Oath Token", + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", "is_native": false, - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + "address": "0x91835b32f5249d863b63dA22e32E6200004Fe76a" }, - "ring-wei": { - "symbol": "RING", + "aISLM": { + "symbol": "ISLM", "decimals": 18, - "name": "OneRing", + "name": "Islamic Coin", "is_native": false, - "address": "0x259c1C2ED264402b5ed2f02bc7dC25A15C680c18" + "address": "0x4E7A6031B7282431ff9cBC016dA2E7e50e0C54A4" }, - "zyb-wei": { - "symbol": "ZYB", - "decimals": 18, - "name": "Zyber Token", + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", "is_native": false, - "address": "0xb4F2cF13b262C9f0ddB9B2A9143af753EF184E98" + "address": "0x422bAE7f5b67CA7FAde4577E965988130cAff672" }, - "knc-wei": { - "symbol": "axlKNC", - "decimals": 18, - "name": "Kyber Network Crystal v2", + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", "is_native": false, - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" + "address": "0xd2df01598512F7cf6E0ec54beFc439f923e0dd32" }, - "gdx-wei": { - "symbol": "GDX", - "decimals": 18, - "name": "Gridex", + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", "is_native": false, - "address": "0x91c415FEcD651F11D24aC4b72Ed08dbEb9868D43" + "address": "0x0043E8eAC1810e30636f38BF3a140287Fadb6B4c" }, - "sonne-wei": { - "symbol": "SONNE", + "metal-wei": { + "symbol": "METAL", "decimals": 18, - "name": "Sonne", + "name": "METAL", "is_native": true, - "address": "0x1DB2466d9F5e10D7090E7152B68d62703a2245F0" + "address": "0x200C234721b5e549c3693CCc93cF191f90dC2aF9" }, - "stern-wei": { - "symbol": "stERN", + "mee-wei": { + "symbol": "MEE", "decimals": 18, - "name": "Staked ERN Vault", + "name": "MEE Governance Token", "is_native": true, - "address": "0x3eE6107d9C93955acBb3f39871D32B02F82B78AB" + "address": "0xEB7eaB87837f4Dad1bb80856db9E4506Fc441f3D" }, - "deus-wei": { - "symbol": "axlDEUS", - "decimals": 18, - "name": "DEUS", + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", "is_native": false, - "address": "0xebD4A18034C78A415088DF8508f102421eD693b1" + "address": "0xc690C48E3a64d8b59E54aD4202DF3cb95a85dB79" }, - "ovn-wei": { - "symbol": "OVN", + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "0x86C74A05e735eB72f81e4bb415AaF0e3d0c1c413" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0xfA23FDB1648534797165fe52dc09e4e7e25C737a" + }, + "polygon-weth-wei": { + "symbol": "WETH", "decimals": 18, - "name": "OVN", + "name": "Wrapped Ether", "is_native": true, - "address": "0x3b08fcd15280e7B5A6e404c4abb87F7C774D1B2e" + "address": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619" }, - "bal-wei": { - "symbol": "axlBAL", - "decimals": 18, - "name": "Balancer", + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", "is_native": false, - "address": "0x11C1879227D463b60db18C17c20aE739aE8E961a" + "address": "0x1da37a2B6e275e05A16859A4C070E82428Ef9Da5" }, - "utia": { - "symbol": "axlTIA", + "polygon-uusdt": { + "symbol": "USDT", "decimals": 6, - "name": null, - "is_native": false, - "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97" + "name": "(PoS) Tether USD", + "is_native": true, + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F" } }, - "osmosis": { + "provenance": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "ibc/903A61A498756EA560B85A85132D3AEE21B5DEDD41213725D22ABF276EA6945E" + "address": "ibc/295548A78785A1007F232DE286149A6FF512F180AF5657780FC89C009E2C348F" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7" + "address": "ibc/3914BDEF46F429A26917E4D8D434620EC4817DC6B6E68FB327E190902F1E9242" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/8242AD24008032E457D2E12D46588FD39FB54FB29680C6C7663D296B383C37C4" + "address": "ibc/F2331645B9683116188EF36FC04A809C28BD36B54555E8705A37146D0182F045" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/D1542AA8762DB13087D8364F3EA6509FD6F009A34F00426AF9E4F9FA85CBBF1F" + "address": "ibc/301DAF9CB0A9E247CD478533EF0E21F48FF8118C4A51F77C8BC3EB70E5566DBC" }, - "pepe-wei": { - "symbol": "axlPEPE", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Pepe", - "is_native": false, - "address": "ibc/E47F4E97C534C95B942729E1B25DBDE111EA791411CFF100515050BEA0AC0C6B" - }, - "dot-planck": { - "symbol": "axlDOT", - "decimals": 10, - "name": "xcDOT", + "name": "Wrapped Ether", "is_native": false, - "address": "ibc/3FF92D26B407FD61AE95D975712A7C319CDE28DE4D80BDC9978D935932B991D7" - }, - "busd-wei": { - "symbol": "axlBUSD", - "decimals": 18, - "name": "Binance USD", + "address": "ibc/1B38805B1C75352B28169284F96DF56BDEBD9E8FAC005BDCC8CF0378C82AA8E7" + } + }, + "rebus": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", "is_native": false, - "address": "ibc/6329DD8CF31A334DD5BE3F68C846C9FE313281362B37686A62343BAC1EB1546D" + "address": "ibc/295548A78785A1007F232DE286149A6FF512F180AF5657780FC89C009E2C348F" }, - "wsteth-wei": { - "symbol": "axl-wstETH", + "dai-wei": { + "symbol": "axlDAI", "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/B2BD584CD2A0A9CE53D4449667E26160C7D44A9C41AF50F602C201E5B3CCA46C" + "address": "ibc/3914BDEF46F429A26917E4D8D434620EC4817DC6B6E68FB327E190902F1E9242" }, - "uosmo": { - "symbol": "OSMO", + "uusdt": { + "symbol": "axlUSDT", "decimals": 6, - "name": null, - "is_native": true, - "address": "uosmo" - }, - "cusd-wei": { - "symbol": "cUSD", - "decimals": 18, - "name": "Celo Dollar", - "is_native": false, - "address": "ibc/73ACC8C994C1335BDEE9F473865EE46ED6529D345B1FE8905ED1FD5F2628AADA" - }, - "cbeth-wei": { - "symbol": "cbETH", - "decimals": 18, - "name": "Coinbase Wrapped Staked ETH", + "name": "Tether USD", "is_native": false, - "address": "ibc/4D7A6F2A7744B1534C984A21F9EDFFF8809FC71A9E9243FFB702073E7FCA513A" + "address": "ibc/F2331645B9683116188EF36FC04A809C28BD36B54555E8705A37146D0182F045" }, - "sfrxeth-wei": { - "symbol": "sfrxETH", - "decimals": 18, - "name": "Staked Frax Ether", + "wbtc-satoshi": { + "symbol": "axlWBTC", + "decimals": 8, + "name": "Wrapped BTC", "is_native": false, - "address": "ibc/81F578C39006EB4B27FFFA9460954527910D73390991B379C03B18934D272F46" + "address": "ibc/301DAF9CB0A9E247CD478533EF0E21F48FF8118C4A51F77C8BC3EB70E5566DBC" }, - "reth-wei": { - "symbol": "rETH", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Rocket Pool ETH", + "name": "Wrapped Ether", "is_native": false, - "address": "ibc/E610B83FD5544E00A8A1967A2EB3BEF25F1A8CFE8650FE247A8BD4ECA9DC9222" + "address": "ibc/1B38805B1C75352B28169284F96DF56BDEBD9E8FAC005BDCC8CF0378C82AA8E7" }, - "arb-wei": { - "symbol": "axlARB", - "decimals": 18, - "name": "Arbitrum", + "dot-planck": { + "symbol": "axlDOT", + "decimals": 10, + "name": "xcDOT", "is_native": false, - "address": "ibc/10E5E5B06D78FFBB61FD9F89209DEE5FD4446ED0550CBB8E3747DA79E10D9DC6" + "address": "ibc/B37E4D9FB5B30F3E1E20A4B2DE2A005E584C5C822C44527546556AE2470B4539" }, - "weth-wei": { - "symbol": "axlETH", + "busd-wei": { + "symbol": "axlBUSD", "decimals": 18, - "name": "Wrapped Ether", + "name": "Binance USD", "is_native": false, - "address": "ibc/EA1D43981D5C9A1C4AAEA9C23BB1D4FA126BA9BC7020A25E0AE4AA841EA25DC5" + "address": "ibc/65CD60D7E37EF830BC6B6A6DF4E3E3884A96C0905A7D271C48DC0440B1989EC7" }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/AB589511ED0DD5FA56171A39978AFBF1371DB986EC1C3526CE138A16377E39BB" + "address": "ibc/A64467480BBE4CCFC3CF7E25AD1446AA9BDBD4F5BCB9EF6038B83D6964C784E6" }, "wavax-wei": { "symbol": "axlAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/6F62F01D913E3FFE472A38C78235B8F021B511BC6596ADFF02615C8F83D3B373" + "address": "ibc/004EBF085BBED1029326D56BE8A2E67C08CECE670A94AC1947DF413EF5130EB2" }, "wglmr-wei": { "symbol": "axlGLMR", "decimals": 18, "name": "Wrapped GLMR", "is_native": false, - "address": "ibc/1E26DB0E5122AED464D98462BD384FCCB595732A66B3970AE6CE0B58BAE0FC49" + "address": "ibc/C8D63703F5805CE6A2B20555139CF6ED9CDFA870389648EB08D688B94B0AE2C1" }, "wbnb-wei": { "symbol": "axlBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/F4A070A6D78496D53127EA85C094A9EC87DFC1F36071B8CCDDBD020F933D213D" + "address": "ibc/DADB399E742FCEE71853E98225D13E44E90292852CD0033DF5CABAB96F80B833" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "ibc/5E2DFDF1734137302129EA1C1BA21A580F96F778D4F021815EA4F6DB378DA1A4" + "address": "ibc/E67ADA2204A941CD4743E70771BA08E24885E1ADD6FD140CE1F9E0FEBB68C6B2" }, "rai-wei": { "symbol": "axlRAI", "decimals": 18, "name": "Rai Reflex Index", "is_native": false, - "address": "ibc/BD796662F8825327D41C96355DF62045A5BA225BAE31C0A86289B9D88ED3F44E" + "address": "ibc/4CA23432A78B272A9EB7010CB72A15A199066D239F1B13BB583F3945EB8A315C" }, "link-wei": { "symbol": "axlLINK", "decimals": 18, "name": "ChainLink Token", "is_native": false, - "address": "ibc/D3327A763C23F01EC43D1F0DB3CEFEC390C362569B6FD191F40A5192F8960049" + "address": "ibc/FC59D6840A41252352263CEA2B832BB86D68D03CBA194263CB9F3C15946796FB" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, - "name": "Frax", - "is_native": false, - "address": "ibc/0E43EDE2E2A3AFA36D0CD38BDDC0B49FECA64FA426A82E102F304E430ECF46EE" - }, - "mkr-wei": { - "symbol": "axlMKR", - "decimals": 18, - "name": "Maker", - "is_native": false, - "address": "ibc/D27DDDF34BB47E5D5A570742CC667DE53277867116CCCA341F27785E899A70F3" - }, - "uni-wei": { - "symbol": "axlUNI", - "decimals": 18, - "name": "Uniswap", - "is_native": false, - "address": "ibc/AE2719773D6FCDD05AC17B1ED63F672F5F9D84144A61965F348C86C2A83AD161" - }, - "shib-wei": { - "symbol": "axlSHIB", - "decimals": 18, - "name": "SHIBA INU", - "is_native": false, - "address": "ibc/19305E20681911F14D1FB275E538CDE524C3BF88CF9AE5D5F78F4D4DA05E85B2" - }, - "wfil-wei": { - "symbol": "axlFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/18FB5C09D9D2371F659D4846A956FA56225E377EE3C3652A2BF3542BF809159D" - }, - "polygon-uusdc": { - "symbol": "Polygon USDC", - "decimals": 6, - "name": "Polygon USDC", - "is_native": false, - "address": "ibc/231FD77ECCB2DB916D314019DA30FE013202833386B1908A191D16989AD80B5A" - }, - "avalanche-uusdc": { - "symbol": "Avalanche USDC", - "decimals": 6, - "name": "Avalanche USDC", - "is_native": false, - "address": "ibc/F17C9CA112815613C5B6771047A093054F837C3020CBA59DFFD9D780A8B2984C" - }, - "wdoge-wei": { - "symbol": "axlWDOGE", - "decimals": 8, - "name": "Wrapped DOGE", - "is_native": false, - "address": "ibc/C5E95745A3176F1D30356E6EC157ECB50979E5EFEA0AD385FA100E05307446EA" - }, - "yieldusd-wei": { - "symbol": "axlYieldUSD", - "decimals": 18, - "name": "Real Yield USD", + "name": "Frax", "is_native": false, - "address": "ibc/3ED2A5EA7913330BA28951F94D93EDA7C74139D1F18C18EDA2051C9461811A16" + "address": "ibc/7B11FE7D6385B46B9F3598B298B81A773CB20A8BA12001D87A78580314218364" }, - "yieldeth-wei": { - "symbol": "axlYieldETH", + "mkr-wei": { + "symbol": "axlMKR", "decimals": 18, - "name": "Real Yield ETH", + "name": "Maker", "is_native": false, - "address": "ibc/FBB3FEF80ED2344D821D4F95C31DBFD33E4E31D5324CAD94EF756E67B749F668" + "address": "ibc/31A4E6623063E702FB9CF2E7B616DFCCDE319CA2FC4775CDFF26F29F628E7ACF" }, - "wusdm-wei": { - "symbol": "wUSDM", + "uni-wei": { + "symbol": "axlUNI", "decimals": 18, - "name": "Wrapped Mountain Protocol USD", + "name": "Uniswap", "is_native": false, - "address": "ibc/E79C3DAA6E5E0180F61F30C1515B8933F1E9092E81020222080C405D1716C533" + "address": "ibc/0A88A08F3E9573DB9D8CB74AA3746F6D23C41C3EE7B6CC5AA4695A1DD74FF86B" }, - "sfrax-wei": { - "symbol": "sFRAX", + "shib-wei": { + "symbol": "axlSHIB", "decimals": 18, - "name": "Staked FRAX", + "name": "SHIBA INU", "is_native": false, - "address": "ibc/4062A80E72B08BFF5AD591BB43CF4891D94EFAD7D591F8E574D1D1AC5DB2241A" + "address": "ibc/43BF3152103ED706E207005E7C433AB3440572C1D444FFE49321A0EF6A8EFC82" } }, - "persistence": { + "regen": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/34C83B3566255FBE18D4D6B6D1716DBC8993CC3FB2E6110A6BB47DFACA4B0A7A" + "address": "ibc/334740505537E9894A64E8561030695016481830D7B36E6A9B6D13C608B55653" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/89404A5E31BD61F409C7AA26B7E1FD164B997A0671E949DA2253E365816D1964" + "address": "ibc/3C147E71BD9FEC5AAAED09BF022F1C06F52D360580D602F79A5389DA471E7BA3" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/B56D6A6284B153D6F054485A9B78AD1FCE5699D751DA511262268105983B147C" + "address": "ibc/E2CAC8B785E3E496891ABC7AAB1659F239B5023C1072BA21196AAA443F0F5F23" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/F581E33B07FA339E0C5ED441119582EF51A49A326131473F7003D4511D5AE6BE" + "address": "ibc/9D7B59A9F02B0D2F45FD1AA4441AB283E91F6B963F5E45883B1287C6FEBA9575" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/62B27C470C859CBCB57DC12FCBBD357DD44CAD673362B47503FAA77523ABA028" }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, "name": "xcDOT", "is_native": false, - "address": "ibc/AF51552CCBACC37A6B39B2DF2A25BB8E5A98F92BDDB67422D3383A66650C0C82" + "address": "ibc/8D43EF0E6FA102EAB9793146BE5BFEF177D5525388830D347B5DC287201BFE8E" }, "busd-wei": { "symbol": "axlBUSD", "decimals": 18, "name": "Binance USD", "is_native": false, - "address": "ibc/D93E39C5F90A03FCB8265B18410A64198928BA77CCFAB907C4D61072E801F021" - }, - "stkbnb-wei": { - "symbol": "stkBNB", - "decimals": 18, - "name": "Staked BNB", - "is_native": false, - "address": "ibc/525F28AACB70E540D19117E5AF4875DA8EB62F0C8C666233BCC4970C20D5CC32" - }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/43494E635D14726AEA1203EE63F4C3B27642345C3D9AF6091585CB7FDAB349D7" + "address": "ibc/C0B2F6309C73078A793F8DB25B72028728F9CE1244A60E0D356DDF92861503CB" }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/B441047FD82738C278ADFB246EF75FF4F002B2671F9064719F7BDDD38FBFE35E" + "address": "ibc/08F89698ED1AEB855854C63901306D16E98186756A842828733252405675AF13" }, "wavax-wei": { "symbol": "axlAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/C77BFEFE5DCE9A10CBA3DE2A33DCBA5FEF6A171E0275F79E1BFCB8C28673A12B" + "address": "ibc/47E16DE770374BE6ABE72A5264231DCEC92FD2711ACEB29B86574DBCCC228052" }, "wglmr-wei": { "symbol": "axlGLMR", "decimals": 18, "name": "Wrapped GLMR", "is_native": false, - "address": "ibc/BBBEA20BF5A4663B0ECBB76C652E8BC84D71B164DA900B0BDC86C440910396D2" + "address": "ibc/417455B944F2C3A47811DB1C6AFA740911198939A97A987F0DEF94326D38E4D5" }, "wbnb-wei": { "symbol": "axlBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/EB2462F292F42B402923F7C3808BB7295A2420C4691B35D43EBF018DDF7CB917" + "address": "ibc/E83EB9C4EC33A836E4E9B0F3216A85BF54996A8891F366F2F677EE0E012AADC2" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "ibc/3C3FFB6CB792D1A6336EEB8F20617C05B70ADC7C3D6AFD3FEDC5AACDA6E0EC45" + "address": "ibc/E8FF33FF39F5AD98A45CBE679B02ADB861D477B418896002243B32DCD042FF26" }, "rai-wei": { "symbol": "axlRAI", "decimals": 18, "name": "Rai Reflex Index", "is_native": false, - "address": "ibc/873216FB52952C680DA7F16880DCEC551B438009F954CB10161612955401582C" + "address": "ibc/ADDE7057E983259BF6148327FE812BBC70BC0F62FBD4DA2B36653774D2C7534F" }, "link-wei": { "symbol": "axlLINK", "decimals": 18, "name": "ChainLink Token", "is_native": false, - "address": "ibc/1226F5992220125F0F273047D4B5B44FCA386AA7E7994D4768F9B8CEA55A63C1" + "address": "ibc/BF08151D1CBA116B90183472571412A5A3BD631AD774800E89C58357651F0D6D" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "ibc/4760C346F88AF297467F2E5CA0A26184F479CAD2A69E2062E2270F668089A609" + "address": "ibc/007D8660648AA2A59BCD464BF5E4834D06BA49298CFAF67009A53A59F811DC02" }, "mkr-wei": { "symbol": "axlMKR", "decimals": 18, "name": "Maker", "is_native": false, - "address": "ibc/91F17C58A8BED8E5A20E13659E18638250BE46995CF6B7E805AFD251D980534C" + "address": "ibc/02B81671F02BFC81BC660D948B935195867294CB2A5CB98D21FA256433B19EE7" }, "uni-wei": { "symbol": "axlUNI", "decimals": 18, "name": "Uniswap", "is_native": false, - "address": "ibc/C5C067424F5467D2C600A2AEE5E37936C86F9553506A4FB1B26915A2E8C8267D" + "address": "ibc/2DEDFDB05F9D851F5376CBAEA59A1D914AD24F53616C979813FBC62A76A1AE8C" }, "shib-wei": { "symbol": "axlSHIB", "decimals": 18, "name": "SHIBA INU", "is_native": false, - "address": "ibc/5DA50C9E4A8F363ABFC29FD4EA144E764E66C71735D9B84D3BBD39B71A42611C" + "address": "ibc/5138EC81DA50C8C062223FE012F7743C6327DF75CF67824A76840CC5671C30F7" } }, - "polygon": { + "scroll": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "0x750e4C4984a9e0f12978eA6742Bc1c5D248f40ed" + "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "0x6e4E624106Cb12E168E6533F8ec7c82263358940" + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "0xDDc9E2891FA11a4CC5C223145e8d14B44f3077c9" + "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "0xCeED2671d8634e3ee65000EDbbEe66139b132fBf" - }, - "pepe-wei": { - "symbol": "axlPEPE", - "decimals": 18, - "name": "Pepe", - "is_native": false, - "address": "0x8baE3F5Eb10F39663E57Be19741FD9ccEF0E113a" - }, - "wmai-wei": { - "symbol": "axlWMAI", - "decimals": 18, - "name": "Wrapped MAI", - "is_native": false, - "address": "0x08aD99fB3f9f262853B54613249B4064901BD358" - }, - "stuatom": { - "symbol": "stATOM", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x9132ab3B9EcA438184588b8887CeD9dE0FCA19AE" - }, - "ustrd": { - "symbol": "STRD", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x1D9b7C028e5018c7057c6F57366a1350c9CeADE5" - }, - "wmatic-wei": { - "symbol": "WMATIC", - "decimals": 18, - "name": "Wrapped Matic", - "is_native": true, - "address": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270" - }, - "uatom": { - "symbol": "axlATOM", - "decimals": 6, - "name": "Cosmoshub staking ATOM", - "is_native": false, - "address": "0x33F8a5029264BcFB66e39157aF3FeA3E2a8a5067" - }, - "uluna": { - "symbol": "LUNC", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0xa17927fB75E9faEA10C08259902d0468b3DEad88" - }, - "uusd": { - "symbol": "USTC", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0xeDDc6eDe8F3AF9B4971e1Fa9639314905458bE87" - }, - "frax-wei": { - "symbol": "axlFRAX", - "decimals": 18, - "name": "Frax", - "is_native": false, - "address": "0x53Adc464b488bE8C5d7269B9ABBCe8bA74195C3a" - }, - "wfil-wei": { - "symbol": "axlFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "0xE440dc07b23faafF3a76bdbcf783221406eb00F1" - }, - "polygon-uusdc": { - "symbol": "USDC", - "decimals": 6, - "name": "Polygon USDC", - "is_native": true, - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174" - }, - "ern-wei": { - "symbol": "ERN", - "decimals": 18, - "name": "Ethos Reserve Note", - "is_native": false, - "address": "0xC3a9a54c043f348027fffAac0F2F996123A19bF4" + "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "0x779661872e9C891027099C9E3fd101DCc8B96433" + "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" }, "weth-wei": { "symbol": "axlETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0x1280830F690D0E65195B3c61b028244C3A49f26D" + "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" }, - "lqdr-wei": { - "symbol": "axlLqdr", + "wmai-wei": { + "symbol": "axlWMAI", "decimals": 18, - "name": "LqdrV2", + "name": "Wrapped MAI", "is_native": false, - "address": "0x0294D8eB7857D43FEb1210Db72456d41481f9Ede" + "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" }, "wsteth-wei": { "symbol": "axl-wstETH", "decimals": 18, "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "0xd7Bb095a60D7666D4A6f236423B47DDD6ae6Cfa7" - }, - "oath-wei": { - "symbol": "OATH", - "decimals": 18, - "name": "Oath Token", - "is_native": false, - "address": "0x7c603C3C0C97a565cf202c94AB5298bF8510f7dc" - }, - "knc-wei": { - "symbol": "axlKNC", - "decimals": 18, - "name": "Kyber Network Crystal v2", - "is_native": false, - "address": "0x46371C90fcCE4D7367a61CB43eA7922406bC707a" - }, - "gdx-wei": { - "symbol": "GDX", - "decimals": 18, - "name": "Gridex", - "is_native": false, - "address": "0xB0684AEb24b70A8973F2459DB4AB83a4be9139fB" - }, - "deus-wei": { - "symbol": "axlDEUS", - "decimals": 18, - "name": "DEUS", - "is_native": false, - "address": "0x12A80A285DfaBd23FC1DFe6c515F034A22d9cdCE" - }, - "stern-wei": { - "symbol": "stERN", - "decimals": 18, - "name": "Staked ERN Vault", - "is_native": false, - "address": "0x281c4746c902A322B9A951F07893AC51a7221Acc" - }, - "vext-wei": { - "symbol": "VEXT", - "decimals": 18, - "name": "Veloce", - "is_native": true, - "address": "0x27842334C55c01DDFE81Bf687425F906816c5141" - }, - "bal-wei": { - "symbol": "axlBAL", - "decimals": 18, - "name": "Balancer", - "is_native": false, - "address": "0xA8e417f73D68A239cE7E7FbD73b8081BE419767B" - } - }, - "rebus": { - "uusdc": { - "symbol": "axlUSDC", - "decimals": 6, - "name": "USD Coin", - "is_native": false, - "address": "ibc/295548A78785A1007F232DE286149A6FF512F180AF5657780FC89C009E2C348F" - }, - "dai-wei": { - "symbol": "axlDAI", - "decimals": 18, - "name": "Dai Stablecoin", - "is_native": false, - "address": "ibc/3914BDEF46F429A26917E4D8D434620EC4817DC6B6E68FB327E190902F1E9242" + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" }, - "uusdt": { - "symbol": "axlUSDT", - "decimals": 6, - "name": "Tether USD", + "ern-wei": { + "symbol": "ERN", + "decimals": 18, + "name": "Ethos Reserve Note", "is_native": false, - "address": "ibc/F2331645B9683116188EF36FC04A809C28BD36B54555E8705A37146D0182F045" + "address": "0xa334884bF6b0A066d553D19e507315E839409e62" }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", "is_native": false, - "address": "ibc/301DAF9CB0A9E247CD478533EF0E21F48FF8118C4A51F77C8BC3EB70E5566DBC" + "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" }, - "dot-planck": { - "symbol": "axlDOT", - "decimals": 10, - "name": "xcDOT", + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", "is_native": false, - "address": "ibc/B37E4D9FB5B30F3E1E20A4B2DE2A005E584C5C822C44527546556AE2470B4539" + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" }, - "busd-wei": { - "symbol": "axlBUSD", + "frxeth-wei": { + "symbol": "frxETH", "decimals": 18, - "name": "Binance USD", + "name": "Frax Ether", "is_native": false, - "address": "ibc/65CD60D7E37EF830BC6B6A6DF4E3E3884A96C0905A7D271C48DC0440B1989EC7" + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D" }, - "weth-wei": { - "symbol": "axlETH", + "sfrax-wei": { + "symbol": "sFRAX", "decimals": 18, - "name": "Wrapped Ether", + "name": "Staked FRAX", "is_native": false, - "address": "ibc/1B38805B1C75352B28169284F96DF56BDEBD9E8FAC005BDCC8CF0378C82AA8E7" + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" }, - "wmatic-wei": { - "symbol": "axlMATIC", + "fxs-wei": { + "symbol": "FXS", "decimals": 18, - "name": "Wrapped Matic", + "name": "Frax Share", "is_native": false, - "address": "ibc/A64467480BBE4CCFC3CF7E25AD1446AA9BDBD4F5BCB9EF6038B83D6964C784E6" + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721" }, - "wavax-wei": { - "symbol": "axlAVAX", + "oath-wei": { + "symbol": "OATH", "decimals": 18, - "name": "Wrapped AVAX", + "name": "Oath Token", "is_native": false, - "address": "ibc/004EBF085BBED1029326D56BE8A2E67C08CECE670A94AC1947DF413EF5130EB2" + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" }, - "wglmr-wei": { - "symbol": "axlGLMR", + "knc-wei": { + "symbol": "axlKNC", "decimals": 18, - "name": "Wrapped GLMR", + "name": "Kyber Network Crystal v2", "is_native": false, - "address": "ibc/C8D63703F5805CE6A2B20555139CF6ED9CDFA870389648EB08D688B94B0AE2C1" + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" }, - "wbnb-wei": { - "symbol": "axlBNB", - "decimals": 18, - "name": "Wrapped BNB", + "stuatom": { + "symbol": "stATOM", + "decimals": 6, + "name": "Stride Staked Atom", "is_native": false, - "address": "ibc/DADB399E742FCEE71853E98225D13E44E90292852CD0033DF5CABAB96F80B833" + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "ibc/E67ADA2204A941CD4743E70771BA08E24885E1ADD6FD140CE1F9E0FEBB68C6B2" + "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8" }, - "rai-wei": { - "symbol": "axlRAI", - "decimals": 18, - "name": "Rai Reflex Index", + "uatom": { + "symbol": "axlATOM", + "decimals": 6, + "name": "Cosmoshub staking ATOM", "is_native": false, - "address": "ibc/4CA23432A78B272A9EB7010CB72A15A199066D239F1B13BB583F3945EB8A315C" + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" }, - "link-wei": { - "symbol": "axlLINK", - "decimals": 18, - "name": "ChainLink Token", + "utia": { + "symbol": "axlTIA", + "decimals": 6, + "name": "Axelar Wrapped TIA", "is_native": false, - "address": "ibc/FC59D6840A41252352263CEA2B832BB86D68D03CBA194263CB9F3C15946796FB" + "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "ibc/7B11FE7D6385B46B9F3598B298B81A773CB20A8BA12001D87A78580314218364" + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" }, - "mkr-wei": { - "symbol": "axlMKR", + "fpi-wei": { + "symbol": "FPI", "decimals": 18, - "name": "Maker", + "name": "Frax Price Index", "is_native": false, - "address": "ibc/31A4E6623063E702FB9CF2E7B616DFCCDE319CA2FC4775CDFF26F29F628E7ACF" + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f" }, - "uni-wei": { - "symbol": "axlUNI", + "wfil-wei": { + "symbol": "axlFIL", "decimals": 18, - "name": "Uniswap", + "name": "Wrapped FIL", "is_native": false, - "address": "ibc/0A88A08F3E9573DB9D8CB74AA3746F6D23C41C3EE7B6CC5AA4695A1DD74FF86B" + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" }, - "shib-wei": { - "symbol": "axlSHIB", + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", + "is_native": false, + "address": "0x809c55916bb542c1419724022B3F0162087E3C88" + }, + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", + "is_native": false, + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B" + }, + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", + "is_native": false, + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5" + }, + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", + "is_native": false, + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5" + }, + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", + "is_native": false, + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6" + }, + "aISLM": { + "symbol": "ISLM", "decimals": 18, - "name": "SHIBA INU", + "name": "Islamic Coin", "is_native": false, - "address": "ibc/43BF3152103ED706E207005E7C433AB3440572C1D444FFE49321A0EF6A8EFC82" + "address": "0x2a98d978817949D45a5528013850772E762B7F12" + }, + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", + "is_native": false, + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D" + }, + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", + "is_native": false, + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", + "is_native": false, + "address": "0x520391D410314451E12A85D79970a61915Bc315D" + }, + "usomm": { + "symbol": "axlSOMM", + "decimals": 6, + "name": "Axelar Wrapped SOMM", + "is_native": false, + "address": "0x4e914bbDCDE0f455A8aC9d59d3bF739c46287Ed2" + }, + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", + "is_native": false, + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8" + }, + "ubtsg": { + "symbol": "BTSG", + "decimals": 6, + "name": "BTSG native asset", + "is_native": false, + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7" + }, + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", + "is_native": false, + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF" } }, - "regen": { + "secret-snip": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/334740505537E9894A64E8561030695016481830D7B36E6A9B6D13C608B55653" + "address": "ibc/FC0FF958BC92354A5EF218C511B6949B29407D9EBEB741E2833137961ABAFD96" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/3C147E71BD9FEC5AAAED09BF022F1C06F52D360580D602F79A5389DA471E7BA3" + "address": "ibc/A7B80FED32358A60A9D263E257CE253F62CA84FA98AC38A8D5566F2CBE334870" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/E2CAC8B785E3E496891ABC7AAB1659F239B5023C1072BA21196AAA443F0F5F23" + "address": "ibc/7B00195095D3EA3A8B423E135AFA34F007C162CA84DF842A09F1EEDD3E2BDFC3" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/9D7B59A9F02B0D2F45FD1AA4441AB283E91F6B963F5E45883B1287C6FEBA9575" - }, - "dot-planck": { - "symbol": "axlDOT", - "decimals": 10, - "name": "xcDOT", - "is_native": false, - "address": "ibc/8D43EF0E6FA102EAB9793146BE5BFEF177D5525388830D347B5DC287201BFE8E" - }, - "busd-wei": { - "symbol": "axlBUSD", - "decimals": 18, - "name": "Binance USD", - "is_native": false, - "address": "ibc/C0B2F6309C73078A793F8DB25B72028728F9CE1244A60E0D356DDF92861503CB" + "address": "ibc/45647DBF247B01D3335938040D7608F6FD8431B6255C7B5DEA77E963DD2F7148" }, "weth-wei": { "symbol": "axlETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/62B27C470C859CBCB57DC12FCBBD357DD44CAD673362B47503FAA77523ABA028" - }, - "wmatic-wei": { - "symbol": "axlMATIC", - "decimals": 18, - "name": "Wrapped Matic", - "is_native": false, - "address": "ibc/08F89698ED1AEB855854C63901306D16E98186756A842828733252405675AF13" + "address": "ibc/63D64CE0A4CAAE106B251E1B3DB351A0384B1D00A65DCC88CC0F43D7C06D28F7" }, - "wavax-wei": { - "symbol": "axlAVAX", + "busd-wei": { + "symbol": "axlBUSD", "decimals": 18, - "name": "Wrapped AVAX", + "name": "Binance USD", "is_native": false, - "address": "ibc/47E16DE770374BE6ABE72A5264231DCEC92FD2711ACEB29B86574DBCCC228052" + "address": "ibc/A70B6DE4D351223C4279BAF43E84930B03D3C44BDD5EA71E5CB5AF4CC728BA1E" }, - "wglmr-wei": { - "symbol": "axlGLMR", + "wsteth-wei": { + "symbol": "axl-wstETH", "decimals": 18, - "name": "Wrapped GLMR", + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "ibc/417455B944F2C3A47811DB1C6AFA740911198939A97A987F0DEF94326D38E4D5" + "address": "ibc/459EE271B636C8F500FD24442E8D90006B21C4DC863B99B559666D37F6E51019" }, "wbnb-wei": { "symbol": "axlBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/E83EB9C4EC33A836E4E9B0F3216A85BF54996A8891F366F2F677EE0E012AADC2" - }, - "wftm-wei": { - "symbol": "axlFTM", - "decimals": 18, - "name": "Wrapped Fantom", - "is_native": false, - "address": "ibc/E8FF33FF39F5AD98A45CBE679B02ADB861D477B418896002243B32DCD042FF26" - }, - "rai-wei": { - "symbol": "axlRAI", - "decimals": 18, - "name": "Rai Reflex Index", - "is_native": false, - "address": "ibc/ADDE7057E983259BF6148327FE812BBC70BC0F62FBD4DA2B36653774D2C7534F" + "address": "ibc/9B8AAD7F324DE8BD46626BDB6A4142D0AEA2F2F27CD804D9D564B057E03EB0FF" }, "link-wei": { "symbol": "axlLINK", "decimals": 18, "name": "ChainLink Token", "is_native": false, - "address": "ibc/BF08151D1CBA116B90183472571412A5A3BD631AD774800E89C58357651F0D6D" + "address": "ibc/C0FC036C1C7D1BBCE1565C2526D31930978D8EE828664ADDA2A47461185087CE" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "ibc/007D8660648AA2A59BCD464BF5E4834D06BA49298CFAF67009A53A59F811DC02" - }, - "mkr-wei": { - "symbol": "axlMKR", - "decimals": 18, - "name": "Maker", - "is_native": false, - "address": "ibc/02B81671F02BFC81BC660D948B935195867294CB2A5CB98D21FA256433B19EE7" + "address": "ibc/B14422DAD95A933EABD371100A64B4F80231C2968169141E41F03ACD5CCEE796" }, "uni-wei": { "symbol": "axlUNI", "decimals": 18, "name": "Uniswap", "is_native": false, - "address": "ibc/2DEDFDB05F9D851F5376CBAEA59A1D914AD24F53616C979813FBC62A76A1AE8C" - }, - "shib-wei": { - "symbol": "axlSHIB", - "decimals": 18, - "name": "SHIBA INU", - "is_native": false, - "address": "ibc/5138EC81DA50C8C062223FE012F7743C6327DF75CF67824A76840CC5671C30F7" + "address": "ibc/294FFCD5D161FC31C182406396ED25272773708263BCC0A2CCA4D92B3E7A290A" } }, - "secret-snip": { + "sei": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/FC0FF958BC92354A5EF218C511B6949B29407D9EBEB741E2833137961ABAFD96" + "address": "ibc/F082B65C88E4B6D5EF1DB243CDA1D331D002759E938A0F5CD3FFDC5D53B3E349" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/A7B80FED32358A60A9D263E257CE253F62CA84FA98AC38A8D5566F2CBE334870" + "address": "ibc/626DBDAD47E2867EE930907A2C97B9F61043523C40FB9C4FEEC980933D1F6790" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/7B00195095D3EA3A8B423E135AFA34F007C162CA84DF842A09F1EEDD3E2BDFC3" + "address": "ibc/57503D7852EF4E1899FE6D71C5E81D7C839F76580F86F21E39348FC2BC9D7CE2" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/45647DBF247B01D3335938040D7608F6FD8431B6255C7B5DEA77E963DD2F7148" - }, - "busd-wei": { - "symbol": "axlBUSD", - "decimals": 18, - "name": "Binance USD", - "is_native": false, - "address": "ibc/A70B6DE4D351223C4279BAF43E84930B03D3C44BDD5EA71E5CB5AF4CC728BA1E" + "address": "ibc/DF8722298D192AAB85D86D0462E8166234A6A9A572DD4A2EA7996029DF4DB363" }, "weth-wei": { "symbol": "axlETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/63D64CE0A4CAAE106B251E1B3DB351A0384B1D00A65DCC88CC0F43D7C06D28F7" + "address": "ibc/A585C2D15DCD3B010849B453A2CFCB5E213208A5AB665691792684C26274304D" }, - "wbnb-wei": { - "symbol": "axlBNB", + "wusdm-wei": { + "symbol": "wUSDM", "decimals": 18, - "name": "Wrapped BNB", + "name": "Wrapped Mountain Protocol USD", "is_native": false, - "address": "ibc/9B8AAD7F324DE8BD46626BDB6A4142D0AEA2F2F27CD804D9D564B057E03EB0FF" + "address": "ibc/E7824AC1CB5AF191E4EE6265D3BB269FFBFC86112BA7765CC755B187EF0B1A50" }, - "frax-wei": { - "symbol": "axlFRAX", + "wmatic-wei": { + "symbol": "axlMATIC", "decimals": 18, - "name": "Frax", + "name": "Wrapped Matic", "is_native": false, - "address": "ibc/B14422DAD95A933EABD371100A64B4F80231C2968169141E41F03ACD5CCEE796" + "address": "ibc/14767887A69DBEFF3B99AA3E5B176C7989B1DAD2395A1E843F48EE981AC4F83F" }, - "uni-wei": { - "symbol": "axlUNI", + "pepe-wei": { + "symbol": "axlPEPE", "decimals": 18, - "name": "Uniswap", + "name": "Pepe", "is_native": false, - "address": "ibc/294FFCD5D161FC31C182406396ED25272773708263BCC0A2CCA4D92B3E7A290A" + "address": "ibc/BE0B6569E21562DA7E129F407AED4EA6625B7CB403E072C8C5E1B7F8D79DCC78" }, - "wsteth-wei": { - "symbol": "axl-wstETH", + "ox-wei": { + "symbol": "OX", "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "name": "Open Exchange Token", "is_native": false, - "address": "ibc/459EE271B636C8F500FD24442E8D90006B21C4DC863B99B559666D37F6E51019" + "address": "ibc/91DF61C7EFA0E52C56BA0724E80B93DF6ADECD3A5B19D38FD2B4A7F955D2E2E7" }, - "link-wei": { - "symbol": "axlLINK", - "decimals": 18, - "name": "ChainLink Token", - "is_native": false, - "address": "ibc/C0FC036C1C7D1BBCE1565C2526D31930978D8EE828664ADDA2A47461185087CE" + "factory/sei10hud5e5er4aul2l7sp2u9qp2lag5u4xf8mvyx38cnjvqhlgsrcls5qn5ke/seilor": { + "symbol": "SEILOR", + "decimals": 6, + "name": "Axelar Wrapped SEILOR", + "is_native": true, + "address": "factory/sei10hud5e5er4aul2l7sp2u9qp2lag5u4xf8mvyx38cnjvqhlgsrcls5qn5ke/seilor" } }, "sommelier": { @@ -5567,6 +9225,13 @@ "is_native": false, "address": "ibc/45C87C0C3027BD5E5BBECF6A6BF8570857E555ABCB6689130AC90D391016AD17" }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/E3AB0DFDE9E782262B770C32DF94AC2A92B93DC4825376D6F6C874D3C877864E" + }, "wsteth-wei": { "symbol": "axl-wstETH", "decimals": 18, @@ -5581,13 +9246,6 @@ "is_native": false, "address": "ibc/D35774A7E5C3D52146C03DF1F458C7E81EA7E633FAE36BA58E0012ECFD77A127" }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/E3AB0DFDE9E782262B770C32DF94AC2A92B93DC4825376D6F6C874D3C877864E" - }, "wavax-wei": { "symbol": "axlAVAX", "decimals": 18, @@ -5598,7 +9256,7 @@ "usomm": { "symbol": "SOMM", "decimals": 6, - "name": null, + "name": "Axelar Wrapped SOMM", "is_native": true, "address": "usomm" }, @@ -5653,6 +9311,13 @@ "is_native": false, "address": "ibc/DE68EAF973E2FFCFB42931B578A4E719DC61A93C5C6F921504BCA4DD5A0E494D" }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/08CF01F857C36D3C91C3427AA2EACFAFC07971E7AC40B6C433A9982B333F2567" + }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, @@ -5667,13 +9332,6 @@ "is_native": false, "address": "ibc/8F1B50C472ED7BCAA3D783FA8B3A1F2700994CC60A47128EE18A4D7C9C7469CB" }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/08CF01F857C36D3C91C3427AA2EACFAFC07971E7AC40B6C433A9982B333F2567" - }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, @@ -5750,6 +9408,13 @@ "name": "SHIBA INU", "is_native": false, "address": "ibc/34F46D2D07BC90C00EADCCBF8E2419ACB6E189F0CBAD0A3F019C43F66B7B6C10" + }, + "ustars": { + "symbol": "STARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", + "is_native": true, + "address": "ustars" } }, "stride": { @@ -5763,16 +9428,53 @@ "stuatom": { "symbol": "stATOM", "decimals": 6, - "name": null, + "name": "Stride Staked Atom", "is_native": true, "address": "stuatom" }, "ustrd": { "symbol": "STRD", "decimals": 6, - "name": null, + "name": "Stride", "is_native": true, "address": "ustrd" + }, + "stutia": { + "symbol": "stTIA", + "decimals": 6, + "name": "Stride Staked Tia", + "is_native": true, + "address": "stutia" + } + }, + "teritori": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "ibc/25BEA899D29934A185A2492310B1FF00FB3204C9BC93585EC84A3A30CD92279B" + }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/ED182F6ABD428EFCE49C2985E2B65DD194E0DEFEAFAE60D99F790701046EDA23" + }, + "wmatic-wei": { + "symbol": "axlMATIC", + "decimals": 18, + "name": "Wrapped Matic", + "is_native": false, + "address": "ibc/93EE76FC14E1201C37128C5E92E06760E207B78959C46474749C9FAD27FBA086" + }, + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", + "is_native": true, + "address": "utori" } }, "terra-2": { @@ -5804,12 +9506,12 @@ "is_native": false, "address": "ibc/05D299885B07905B6886F554B39346EA6761246076A1120B1950049B92B922DD" }, - "pepe-wei": { - "symbol": "axlPEPE", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Pepe", + "name": "Wrapped Ether", "is_native": false, - "address": "ibc/ED1D1CEACDB852377A99B1776BF3459472084BBA8F39D2D41AAF3E86E67CA8F3" + "address": "ibc/BC8A77AFBD872FDC32A348D3FB10CC09277C266CFE52081DE341C7EC6752E674" }, "dot-planck": { "symbol": "axlDOT", @@ -5853,6 +9555,13 @@ "is_native": false, "address": "ibc/F89222965B85BEDE242359DDB25339BCEEFDA8C687F49E78623FD5713F2DEE03" }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "ibc/1EA41719164ECAC4272F16B8916D42F666881B0742FB1D59A26488735CCD9BE5" + }, "reth-wei": { "symbol": "rETH", "decimals": 18, @@ -5867,13 +9576,6 @@ "is_native": false, "address": "ibc/0A31B4B46B4C5F10ED3EF4BFBD1453CE96A270D168FC672436ABCA2DB4CC1401" }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/BC8A77AFBD872FDC32A348D3FB10CC09277C266CFE52081DE341C7EC6752E674" - }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, @@ -5909,6 +9611,13 @@ "is_native": false, "address": "ibc/19E687E77D1AE3CADBB3DE487277AFEC0E340A84334D6ED3F216EF25A7075746" }, + "pepe-wei": { + "symbol": "axlPEPE", + "decimals": 18, + "name": "Pepe", + "is_native": false, + "address": "ibc/ED1D1CEACDB852377A99B1776BF3459472084BBA8F39D2D41AAF3E86E67CA8F3" + }, "rai-wei": { "symbol": "axlRAI", "decimals": 18, @@ -5960,20 +9669,6 @@ } }, "terra": { - "uluna": { - "symbol": "LUNC", - "decimals": 6, - "name": null, - "is_native": true, - "address": "uluna" - }, - "uusd": { - "symbol": "USTC", - "decimals": 6, - "name": null, - "is_native": true, - "address": "uusd" - }, "uusdc": { "symbol": "axlUSDC", "decimals": 6, @@ -6001,6 +9696,20 @@ "name": "Wrapped Ether", "is_native": false, "address": "ibc/9B68CC79EFF12D25AF712EB805C5062B8F97B2CCE5F3FE55B107EE03095514A3" + }, + "uluna": { + "symbol": "LUNC", + "decimals": 6, + "name": "Axelar Wrapped LUNC", + "is_native": true, + "address": "uluna" + }, + "uusd": { + "symbol": "USTC", + "decimals": 6, + "name": "Axelar Wrapped USTC", + "is_native": true, + "address": "uusd" } }, "umee": { @@ -6014,7 +9723,7 @@ "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, "address": "ibc/D1CB2804AA5EB64D503F28E8DF3552F8A4D642802B66EFE50DE432B755F37AE1" }, @@ -6039,12 +9748,12 @@ "is_native": false, "address": "ibc/153B97FE395140EAAA2D7CAC537AF1804AEC5F0595CBC5F1603094018D158C0C" }, - "pepe-wei": { - "symbol": "axlPEPE", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Pepe", + "name": "Wrapped Ether", "is_native": false, - "address": "ibc/536179FABD7E85D0F122A4355168157740D0E9D4DEEE40A038DE317D8ABFCDCA" + "address": "ibc/04CE51E6E02243E565AE676DD60336E48D455F8AAD0611FA0299A22FDAC448D6" }, "dot-planck": { "symbol": "axlDOT", @@ -6088,6 +9797,13 @@ "is_native": false, "address": "ibc/3F972A6BFE64248AF19C9328FA59A1270CBC57D4545A099860E035C2BA4C79FD" }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "ibc/C0081F3EA4EB59A1F4864B2D1AF2E9EC0E5A7A0AC1293BAC7482D089D4E364AB" + }, "reth-wei": { "symbol": "rETH", "decimals": 18, @@ -6102,12 +9818,12 @@ "is_native": false, "address": "ibc/9969B977C24A8AC974FFAE5E828C9B427C1131F1B31497B0FED0A0E682E7FB59" }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/04CE51E6E02243E565AE676DD60336E48D455F8AAD0611FA0299A22FDAC448D6" + "uumee": { + "symbol": "UMEE", + "decimals": 6, + "name": "Umee native token", + "is_native": true, + "address": "uumee" }, "wmatic-wei": { "symbol": "axlMATIC", @@ -6144,6 +9860,13 @@ "is_native": false, "address": "ibc/87FAA671A952F1203496AEF3787AC23A06592B2B52F79149AA67C621470673E6" }, + "pepe-wei": { + "symbol": "axlPEPE", + "decimals": 18, + "name": "Pepe", + "is_native": false, + "address": "ibc/536179FABD7E85D0F122A4355168157740D0E9D4DEEE40A038DE317D8ABFCDCA" + }, "rai-wei": { "symbol": "axlRAI", "decimals": 18, @@ -6192,13 +9915,6 @@ "name": "Wrapped FIL", "is_native": false, "address": "ibc/B65DC9ECFAF78C96F484B8965A694985B9445C4185BD994E34BB703250B2172C" - }, - "uumee": { - "symbol": "UMEE", - "decimals": 6, - "name": null, - "is_native": true, - "address": "uumee" } }, "xpla": { @@ -6230,6 +9946,13 @@ "is_native": false, "address": "ibc/562B5799F38289F9A645FEA6BEA5424D4E3E022DE7E638158DF5DB8F269ADDD8" }, + "weth-wei": { + "symbol": "axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/ADD91F7979979B9DBBF383BD556BD15E73D4FEECE4210FF80929ADFEBCCF110B" + }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, @@ -6244,13 +9967,6 @@ "is_native": false, "address": "ibc/A71FC27AA5A7FED3D451C0010962727A89F4EF183EDF694E15C1F67E8FC1E51E" }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/ADD91F7979979B9DBBF383BD556BD15E73D4FEECE4210FF80929ADFEBCCF110B" - }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, @@ -6314,80 +10030,38 @@ "is_native": false, "address": "ibc/4BCB6C286BBE91A6A71C86F9577D321E6B80CED7FEA8F932395762F7DA7D4DBB" }, - "uni-wei": { - "symbol": "axlUNI", - "decimals": 18, - "name": "Uniswap", - "is_native": false, - "address": "ibc/4FF08DC3C8252D0D042CD31C82E31BDBC5F2747CC5EA6E542E231FB4112544FC" - }, - "shib-wei": { - "symbol": "axlSHIB", - "decimals": 18, - "name": "SHIBA INU", - "is_native": false, - "address": "ibc/88429A75F66B097E2BF23E9F595B8DBCDFF939315BCC3170B9A103D559E37622" - } - }, - "sei": { - "uusdc": { - "symbol": "axlUSDC", - "decimals": 6, - "name": "USD Coin", - "is_native": false, - "address": "ibc/F082B65C88E4B6D5EF1DB243CDA1D331D002759E938A0F5CD3FFDC5D53B3E349" - }, - "dai-wei": { - "symbol": "axlDAI", - "decimals": 18, - "name": "Dai Stablecoin", - "is_native": false, - "address": "ibc/626DBDAD47E2867EE930907A2C97B9F61043523C40FB9C4FEEC980933D1F6790" - }, - "uusdt": { - "symbol": "axlUSDT", - "decimals": 6, - "name": "Tether USD", - "is_native": false, - "address": "ibc/57503D7852EF4E1899FE6D71C5E81D7C839F76580F86F21E39348FC2BC9D7CE2" - }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", - "is_native": false, - "address": "ibc/DF8722298D192AAB85D86D0462E8166234A6A9A572DD4A2EA7996029DF4DB363" - }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/A585C2D15DCD3B010849B453A2CFCB5E213208A5AB665691792684C26274304D" - }, - "wmatic-wei": { - "symbol": "axlMATIC", + "uni-wei": { + "symbol": "axlUNI", "decimals": 18, - "name": "Wrapped Matic", + "name": "Uniswap", "is_native": false, - "address": "ibc/14767887A69DBEFF3B99AA3E5B176C7989B1DAD2395A1E843F48EE981AC4F83F" + "address": "ibc/4FF08DC3C8252D0D042CD31C82E31BDBC5F2747CC5EA6E542E231FB4112544FC" }, - "pepe-wei": { - "symbol": "axlPEPE", + "shib-wei": { + "symbol": "axlSHIB", "decimals": 18, - "name": "Pepe", + "name": "SHIBA INU", "is_native": false, - "address": "ibc/BE0B6569E21562DA7E129F407AED4EA6625B7CB403E072C8C5E1B7F8D79DCC78" + "address": "ibc/88429A75F66B097E2BF23E9F595B8DBCDFF939315BCC3170B9A103D559E37622" + } + }, + "dymension": { + "uusdc": { + "symbol": "axlUSDC", + "decimals": 6, + "name": "USD Coin", + "is_native": false, + "address": "ibc/BFAAB7870A9AAABF64A7366DAAA0B8E5065EAA1FCE762F45677DC24BE796EF65" }, - "wusdm-wei": { - "symbol": "wUSDM", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Wrapped Mountain Protocol USD", + "name": "Wrapped Ether", "is_native": false, - "address": "ibc/E7824AC1CB5AF191E4EE6265D3BB269FFBFC86112BA7765CC755B187EF0B1A50" + "address": "ibc/E3AB0DFDE9E782262B770C32DF94AC2A92B93DC4825376D6F6C874D3C877864E" } }, - "base": { + "fraxtal": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, @@ -6398,7 +10072,7 @@ "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, @@ -6444,183 +10118,190 @@ "is_native": false, "address": "0xa334884bF6b0A066d553D19e507315E839409e62" }, - "stuatom": { - "symbol": "stATOM", - "decimals": 6, - "name": null, + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", "is_native": false, - "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" + "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" }, - "ustrd": { - "symbol": "STRD", + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", "decimals": 6, - "name": null, + "name": "Levana Governance Token", "is_native": false, - "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F" + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5" }, - "wftm-wei": { - "symbol": "axlFTM", + "sfrxeth-wei": { + "symbol": "sfrxETH", "decimals": 18, - "name": "Wrapped Fantom", + "name": "Staked Frax Ether", "is_native": false, - "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8" + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" }, - "uatom": { - "symbol": "axlATOM", - "decimals": 6, - "name": "Cosmoshub staking ATOM", + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", "is_native": false, - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D" }, - "frax-wei": { - "symbol": "axlFRAX", + "sfrax-wei": { + "symbol": "sFRAX", "decimals": 18, - "name": "Frax", + "name": "Staked FRAX", "is_native": false, - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" }, - "wfil-wei": { - "symbol": "axlFIL", + "fxs-wei": { + "symbol": "FXS", "decimals": 18, - "name": "Wrapped FIL", + "name": "Frax Share", "is_native": false, - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721" }, - "busd-wei": { - "symbol": "axlBUSD", + "oath-wei": { + "symbol": "OATH", "decimals": 18, - "name": "Binance USD", + "name": "Oath Token", "is_native": false, - "address": "0x4D84E25cEa9447581867fE9f2329B972f532Da2c" + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" }, - "wmatic-wei": { - "symbol": "axlMATIC", + "knc-wei": { + "symbol": "axlKNC", "decimals": 18, - "name": "Wrapped Matic", + "name": "Kyber Network Crystal v2", "is_native": false, - "address": "0xE3ce47AC96d8502824627d7cBCFDA49414beDa9C" + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" }, - "wavax-wei": { - "symbol": "axlAVAX", - "decimals": 18, - "name": "Wrapped AVAX", + "stuatom": { + "symbol": "stATOM", + "decimals": 6, + "name": "Stride Staked Atom", "is_native": false, - "address": "0x6E76A241Ae6fcaD51C064Ac70fe6e676502b91c5" + "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" }, - "wbnb-wei": { - "symbol": "axlBNB", - "decimals": 18, - "name": "Wrapped BNB", + "ustrd": { + "symbol": "STRD", + "decimals": 6, + "name": "Stride", "is_native": false, - "address": "0x23A6486099f740B7688A0bb7AED7C912015cA2F0" + "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F" }, - "arb-wei": { - "symbol": "axlARB", - "decimals": 18, - "name": "Arbitrum", + "uatom": { + "symbol": "axlATOM", + "decimals": 6, + "name": "Cosmoshub staking ATOM", "is_native": false, - "address": "0x87b6c94c435F6e49789ad34FAf0d048F2D9043a2" + "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" }, - "mpx-wei": { - "symbol": "MPX", + "frax-wei": { + "symbol": "axlFRAX", "decimals": 18, - "name": "MPX", + "name": "Frax", "is_native": false, - "address": "0xa5325A8EBBbdb12CAF6b76218a7375a71f9f3b41" + "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" }, - "hzn-wei": { - "symbol": "HZN", + "fpi-wei": { + "symbol": "FPI", "decimals": 18, - "name": "Horizon", + "name": "Frax Price Index", "is_native": false, - "address": "0x081AD949deFe648774C3B8deBe0E4F28a80716dc" + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f" }, - "oath-wei": { - "symbol": "OATH", + "wfil-wei": { + "symbol": "axlFIL", "decimals": 18, - "name": "Oath Token", + "name": "Wrapped FIL", "is_native": false, - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" }, - "knc-wei": { - "symbol": "axlKNC", - "decimals": 18, - "name": "Kyber Network Crystal v2", + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", "is_native": false, - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" + "address": "0x809c55916bb542c1419724022B3F0162087E3C88" }, - "sonne-wei": { - "symbol": "SONNE", - "decimals": 18, - "name": "Sonne", + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", "is_native": false, - "address": "0x22a2488fE295047Ba13BD8cCCdBC8361DBD8cf7c" + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B" }, - "stern-wei": { - "symbol": "stERN", - "decimals": 18, - "name": "Staked ERN Vault", + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", "is_native": false, - "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5" }, - "gdx-wei": { - "symbol": "GDX", - "decimals": 18, - "name": "Gridex", + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", "is_native": false, - "address": "0x91c415FEcD651F11D24aC4b72Ed08dbEb9868D43" + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6" }, - "vela-wei": { - "symbol": "VELA", + "aISLM": { + "symbol": "ISLM", "decimals": 18, - "name": "VelaToken", + "name": "Islamic Coin", "is_native": false, - "address": "0x5A76A56ad937335168b30dF3AA1327277421C6Ae" + "address": "0x2a98d978817949D45a5528013850772E762B7F12" }, - "arx-wei": { - "symbol": "ARX", - "decimals": 18, - "name": "ArbiDex Token", + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", "is_native": false, - "address": "0x58Ed4FD0C3d930b674BA50a293f03ef6cD7dE7a3" + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D" }, - "deus-wei": { - "symbol": "axlDEUS", - "decimals": 18, - "name": "DEUS", + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", "is_native": false, - "address": "0xebD4A18034C78A415088DF8508f102421eD693b1" + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61" }, - "ovn-wei": { - "symbol": "OVN", - "decimals": 18, - "name": "OVN", + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", "is_native": false, - "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396" + "address": "0x520391D410314451E12A85D79970a61915Bc315D" }, - "bal-wei": { - "symbol": "axlBAL", - "decimals": 18, - "name": "Balancer", + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", "is_native": false, - "address": "0x11C1879227D463b60db18C17c20aE739aE8E961a" + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8" }, - "utia": { - "symbol": "axlTIA", + "ubtsg": { + "symbol": "BTSG", "decimals": 6, - "name": null, + "name": "BTSG native asset", "is_native": false, - "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97" + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7" }, - "wsteth-wei": { - "symbol": "axl-wstETH", - "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", "is_native": false, - "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": false, + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF" } }, - "linea": { + "blast": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, @@ -6631,7 +10312,7 @@ "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, @@ -6677,27 +10358,76 @@ "is_native": false, "address": "0xa334884bF6b0A066d553D19e507315E839409e62" }, + "stern-wei": { + "symbol": "stERN", + "decimals": 18, + "name": "Staked ERN Vault", + "is_native": false, + "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" + }, + "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn": { + "symbol": "LVN", + "decimals": 6, + "name": "Levana Governance Token", + "is_native": false, + "address": "0xC35294306B17FA2A30Eda3bdd345630e516111F5" + }, + "sfrxeth-wei": { + "symbol": "sfrxETH", + "decimals": 18, + "name": "Staked Frax Ether", + "is_native": false, + "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" + }, + "frxeth-wei": { + "symbol": "frxETH", + "decimals": 18, + "name": "Frax Ether", + "is_native": false, + "address": "0xEcc68d0451E20292406967Fe7C04280E5238Ac7D" + }, + "sfrax-wei": { + "symbol": "sFRAX", + "decimals": 18, + "name": "Staked FRAX", + "is_native": false, + "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" + }, + "fxs-wei": { + "symbol": "FXS", + "decimals": 18, + "name": "Frax Share", + "is_native": false, + "address": "0x5860a0bF37133f8461b2DEDe7C80e55D6bfF3721" + }, + "oath-wei": { + "symbol": "OATH", + "decimals": 18, + "name": "Oath Token", + "is_native": false, + "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + }, + "knc-wei": { + "symbol": "axlKNC", + "decimals": 18, + "name": "Kyber Network Crystal v2", + "is_native": false, + "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" + }, "stuatom": { "symbol": "stATOM", "decimals": 6, - "name": null, + "name": "Stride Staked Atom", "is_native": false, "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" }, "ustrd": { "symbol": "STRD", "decimals": 6, - "name": null, + "name": "Stride", "is_native": false, "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F" }, - "wftm-wei": { - "symbol": "axlFTM", - "decimals": 18, - "name": "Wrapped Fantom", - "is_native": false, - "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8" - }, "uatom": { "symbol": "axlATOM", "decimals": 6, @@ -6712,6 +10442,13 @@ "is_native": false, "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" }, + "fpi-wei": { + "symbol": "FPI", + "decimals": 18, + "name": "Frax Price Index", + "is_native": false, + "address": "0x219279953d8D23520B7878447e8A6c266a51de2f" + }, "wfil-wei": { "symbol": "axlFIL", "decimals": 18, @@ -6719,684 +10456,558 @@ "is_native": false, "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" }, - "busd-wei": { - "symbol": "axlBUSD", - "decimals": 18, - "name": "Binance USD", + "utori": { + "symbol": "TORI", + "decimals": 6, + "name": "Teritori", "is_native": false, - "address": "0x4D84E25cEa9447581867fE9f2329B972f532Da2c" + "address": "0x809c55916bb542c1419724022B3F0162087E3C88" }, - "wmatic-wei": { - "symbol": "axlMATIC", - "decimals": 18, - "name": "Wrapped Matic", + "uhuahua": { + "symbol": "HUAHUA", + "decimals": 6, + "name": "Chihuahua native asset", "is_native": false, - "address": "0xE3ce47AC96d8502824627d7cBCFDA49414beDa9C" + "address": "0x64D599b3d0c5f1375e5e639E98aB86298261A30B" }, - "wavax-wei": { - "symbol": "axlAVAX", - "decimals": 18, - "name": "Wrapped AVAX", + "uscrt": { + "symbol": "SCRT", + "decimals": 6, + "name": "Secret native asset", "is_native": false, - "address": "0x6E76A241Ae6fcaD51C064Ac70fe6e676502b91c5" + "address": "0x308717203Ab045d4a8fE49ECD149aB14F0Eb16c5" }, - "wbnb-wei": { - "symbol": "axlBNB", - "decimals": 18, - "name": "Wrapped BNB", + "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA": { + "symbol": "milkTIA", + "decimals": 6, + "name": "milkTIA", "is_native": false, - "address": "0x23A6486099f740B7688A0bb7AED7C912015cA2F0" + "address": "0x4AA81D7AB59C775fe6F9F45E6941A0FB8cD692a6" }, - "arb-wei": { - "symbol": "axlARB", + "aISLM": { + "symbol": "ISLM", "decimals": 18, - "name": "Arbitrum", + "name": "Islamic Coin", "is_native": false, - "address": "0x87b6c94c435F6e49789ad34FAf0d048F2D9043a2" + "address": "0x2a98d978817949D45a5528013850772E762B7F12" }, - "mpx-wei": { - "symbol": "MPX", - "decimals": 18, - "name": "MPX", + "ustars": { + "symbol": "axlSTARS", + "decimals": 6, + "name": "Axelar Wrapped STARS", "is_native": false, - "address": "0xa5325A8EBBbdb12CAF6b76218a7375a71f9f3b41" - }, - "hzn-wei": { - "symbol": "HZN", - "decimals": 18, - "name": "Horizon", - "is_native": true, - "address": "0x0B1A02A7309dFbfAD1Cd4adC096582C87e8A3Ac1" + "address": "0xd58Dc7aa4827CC51169b68E64f0fD4EA7faC557D" }, - "oath-wei": { - "symbol": "OATH", - "decimals": 18, - "name": "Oath Token", + "stutia": { + "symbol": "stTIA.axl", + "decimals": 6, + "name": "Stride Staked Tia", "is_native": false, - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + "address": "0x789CbBE5d19f04F38Ec9790b28Ecb07ba5617f61" }, - "knc-wei": { - "symbol": "axlKNC", + "ovn-wei": { + "symbol": "OVN", "decimals": 18, - "name": "Kyber Network Crystal v2", + "name": "OVN", "is_native": false, - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" + "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396" }, - "stern-wei": { - "symbol": "stERN", + "deus-wei": { + "symbol": "axlDEUS", "decimals": 18, - "name": "Staked ERN Vault", + "name": "DEUS", "is_native": false, - "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" + "address": "0xebD4A18034C78A415088DF8508f102421eD693b1" }, - "gdx-wei": { - "symbol": "GDX", - "decimals": 18, - "name": "Gridex", + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", "is_native": false, - "address": "0x91c415FEcD651F11D24aC4b72Ed08dbEb9868D43" + "address": "0x520391D410314451E12A85D79970a61915Bc315D" }, - "ovn-wei": { - "symbol": "OVN", - "decimals": 18, - "name": "OVN", + "uxprt": { + "symbol": "XPRT", + "decimals": 6, + "name": "XPRT native asset", "is_native": false, - "address": "0xA3d1a8DEB97B111454B294E2324EfAD13a9d8396" + "address": "0xc7Edf7B7b3667a06992508e7B156eff794a9e1c8" }, - "utia": { - "symbol": "axlTIA", + "ubtsg": { + "symbol": "BTSG", "decimals": 6, - "name": null, + "name": "BTSG native asset", "is_native": false, - "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97" + "address": "0x225Cf2027458F534C29C95A679e885B4E8BDDdf7" }, - "wsteth-wei": { - "symbol": "axl-wstETH", - "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "usaga": { + "symbol": "axlSAGA", + "decimals": 6, + "name": "Axelar Wrapped SAGA", "is_native": false, - "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" + "address": "0x86e650048A20E0646d14E974d76109e16a0605d7" }, - "sfrxeth-wei": { - "symbol": "sfrxETH", - "decimals": 18, - "name": "Staked Frax Ether", + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", "is_native": false, - "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" + "address": "0x11e969e9B3f89cB16D686a03Cd8508C9fC0361AF" + } + }, + "ojo": { + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "ibc/0E1517E2771CA7C03F2ED3F9BAECCAEADF0BFD79B89679E834933BC0F179AD98" }, - "sfrax-wei": { - "symbol": "sFRAX", + "weth-wei": { + "symbol": "axlETH", "decimals": 18, - "name": "Staked FRAX", + "name": "Wrapped Ether", "is_native": false, - "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" + "address": "ibc/DD0D56BDAB32493B216A4C0530A336620D86FBE1C682888C5513899838FF7389" } }, - "archway": { + "bitsong": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/B9E4FD154C92D3A23BEA029906C4C5FF2FE74CB7E3A058290B77197A263CF88B" + "address": "ibc/B559A80D62249C8AA07A380E2A2BEA6E5CA9A6F079C912C3A9E9B494105E4F81" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "ibc/172CEB45A4226AF4351EFD23D78D349AD686F1D015AC2152430A352A3362EB64" + "address": "ibc/F2855CA9B15D61DDA35D2FE5429374E68412A7072C445EE80CE9F317C35CCA99" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "ibc/2801BC8CE5AC116A6D879A8ADB69D775068BD84CCBA04AA3D339F25C5270ABC5" + "address": "ibc/8656E0377911DA10C9D0EC437D7B9F396A9F22BD1AD7D10215EB25C38493ECAA" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "ibc/3A2DEEBCD51D0B74FE7CE058D40B0BF4C0E556CE9219E8F25F92CF288FF35F56" + "address": "ibc/1C970D3C0BCA37E48202A67FDC100094A98190BDD9AA7825B07C9B6F6D621FC3" }, "weth-wei": { "symbol": "axlETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/13C5990F84FA5D472E1F8BB1BAAEA8774DA5F24128EC02B119107AD21FB52A61" + "address": "ibc/4A3A652BDC946722B2F47996905BF658E8C46CC4DA473D5469003C3A98E00874" }, "dot-planck": { "symbol": "axlDOT", "decimals": 10, "name": "xcDOT", "is_native": false, - "address": "ibc/B1561C4EEF4142F23E824F93A93BBB284F3392781ABB920A25B71E6C4767346A" + "address": "ibc/CFDD67F1B9ECFC5904266CB41EE8EED32A1E0E2FD37529C4DA972358EC57F0DE" }, "busd-wei": { "symbol": "axlBUSD", "decimals": 18, "name": "Binance USD", "is_native": false, - "address": "ibc/799F11B241AAB598261632B890A3B0E678B5918D00ED3ED943E7D7C102621C1F" - }, - "wsteth-wei": { - "symbol": "axl-wstETH", - "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", - "is_native": false, - "address": "ibc/E0735A572BA1EAE93DEFB4C865E28DDCA3D1F7B38C3AEC94BDFDB8A39C664DBF" + "address": "ibc/9809E15939F0DF6B4949FC25EDFB988D63481AB459A885A1AA0F01D2C9E53F8E" }, "wmatic-wei": { "symbol": "axlMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/F6849F4A8B62F2B3B262D4B51D3E0EE4CC6294B046B79D72EC64796A97474127" + "address": "ibc/821891E1521975AEA3518F90F5A77B95CBA42EEF1697A14132C9CB4C3B7DBB11" }, "wavax-wei": { "symbol": "axlAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/AF62035CBD6A7896882827CC6063024E9C3B57ABF5F0C37B5DB735BA6D1E1825" + "address": "ibc/E2475AFDEE5A0449645338856C580C12233FA2188A81DD3078142AFDED61441E" }, "wglmr-wei": { "symbol": "axlGLMR", "decimals": 18, "name": "Wrapped GLMR", "is_native": false, - "address": "ibc/C7DBD7D87B35ACD5BD7878B39A3539D73FC67E81C74C010889C775467E176372" + "address": "ibc/D3018C0766CAF675F624B360BF777207AD25E6DAADE82B7E84ABC650F199CF2D" }, "wbnb-wei": { "symbol": "axlBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/3EB757FA554FC8F6E539A02E23600E6FD42533415EFE5E24480A3F010A04FA68" + "address": "ibc/59155E4D0D5824FC3D2625196EDA9A093D8F62065BC3FC1109F2736C0921CCDD" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "ibc/D161EAA25F518C3AF2E7EB3533940187C60F835B9242E9A96C7B6F83E7E84473" + "address": "ibc/DA6788F08D5D47D740601A796CF0763E90E565B75EF7F4C7D9D93C275886A4FC" }, "rai-wei": { "symbol": "axlRAI", "decimals": 18, "name": "Rai Reflex Index", "is_native": false, - "address": "ibc/0E3DA4942633E784F3BD7ADFB4705176A27FE019FC5712A06AD934B943EF173C" + "address": "ibc/EB2BDF8859D4C3C66510903D15CCB4B9247FD4E3AFEA6CA80496339890D84DC2" }, "link-wei": { "symbol": "axlLINK", "decimals": 18, "name": "ChainLink Token", "is_native": false, - "address": "ibc/6D91F37997735DDD85A03C332485078E8F6A8F52CF38A70B8EE4C271FD1D5DA1" + "address": "ibc/05EDDB5CC66452664A24DD8BC36723AAB1B47DA1641CF23A3E06EEDA8971EAA2" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "ibc/F17C8EF908BE4D0AE74F236C455E26274185C6DB47037AA6BDF02DA7A8B81052" + "address": "ibc/17AF98B459900BD2437B4030FC138487CA05892F631D91C6593CB518397C9CB3" }, "mkr-wei": { "symbol": "axlMKR", "decimals": 18, "name": "Maker", "is_native": false, - "address": "ibc/DC9E5E3B14F410DB9396925B2CCF525C1F990FF1B56E4F2E90B76B086D7B7898" + "address": "ibc/58A671B618B6DAD39161BD4D4AAF420DB9D51904CAC35FA3887C0F775DCCDE7D" }, "uni-wei": { "symbol": "axlUNI", "decimals": 18, "name": "Uniswap", "is_native": false, - "address": "ibc/93A73FE9DEE2E0672BEB66534209F5E3E155201DCBD10A58DAD95A3A96C58BE2" + "address": "ibc/5E4112B737B9A223ABCFF8CB3BB29C0BF72650C4C6B1CC57358B98A54F034DD5" }, "shib-wei": { "symbol": "axlSHIB", "decimals": 18, "name": "SHIBA INU", "is_native": false, - "address": "ibc/C9A055A621F56764EC026BAEEB90038939A6B3CD58D04E0A3C6343443C58C47A" - } - }, - "ixo": { - "uusdc": { - "symbol": "axlUSDC", - "decimals": 6, - "name": "USD Coin", - "is_native": false, - "address": "ibc/2658C97FC74B74AB1898982081523C455561BBE3C705E47707021D47F3D94B38" - }, - "dai-wei": { - "symbol": "axlDAI", - "decimals": 18, - "name": "Dai Stablecoin", - "is_native": false, - "address": "ibc/9D1D4A9B69982D1E46851B9622F41BE18DFD73869BA6328D27BB391117494662" - }, - "uusdt": { - "symbol": "axlUSDT", - "decimals": 6, - "name": "Tether USD", - "is_native": false, - "address": "ibc/E4A8CC9F31A9598F6F92CAE5992380161389AC4BB22CAA154A508A14473740CC" - }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", - "is_native": false, - "address": "ibc/0C41C965F14BA706011DDB3DAFAED259DAAED38D90941B4A816FA0A722063A9D" - }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/346392E297585AFCCDDA1E9D24AEED98FF67CB2B5ACE3160CD0D82618A658CC2" - } - }, - "provenance": { - "uusdc": { - "symbol": "axlUSDC", - "decimals": 6, - "name": "USD Coin", - "is_native": false, - "address": "ibc/295548A78785A1007F232DE286149A6FF512F180AF5657780FC89C009E2C348F" - }, - "dai-wei": { - "symbol": "axlDAI", - "decimals": 18, - "name": "Dai Stablecoin", - "is_native": false, - "address": "ibc/3914BDEF46F429A26917E4D8D434620EC4817DC6B6E68FB327E190902F1E9242" + "address": "ibc/BFAB329CF8F51944C1A71B2716C11211CE58B4F38F06753E03DF83AAF1FF1C06" }, - "uusdt": { - "symbol": "axlUSDT", + "ubtsg": { + "symbol": "BTSG", "decimals": 6, - "name": "Tether USD", - "is_native": false, - "address": "ibc/F2331645B9683116188EF36FC04A809C28BD36B54555E8705A37146D0182F045" - }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", - "is_native": false, - "address": "ibc/301DAF9CB0A9E247CD478533EF0E21F48FF8118C4A51F77C8BC3EB70E5566DBC" - }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/1B38805B1C75352B28169284F96DF56BDEBD9E8FAC005BDCC8CF0378C82AA8E7" + "name": "BTSG native asset", + "is_native": true, + "address": "ubtsg" } }, - "mantle": { + "c4e": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + "address": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7" + "address": "ibc/A077578EA10FD0C0506761FCFF3E2C8AD11773F27F677238DB4A9E7A252DB7CA" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" + "address": "ibc/0C9E2F9CC7C99D6C274F148C313E4231F383E8AAD4E1C18A260E5479F96C62ED" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + "address": "ibc/562B5799F38289F9A645FEA6BEA5424D4E3E022DE7E638158DF5DB8F269ADDD8" }, "weth-wei": { "symbol": "axlETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" - }, - "wmai-wei": { - "symbol": "axlWMAI", - "decimals": 18, - "name": "Wrapped MAI", - "is_native": false, - "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" + "address": "ibc/ADD91F7979979B9DBBF383BD556BD15E73D4FEECE4210FF80929ADFEBCCF110B" }, - "ern-wei": { - "symbol": "ERN", - "decimals": 18, - "name": "Ethos Reserve Note", + "dot-planck": { + "symbol": "axlDOT", + "decimals": 10, + "name": "xcDOT", "is_native": false, - "address": "0xa334884bF6b0A066d553D19e507315E839409e62" + "address": "ibc/4CB46EC64989D104FCB95D8534A0E8DC40FD7B07C7ECC2E84986F1BBA5C02C77" }, - "stern-wei": { - "symbol": "stERN", + "busd-wei": { + "symbol": "axlBUSD", "decimals": 18, - "name": "Staked ERN Vault", + "name": "Binance USD", "is_native": false, - "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" + "address": "ibc/A71FC27AA5A7FED3D451C0010962727A89F4EF183EDF694E15C1F67E8FC1E51E" }, - "oath-wei": { - "symbol": "OATH", + "wmatic-wei": { + "symbol": "axlMATIC", "decimals": 18, - "name": "Oath Token", + "name": "Wrapped Matic", "is_native": false, - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + "address": "ibc/8BCD6BB5E8AD820584B798724B16398C413D7B7C475E1B676DEC223FCD32F7E5" }, - "knc-wei": { - "symbol": "axlKNC", + "wavax-wei": { + "symbol": "axlAVAX", "decimals": 18, - "name": "Kyber Network Crystal v2", + "name": "Wrapped AVAX", "is_native": false, - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" + "address": "ibc/6771714762A6F8F541DE7C461F09C68F310621315FA70C70799F66A0DE6B95D2" }, - "stuatom": { - "symbol": "stATOM", - "decimals": 6, - "name": null, + "wglmr-wei": { + "symbol": "axlGLMR", + "decimals": 18, + "name": "Wrapped GLMR", "is_native": false, - "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" + "address": "ibc/D52A8EA034E19FF7DC540CDE532C4134F4A4D6C0E1F4E41EE3F62678D535F57B" }, - "ustrd": { - "symbol": "STRD", - "decimals": 6, - "name": null, + "wbnb-wei": { + "symbol": "axlBNB", + "decimals": 18, + "name": "Wrapped BNB", "is_native": false, - "address": "0x05931D5e2F7E1C1A710c9c1dCdD94e413652376F" + "address": "ibc/FEC1C247382FE8A2E67AC699D8AADC01AD1DE04A860D85A2C68BF5BFCB7D8468" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8" + "address": "ibc/9B50579E4AE3CF7B1705F04A4C715EE4E859F03620F0DE560C67CBB9B9A239A2" }, - "uatom": { - "symbol": "axlATOM", - "decimals": 6, - "name": "Cosmoshub staking ATOM", + "rai-wei": { + "symbol": "axlRAI", + "decimals": 18, + "name": "Rai Reflex Index", "is_native": false, - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" + "address": "ibc/E60BE65CB0338AC612856A5C81AC9C8B94F086CB6374213313FF72C2C34FA7D2" + }, + "link-wei": { + "symbol": "axlLINK", + "decimals": 18, + "name": "ChainLink Token", + "is_native": false, + "address": "ibc/DDC03C91D59A11B679652439E9BED9C95C0232369FAD28F235890FEC301BAD9D" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" + "address": "ibc/64917EDDFF873CE7B930360F40319EC3600C6A6A9C6400B69EB0DD248420E7D8" }, - "wfil-wei": { - "symbol": "axlFIL", + "mkr-wei": { + "symbol": "axlMKR", "decimals": 18, - "name": "Wrapped FIL", + "name": "Maker", "is_native": false, - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" + "address": "ibc/4BCB6C286BBE91A6A71C86F9577D321E6B80CED7FEA8F932395762F7DA7D4DBB" }, - "ktc-wei": { - "symbol": "KTC", + "uni-wei": { + "symbol": "axlUNI", "decimals": 18, - "name": "KTX Community Token", + "name": "Uniswap", "is_native": false, - "address": "0x01C5ED019A1Bc07d3A320a09C83C398d91f8fd5D" + "address": "ibc/4FF08DC3C8252D0D042CD31C82E31BDBC5F2747CC5EA6E542E231FB4112544FC" }, - "wsteth-wei": { - "symbol": "axl-wstETH", + "shib-wei": { + "symbol": "axlSHIB", "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "name": "SHIBA INU", "is_native": false, - "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" + "address": "ibc/88429A75F66B097E2BF23E9F595B8DBCDFF939315BCC3170B9A103D559E37622" }, - "sfrxeth-wei": { - "symbol": "sfrxETH", - "decimals": 18, - "name": "Staked Frax Ether", - "is_native": false, - "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "C4E native asset", + "is_native": true, + "address": "uc4e" }, - "sfrax-wei": { - "symbol": "sFRAX", - "decimals": 18, - "name": "Staked FRAX", + "uosmo": { + "symbol": "axlOSMO", + "decimals": 6, + "name": "Axelar Wrapped OSMO", "is_native": false, - "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" + "address": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518" } }, - "scroll": { + "nolus": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "0xEB466342C4d449BC9f53A865D5Cb90586f405215" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + "address": "ibc/374F4F22F8BA560D182922841988E56D671A901272483A619372813B8F10B0BB" }, "dai-wei": { "symbol": "axlDAI", "decimals": 18, "name": "Dai Stablecoin", "is_native": false, - "address": "0x5C7e299CF531eb66f2A1dF637d37AbB78e6200C7" + "address": "ibc/E63949C066F6CBE2039A0BC926800F42AE45A8BE0B3F2B877DF93C66B588E402" }, "uusdt": { "symbol": "axlUSDT", "decimals": 6, "name": "Tether USD", "is_native": false, - "address": "0x7f5373AE26c3E8FfC4c77b7255DF7eC1A9aF52a6" + "address": "ibc/CFED3A6656809DE3D21AEF0CA15B0A60DE7C5FD07CA7F8894473D75739161427" }, "wbtc-satoshi": { "symbol": "axlWBTC", "decimals": 8, "name": "Wrapped BTC", "is_native": false, - "address": "0x1a35EE4640b0A3B87705B0A4B45D227Ba60Ca2ad" + "address": "ibc/2DAA6798459AF6193A17873A66E265E3D8D92919B0AB33764073223F508EA388" }, "weth-wei": { "symbol": "axlETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0xb829b68f57CC546dA7E5806A929e53bE32a4625D" + "address": "ibc/E7D47C7C104FB8E2C15AB94F67B8AAE4F62C8732480F61DCC422CB6B482F9727" }, - "wmai-wei": { - "symbol": "axlWMAI", - "decimals": 18, - "name": "Wrapped MAI", + "dot-planck": { + "symbol": "axlDOT", + "decimals": 10, + "name": "xcDOT", "is_native": false, - "address": "0x88DfaAABaf06f3a41D2606EA98BC8edA109AbeBb" + "address": "ibc/5D0C32EA83FBA012B2AEF53B9723B7FD93DC24DCE6F633B98D72E41FA5C4CD8B" }, - "ern-wei": { - "symbol": "ERN", + "busd-wei": { + "symbol": "axlBUSD", "decimals": 18, - "name": "Ethos Reserve Note", + "name": "Binance USD", "is_native": false, - "address": "0xa334884bF6b0A066d553D19e507315E839409e62" + "address": "ibc/1641CA495B6683462DEF4A2725E08F8438441D28451D9AA5D9289CC5D5294BB3" }, - "stern-wei": { - "symbol": "stERN", + "wmatic-wei": { + "symbol": "axlMATIC", "decimals": 18, - "name": "Staked ERN Vault", + "name": "Wrapped Matic", "is_native": false, - "address": "0xf7A0dd3317535eC4f4d29ADF9d620B3d8D5D5069" + "address": "ibc/68F029AF84C9C87251A2268EF6312C8E61906243CF9CBB15CA1D20F56265E0F6" }, - "oath-wei": { - "symbol": "OATH", + "wavax-wei": { + "symbol": "axlAVAX", "decimals": 18, - "name": "Oath Token", + "name": "Wrapped AVAX", "is_native": false, - "address": "0x00e1724885473B63bCE08a9f0a52F35b0979e35A" + "address": "ibc/DFD1B61EE53F458FFB274FA1985FB60F5000AD729CFC3682A8737FE8CFA8B765" }, - "knc-wei": { - "symbol": "axlKNC", + "wglmr-wei": { + "symbol": "axlGLMR", "decimals": 18, - "name": "Kyber Network Crystal v2", + "name": "Wrapped GLMR", "is_native": false, - "address": "0xB448eC505C924944ca8B2C55EF05c299eE0781df" + "address": "ibc/61FE2384C0969CF027ECB464954ECB98EB3B892ACDAAC784474D9EA17EE4AAE9" }, - "stuatom": { - "symbol": "stATOM", - "decimals": 6, - "name": null, + "wbnb-wei": { + "symbol": "axlBNB", + "decimals": 18, + "name": "Wrapped BNB", "is_native": false, - "address": "0x7ba861c07d40e3341B901Fd6F418e96E0132E25b" + "address": "ibc/CA173FEF24D6249537DB908BA15332940C66C34B2A68901C266F23B796CBE4A2" }, "wftm-wei": { "symbol": "axlFTM", "decimals": 18, "name": "Wrapped Fantom", "is_native": false, - "address": "0x64C09d32E8452CC0453D2EfeED8c9a16421b1ec8" + "address": "ibc/1F03DF3974E4943BAB234C3FEE4835D4605D5C44FC0EB981A8AEDE8D314CFB73" }, - "uatom": { - "symbol": "axlATOM", - "decimals": 6, - "name": "Cosmoshub staking ATOM", + "rai-wei": { + "symbol": "axlRAI", + "decimals": 18, + "name": "Rai Reflex Index", "is_native": false, - "address": "0x06beE9E7238a331B68D83Df3B5B9B16d5DBa83ff" + "address": "ibc/84F3D2A344C86CBB07BF3228684B2A1783BB754891AD95CFB3B48850304152D7" + }, + "link-wei": { + "symbol": "axlLINK", + "decimals": 18, + "name": "ChainLink Token", + "is_native": false, + "address": "ibc/207EA076EAD31069900F487F9E109C89E9FBCC4028BB08A758379D2E3AFDDBF5" }, "frax-wei": { "symbol": "axlFRAX", "decimals": 18, "name": "Frax", "is_native": false, - "address": "0x406Cde76a3fD20e48bc1E0F60651e60Ae204B040" + "address": "ibc/A4984FFC77847E77D305A4284DC46459C04339F91C81336C85F70911CC115E5A" }, - "wfil-wei": { - "symbol": "axlFIL", + "mkr-wei": { + "symbol": "axlMKR", "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "0x5E2Cf56A562b1bDD32ec26315063074ADC420C73" - }, - "utia": { - "symbol": "axlTIA", - "decimals": 6, - "name": null, + "name": "Maker", "is_native": false, - "address": "0x41b94c5867f7F6217C9a30520Cb3e793B1ee1b97" + "address": "ibc/9DF3A8AE2A8336745F6462F7E81A0F306B33A0CE94FB58B209229024558D8A22" }, - "wsteth-wei": { - "symbol": "axl-wstETH", + "uni-wei": { + "symbol": "axlUNI", "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "name": "Uniswap", "is_native": false, - "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" + "address": "ibc/5389F0585A3C7BD8C9F9231322770004BC49A89FFF63F42AC4913AF0EBCE7090" }, - "sfrxeth-wei": { - "symbol": "sfrxETH", + "shib-wei": { + "symbol": "axlSHIB", "decimals": 18, - "name": "Staked Frax Ether", + "name": "SHIBA INU", "is_native": false, - "address": "0x4f74ca4a686203a5D4eBF6E8868c5eBC450bf283" + "address": "ibc/097DED5715DF9A139FC0172C1D28BA7FDA8F7371ABDA03FEC1E6C3237F080EF2" }, - "sfrax-wei": { - "symbol": "sFRAX", - "decimals": 18, - "name": "Staked FRAX", - "is_native": false, - "address": "0xf3602C5A7f625181659445C8dDDde73dA15c22e3" - } - }, - "celestia": { - "utia": { - "symbol": "TIA", + "unls": { + "symbol": "NLS", "decimals": 6, - "name": null, + "name": "NLS native asset", "is_native": true, - "address": "utia" + "address": "unls" } }, - "haqq": { - "uusdc": { - "symbol": "axlUSDC", - "decimals": 6, - "name": "USD Coin", - "is_native": false, - "address": "ibc/65D0BEC6DAD96C7F5043D1E54E54B6BB5D5B3AEC3FF6CEBB75B9E059F3580EA3" - } - }, - "migaloo": { - "uusdc": { - "symbol": "axlUSDC", + "saga": { + "usaga": { + "symbol": "SAGA", "decimals": 6, - "name": "USD Coin", - "is_native": false, - "address": "ibc/3808384ECC813CAF207992BE997BD18E18560E473D5368F1B4B77C3822262C4D" - }, - "wbtc-satoshi": { - "symbol": "axlWBTC", - "decimals": 8, - "name": "Wrapped BTC", - "is_native": false, - "address": "ibc/B65E189D3168DB40C88C6A6C92CA3D3BB0A8B6310325D4C43AB5702F06ECD60B" - }, - "wavax-wei": { - "symbol": "axlAVAX", - "decimals": 18, - "name": "Wrapped AVAX", - "is_native": false, - "address": "ibc/E09B0B8169A4DCE24AAE8C44E02477143A328D0AAE5EE67D9D645BA75F0C1C05" + "name": "Axelar Wrapped SAGA", + "is_native": true, + "address": "usaga" } }, - "teritori": { + "lava": { "uusdc": { "symbol": "axlUSDC", "decimals": 6, "name": "USD Coin", "is_native": false, - "address": "ibc/25BEA899D29934A185A2492310B1FF00FB3204C9BC93585EC84A3A30CD92279B" - }, - "weth-wei": { - "symbol": "axlETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "ibc/ED182F6ABD428EFCE49C2985E2B65DD194E0DEFEAFAE60D99F790701046EDA23" - }, - "wmatic-wei": { - "symbol": "axlMATIC", - "decimals": 18, - "name": "Wrapped Matic", - "is_native": false, - "address": "ibc/93EE76FC14E1201C37128C5E92E06760E207B78959C46474749C9FAD27FBA086" + "address": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5" + }, + "ulava": { + "symbol": "LAVA", + "decimals": 6, + "name": "Axelar Wrapped LAVA", + "is_native": true, + "address": "ulava" } - }, - "centrifuge": {} + } }, "testnet": { "acre": { @@ -7442,19 +11053,26 @@ "is_native": false, "address": "ibc/FEC1C247382FE8A2E67AC699D8AADC01AD1DE04A860D85A2C68BF5BFCB7D8468" }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/42A6CC4488E8E9A41C8EA5F05916639F8DD369688225A676CDD0C82F357CCEE9" - }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, "address": "ibc/9790D25467E96C073CC3701C5BF9B74009955604859C7A31C6EE2F673EF67A3C" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/D36FDC1790A9928516FE0FD4512D20124652A809D3B63F8590307C51ABA31FFA" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/D10BA03DAB722234AEC3D719C8CFD72114B2FCAD6158E9A5F26762520AFEEF69" } }, "aura": { @@ -7500,19 +11118,98 @@ "is_native": false, "address": "ibc/A0D7A4D3545AAF4C23FE0C432503D3EFB13A796B852AEF9B1B92D39AD80BD471" }, - "wfil-wei": { - "symbol": "WFIL", + "wdev-wei": { + "symbol": "WDEV", "decimals": 18, - "name": "Wrapped FIL", + "name": "Wrapped DEV", + "is_native": false, + "address": "ibc/CF03353110E55C2E4D952D0DF4542AE8443CF5FA7023EB572B4A863DFB61EBA2" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/9F090915A735E382A455C7E7B6B495501DD1D033D7F9A2A9813F548294E7FD93" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/2E81BD542D44C7D3C1E5E03483E6A4C33419BF6A73B90984C5DAA438AE83556B" + } + }, + "avalanche": { + "uausdc": { + "symbol": "aUSDC", + "decimals": 6, + "name": "USD coin", + "is_native": false, + "address": "0x57F1c63497AEe0bE305B8852b354CEc793da43bB" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0xa8B51e6517f9A6Ab7b247bF10b71b1A738eD8E50" + }, + "eth-wei": { + "symbol": "axlWETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "0xe840BE8D9aB1ACD5AfC7168b05EC350B7FD18709" + }, + "wmatic-wei": { + "symbol": "WMATIC", + "decimals": 18, + "name": "Wrapped Matic", + "is_native": false, + "address": "0xB923E2374639D0605388D91CFedAfCeCE03Cfd8f" + }, + "wavax-wei": { + "symbol": "WAVAX", + "decimals": 18, + "name": "Wrapped AVAX", + "is_native": true, + "address": "0xd00ae08403B9bbb9124bB305C09058E32C39A48c" + }, + "wftm-wei": { + "symbol": "WFTM", + "decimals": 18, + "name": "Wrapped FTM", + "is_native": false, + "address": "0xeF721BaBf08A2eE5BCcfd2f2A34CbF4Dc9A56959" + }, + "wbnb-wei": { + "symbol": "WBNB", + "decimals": 18, + "name": "Wrapped BNB", "is_native": false, - "address": "ibc/11238441686A79C76DF0FE654527021E74DC7113CF84FADA03882FD53FFB5998" + "address": "0xd020f566723e8402f925A891605c02ce7AF2477F" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/CF03353110E55C2E4D952D0DF4542AE8443CF5FA7023EB572B4A863DFB61EBA2" + "address": "0xF58537d9061f7257e44442Fb7870A094AAE92B43" + }, + "utsaga": { + "symbol": "axlTSAGA", + "decimals": 6, + "name": "Axelar Wrapped TSAGA", + "is_native": false, + "address": "0x66cB47913F450370460cB3CC8da151071e52Eff2" + }, + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", + "is_native": false, + "address": "0xC5735208cFCb51d0dBAB277b6049A11DA2CbD755" } }, "axelarnet": { @@ -7526,10 +11223,17 @@ "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": true, "address": "uaxl" }, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "wsteth-wei" + }, "celo-wei": { "symbol": "axlCELO", "decimals": 18, @@ -7572,13 +11276,6 @@ "is_native": false, "address": "wbnb-wei" }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "wfil-wei" - }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, @@ -7586,12 +11283,54 @@ "is_native": false, "address": "wdev-wei" }, - "wsteth-wei": { - "symbol": "axl-wstETH", + "utsaga": { + "symbol": "axlTSAGA", + "decimals": 6, + "name": "Axelar Wrapped TSAGA", + "is_native": false, + "address": "ibc/3E96BBF51B2CAA39358DE0432CDCF2745EFEBB67AABE1FDEF5DC20E5FE26745C" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "chain4energy native asset", + "is_native": false, + "address": "ibc/12041B94D01218FC1731D43041072D91B79DC2D390F0B11ED50031561B0D1FB0" + }, + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", + "is_native": false, + "address": "ibc/C79757F5B829D34AE58858952271D79DC18291A51FE72B35BFD225F1947E48B4" + }, + "untrn": { + "symbol": "axlNTRN", + "decimals": 6, + "name": "Axelar Wrapped NTRN", + "is_native": false, + "address": "ibc/FA18CB69A942229E970064219F6B02B1A6DE98C4F5556F6785050E77C50A9A76" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "nftl-wei" + }, + "sepolia-wsteth-wei": { + "symbol": "wstETH", "decimals": 18, "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "wsteth-wei" + "address": "sepolia-wsteth-wei" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "sepolia-weth-wei" } }, "base": { @@ -7644,13 +11383,6 @@ "is_native": false, "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "0x6Bf48cac8a850fA48b893f754AeD54A19a505A6F" - }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, @@ -7659,304 +11391,412 @@ "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" } }, - "burnt": { + "binance": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/4BDF2D63B8FFE3454AF30E9BC10D2D7979BD3A938D989889ABC94FC5B86F1E2D" + "address": "0xc2fA98faB811B785b81c64Ac875b31CC9E40F9D2" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0xfC3B4feb754d8082F745940347600D373f03dcaC" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/13F73121EEA6CAA0DF51B06F64C39FD55EF394C64223881569DFA5628FA1288D" + "address": "0x409A57A5Ee1F37FB58b3A3eB9717398F328da1eD" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/7BFC5893BCCC6C9A4B173BC1183D2706141CBF71679EA6BDCE15E679CEC05183" + "address": "0x920fA0DbB65cE928C29103AeC7B5c188bbea2f24" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/78D5DAB545549A930F5DB22CFA7C821ACE8EF55DCF787BED93A56D04CC7477F5" + "address": "0x1B29EC62efC689c462b4E0512457175793cEc9e6" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/301A96A9BB897EF914BA74534EE1D75417753A0E113F2F766838274057290B79" + "address": "0x90dEcD89a744a0CFbB3cc8DE08A5f3B14875B6C4" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", + "is_native": true, + "address": "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd" + }, + "wdev-wei": { + "symbol": "WDEV", + "decimals": 18, + "name": "Wrapped DEV", "is_native": false, - "address": "ibc/52F7DAC8D338E4D7388D02EBD6E522B86EBB62A48C6732C2651423A9E79377DE" + "address": "0xa893Fd868c3159B294f6416F512203be53315fd8" }, - "wfil-wei": { - "symbol": "WFIL", + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", + "is_native": false, + "address": "0xBD67EDDDCf1f00dA4D6162a1Cd6f91db35d89370" + } + }, + "burnt-2": { + "uausdc": { + "symbol": "aUSDC", + "decimals": 6, + "name": "USD coin", + "is_native": false, + "address": "ibc/035BDC396AA81E38271D2FA5E4799AE159044B90BCF02CCA218EB364829C869E" + }, + "eth-wei": { + "symbol": "axlWETH", "decimals": 18, - "name": "Wrapped FIL", + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/75C575824692FA642ED57B7B5CB1C11807E8B5D80027095DDA724DC98C6C018A" + }, + "wmatic-wei": { + "symbol": "WMATIC", + "decimals": 18, + "name": "Wrapped Matic", + "is_native": false, + "address": "ibc/E97CB9081D7EB7CAEAE022E448FDEF6D1D0781B63DA4112CAE50285594B2B32C" + }, + "wavax-wei": { + "symbol": "WAVAX", + "decimals": 18, + "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/64F437CA650406EC32948093BD96FDE7BE7ECB389D28D9426D04857E520A1D1D" + "address": "ibc/2991B858634D22E4637F772FA5A5F5BFCE3F30EA3ED208E36DD8DC07330490A9" + }, + "wftm-wei": { + "symbol": "WFTM", + "decimals": 18, + "name": "Wrapped FTM", + "is_native": false, + "address": "ibc/BB68A322BA69ED1661EA38363B6A6D06D27AD205896875E78EA225AAF3A65CA6" + }, + "wbnb-wei": { + "symbol": "WBNB", + "decimals": 18, + "name": "Wrapped BNB", + "is_native": false, + "address": "ibc/A0D7A4D3545AAF4C23FE0C432503D3EFB13A796B852AEF9B1B92D39AD80BD471" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/6A4043BCBD3FB6E9D86A14F6A018C33CD4E05990E977729CC1946395B2972B11" + "address": "ibc/CF03353110E55C2E4D952D0DF4542AE8443CF5FA7023EB572B4A863DFB61EBA2" + }, + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", + "is_native": true, + "address": "uxion" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/9F090915A735E382A455C7E7B6B495501DD1D033D7F9A2A9813F548294E7FD93" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/2E81BD542D44C7D3C1E5E03483E6A4C33419BF6A73B90984C5DAA438AE83556B" } }, - "evmos": { + "celestia": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/720B52BDE1E2B84C5898D07C983B085C77EB5ED2D4C0ACD56B882A14777F750C" + "address": "ibc/57CC4D880A8C71F530D6EF54B65B6BE4F48E3973A776EE40D53CD443ABF7AC61" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/7C2C1F14F3BD93792CCEDB76FDA5C1BB8F981F7C2C7308339BBCBA677224CA8F" + "address": "ibc/BE25BB3D2A4F9A537BD30DEE5689F9B83B628AEDCC80B66AD81B5E4DA7E5DEF4" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/8DE781194A674B7129D9EFA838F3E50B5F50212995AA825634BF702E0D037AC3" + "address": "ibc/83016A0BDA530D473A3C7DA9247CCBFC39029CA4B0800A23C8B77E31252AD306" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/2B84B3D7B8AA4B04607ACD2E5096D20B34D6D355D33F4F5DD4659449EB757597" + "address": "ibc/DA6EF9A26484CD3EE2AB2E3291C022DF05AEE63099D1C0CE72FC2760820DD1DF" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/F2D6753B652120212D09EE59075F0D820FCF580620DA8D3DE0349B614ED69A2B" + "address": "ibc/7155119EAC3E0A1A7FF0A03F543EFE720EBDE183E39E4AB0C2EA2F0F0CB96DD7" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/8291F71592AEE7C593D5DC05C1B66CD190B2EEA74DF09D2B8BF57BF6C4E8BCAA" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/ECB83640D0E55A8A7E9A7C1515559BA1D1B8685575E609144C9F7BD5C9F301F9" + "address": "ibc/158CDA722C42E81211A6E26CAD436F5BA1AA90F283865A47591222185F60471F" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/4F89D2416F2E2CF9CFE68CE8B77A11A07B4F590B13E410DA86B1A5E6BCBDA24B" + "address": "ibc/3B003BA11A453299613A59F8B1A44BFB3AD8F82FCC98B1E98DF6DB203EAA0E1C" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/271376309147D478C66F604449235B21D92F8AAB3F39E0C3570BC43A0C896A8E" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/B7F895E40C34FD50853589FA4315AE160971B6B9C96EC4F23B59D9CBC22D9952" } }, - "fetch": { + "centrifuge-2": {}, + "chain4energy": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/56FBD5B47B58A7302F6BED46F8702907E3619F2DC23DCEA8D6685064D79394F8" + "address": "ibc/6F34E1BD664C36CE49ACC28E60D62559A5F96C4F9A6CCE4FC5A67B2852E24CFE" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/0C9F12E54EEC1B60E247635ED3BBCC1BDDD39DCE3E94072A5D79DAA1293FC81B" + "address": "ibc/29320BE25C3BF64A2355344625410899C1EB164038E328531C36095B0AA8BBFC" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/14E4FD1AB72DE9BF1D6725CBA18373C406CB9A7DA17955299F3F4DC5C6131A4E" + "address": "ibc/2B5D096F5732F3BADBFB987FE42FDA24B3569514BC5DFDEA1BC042B223A0CED3" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/F992067A054C819B42D2DAB57F5CCE347D38352EB90453E59D566BFE64F1614B" + "address": "ibc/609C07B33C99E40A50498BDDECDD14D8BCC89D1A14D4E36053082AEA2E8D193D" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/19E687E77D1AE3CADBB3DE487277AFEC0E340A84334D6ED3F216EF25A7075746" + "address": "ibc/055E7CBD9F1EF910CA7CA1DD293B39439CB33172F929194855DBAC6CB3081B95" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/1319C6B38CA613C89D78C2D1461B305038B1085F6855E8CD276FE3F7C9600B4C" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/A203631DE58D5033FFC37676C7F6E715707E9A37B49757EC63B1F6DC3A9A1C10" + "address": "ibc/55E995E3FD16C2C717A18D818A862E90A8414D1C7FCBA9B9349DB944275C98A3" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/42ABF9E931A230BB249FE1F51F67C5E8C3D69FD756DB8D91D5DBED16170C2DF8" + "address": "ibc/76C8C560FDE4EFE9F4AEFB0679E6D523CFF6A62BCD3F9541E8F6E3DA6831550E" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "chain4energy native asset", + "is_native": true, + "address": "uc4e" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/F275F32257587EA449D89966B76F93458092C0C4CF08004AD0189C134DBB499A" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/4919DE40A784F357502DD6DD3334FCAD5D98E4C29E343DE0948D167E227113B4" } }, - "filecoin": { + "dymension": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + "address": "ibc/5BDD47E9E73BF91C14497E254F0A751F1A7D3A6084343F66EA7CEE834A384651" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" + "address": "ibc/B8FEE8FE30746C96641E48F94053D5D0BE99CCB5B98C58A0239B70F082E713EA" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" + "address": "ibc/8BCD6BB5E8AD820584B798724B16398C413D7B7C475E1B676DEC223FCD32F7E5" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" + "address": "ibc/6771714762A6F8F541DE7C461F09C68F310621315FA70C70799F66A0DE6B95D2" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0x594D8b81eC765410536ab59E98091700b99508D8" + "address": "ibc/9B50579E4AE3CF7B1705F04A4C715EE4E859F03620F0DE560C67CBB9B9A239A2" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": true, - "address": "0x6C297AeD654816dc5d211c956DE816Ba923475D2" + "address": "ibc/FEC1C247382FE8A2E67AC699D8AADC01AD1DE04A860D85A2C68BF5BFCB7D8468" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + "address": "ibc/9790D25467E96C073CC3701C5BF9B74009955604859C7A31C6EE2F673EF67A3C" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/D36FDC1790A9928516FE0FD4512D20124652A809D3B63F8590307C51ABA31FFA" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/D10BA03DAB722234AEC3D719C8CFD72114B2FCAD6158E9A5F26762520AFEEF69" } }, - "kujira": { + "elys": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/F91EA2C0A23697A1048E08C2F787E3A58AC6F706A1CD2257A504925158CFC0F3" + "address": "ibc/B128141D55C96F1E2CA7406FB24B339D6385E84A6B1CC27B2EAE482E3F20F1B4" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/CC8B40E3F3536D003C6ED7C65421067215453AECE1517A6F0935470C634A036B" + "address": "ibc/FB22E35236996F6B0B1C9D407E8A379A7B1F4083F1960907A1622F022AE450E1" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/91C6798C23EE6AD5B8336C247371546FFA0026854162612EA4EBC80C62A2841C" + "address": "ibc/E059CD828E5009D4CF03C4494BEA73749250287FC98DD46E19F9016B918BF49D" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/C74D5A562B2D54AF03198E5BC6693D16EF978EBA0BD3BA22A7098511B43249CA" + "address": "ibc/43881AB3B3D05FD9D3606D7F57CBE6EEEA89D18AC66AF9E2915ED43940E71CFD" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/C2BA0743260DDCD9B2E5464860584E2F0826E7C021E19B16A9F5CEF29D225CD3" + "address": "ibc/66000303A64E819F9B46E71EF3B62172921EEE3A74F19076F88D7EDA519F9C3B" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/E09D271B56568F9C4E4B6A32D877F4E904C35FF3B8A4503AD8547A95F6D9925C" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/608009CB6074AE2E0A14A7867BDC97447453D913F1B9B3A3422C9F0E8CC9576A" + "address": "ibc/2FBCFC209420E6CECED6EE0BC599E74349759352CE953E27A6871BB3D84BC058" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/25C4852211900E04B162241362DB1F1D9B7939875A038913E56C9FEF66EA9AD6" + "address": "ibc/122EF3EFDC416F25FE521AEA5766742EA6F938155AA8198D56E8CBDC07E9F55A" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/B24A63065277D87E9E4E1100909B5B3C36CBC5DED3520C1BBD94F4A6739F8FF6" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/8BBE1D43E24935BEDE5C30091E14D4A7B31D521C3B4CF59993B54578AA97A167" } }, - "linea": { + "ethereum-2": { "uausdc": { "symbol": "aUSDC", "decimals": 6, @@ -7967,16 +11807,23 @@ "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, + "wsteth-wei": { + "symbol": "wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": true, + "address": "0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f" + }, "eth-wei": { - "symbol": "axlWETH", + "symbol": "WETH", "decimals": 18, "name": "Wrapped Ether", - "is_native": false, - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" + "is_native": true, + "address": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6" }, "wmatic-wei": { "symbol": "WMATIC", @@ -8006,593 +11853,644 @@ "is_native": false, "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "0x6Bf48cac8a850fA48b893f754AeD54A19a505A6F" - }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + }, + "utsaga": { + "symbol": "axlTSAGA", + "decimals": 6, + "name": "Axelar Wrapped TSAGA", + "is_native": false, + "address": "0x07E5c21E9f39ddb2E7b7A939Bc9ef3244dE19a36" + }, + "uc4e": { + "symbol": "C4E", + "decimals": 6, + "name": "chain4energy native asset", + "is_native": false, + "address": "0x4181bB666c30BcDcFDB28051ADA97B0a42AF002C" + }, + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", + "is_native": false, + "address": "0x08b7bC06e46C0cc11f29e1a6fc3d6e19965174bC" } }, - "neutron": { + "ethereum-sepolia": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/F91EA2C0A23697A1048E08C2F787E3A58AC6F706A1CD2257A504925158CFC0F3" + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/CC8B40E3F3536D003C6ED7C65421067215453AECE1517A6F0935470C634A036B" + "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/91C6798C23EE6AD5B8336C247371546FFA0026854162612EA4EBC80C62A2841C" + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/C74D5A562B2D54AF03198E5BC6693D16EF978EBA0BD3BA22A7098511B43249CA" + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/C2BA0743260DDCD9B2E5464860584E2F0826E7C021E19B16A9F5CEF29D225CD3" + "address": "0x594D8b81eC765410536ab59E98091700b99508D8" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/E09D271B56568F9C4E4B6A32D877F4E904C35FF3B8A4503AD8547A95F6D9925C" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/608009CB6074AE2E0A14A7867BDC97447453D913F1B9B3A3422C9F0E8CC9576A" + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/25C4852211900E04B162241362DB1F1D9B7939875A038913E56C9FEF66EA9AD6" + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" }, - "wsteth-wei": { - "symbol": "axl-wstETH", + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": true, + "address": "0x0d312E74ba71bff163A07DdD2b6847CefF49dD1e" + }, + "sepolia-wsteth-wei": { + "symbol": "wstETH", "decimals": 18, "name": "Wrapped liquid staked Ether 2.0", - "is_native": false, - "address": "ibc/CB610AD37E154A759FBBC7998C0543546DA9C16A8870A8B0211003D2F01AF3BD" + "is_native": true, + "address": "0xB82381A3fBD3FaFA77B3a7bE693342618240067b" + }, + "sepolia-weth-wei": { + "symbol": "WETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": true, + "address": "0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14" } }, - "odin": { + "evmos": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/035BDC396AA81E38271D2FA5E4799AE159044B90BCF02CCA218EB364829C869E" + "address": "ibc/720B52BDE1E2B84C5898D07C983B085C77EB5ED2D4C0ACD56B882A14777F750C" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/75C575824692FA642ED57B7B5CB1C11807E8B5D80027095DDA724DC98C6C018A" + "address": "ibc/7C2C1F14F3BD93792CCEDB76FDA5C1BB8F981F7C2C7308339BBCBA677224CA8F" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/E97CB9081D7EB7CAEAE022E448FDEF6D1D0781B63DA4112CAE50285594B2B32C" + "address": "ibc/8DE781194A674B7129D9EFA838F3E50B5F50212995AA825634BF702E0D037AC3" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/2991B858634D22E4637F772FA5A5F5BFCE3F30EA3ED208E36DD8DC07330490A9" + "address": "ibc/2B84B3D7B8AA4B04607ACD2E5096D20B34D6D355D33F4F5DD4659449EB757597" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/BB68A322BA69ED1661EA38363B6A6D06D27AD205896875E78EA225AAF3A65CA6" + "address": "ibc/F2D6753B652120212D09EE59075F0D820FCF580620DA8D3DE0349B614ED69A2B" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/A0D7A4D3545AAF4C23FE0C432503D3EFB13A796B852AEF9B1B92D39AD80BD471" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/11238441686A79C76DF0FE654527021E74DC7113CF84FADA03882FD53FFB5998" + "address": "ibc/8291F71592AEE7C593D5DC05C1B66CD190B2EEA74DF09D2B8BF57BF6C4E8BCAA" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/CF03353110E55C2E4D952D0DF4542AE8443CF5FA7023EB572B4A863DFB61EBA2" + "address": "ibc/4F89D2416F2E2CF9CFE68CE8B77A11A07B4F590B13E410DA86B1A5E6BCBDA24B" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/ACF3BF4CF6833720DE74885EDCBA5385DD40348DE726845745613295679C443D" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/68B7D936AAEB02366608C6E23E48776BCDF97C002B8B77FF79752393BBE5FFBF" } }, - "optimism": { + "fantom": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" + "address": "0x75Cc4fDf1ee3E781C1A3Ee9151D5c6Ce34Cf5C61" }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + "address": "0x66A5df72619982a2Ef49e8317079b6806d56f66B" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" + "address": "0xB17053aE763aCfD65A58e265aa9A4a59b25A7a87" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" + "address": "0x3C12d813bb36295A8361C4740A732Bb700df6Db0" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" + "address": "0x8776aDD48553518641a589C39792cc409d4C8B84" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", - "is_native": false, - "address": "0x594D8b81eC765410536ab59E98091700b99508D8" + "is_native": true, + "address": "0x812666209b90344Ec8e528375298ab9045c2Bd08" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "0x6Bf48cac8a850fA48b893f754AeD54A19a505A6F" + "address": "0x8DA729FC44366eFE36d522B865FeC34653e85F6e" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + "address": "0xD6f858A1E75e9a06c42dcd86BB876C5E9FccA572" }, - "wsteth-wei": { - "symbol": "axl-wstETH", - "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", "is_native": false, - "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" + "address": "0xf22949a6A1F4CCb12e0160Dc8C363EC6ED67C1bf" } }, - "osmosis-6": { + "fetch": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/6F34E1BD664C36CE49ACC28E60D62559A5F96C4F9A6CCE4FC5A67B2852E24CFE" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "ibc/9463E39D230614B313B487836D13A392BD1731928713D4C8427A083627048DB3" - }, - "celo-wei": { - "symbol": "axlCELO", - "decimals": 18, - "name": "Celo native asset", - "is_native": false, - "address": "ibc/FA09BFBC4469CF2026315EDA837C8B919174369418F3A5E3AF1EF63603A0B649" + "address": "ibc/56FBD5B47B58A7302F6BED46F8702907E3619F2DC23DCEA8D6685064D79394F8" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/29320BE25C3BF64A2355344625410899C1EB164038E328531C36095B0AA8BBFC" + "address": "ibc/0C9F12E54EEC1B60E247635ED3BBCC1BDDD39DCE3E94072A5D79DAA1293FC81B" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/2B5D096F5732F3BADBFB987FE42FDA24B3569514BC5DFDEA1BC042B223A0CED3" + "address": "ibc/14E4FD1AB72DE9BF1D6725CBA18373C406CB9A7DA17955299F3F4DC5C6131A4E" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/609C07B33C99E40A50498BDDECDD14D8BCC89D1A14D4E36053082AEA2E8D193D" + "address": "ibc/F992067A054C819B42D2DAB57F5CCE347D38352EB90453E59D566BFE64F1614B" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/055E7CBD9F1EF910CA7CA1DD293B39439CB33172F929194855DBAC6CB3081B95" + "address": "ibc/19E687E77D1AE3CADBB3DE487277AFEC0E340A84334D6ED3F216EF25A7075746" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, - "name": "Wrapped BNB", - "is_native": false, - "address": "ibc/55E995E3FD16C2C717A18D818A862E90A8414D1C7FCBA9B9349DB944275C98A3" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", + "name": "Wrapped BNB", "is_native": false, - "address": "ibc/6FD17B51C0358E1CED4F03885CF0822555B8EE7E99B5D0B6DEE0A4DBB646FFCF" + "address": "ibc/1319C6B38CA613C89D78C2D1461B305038B1085F6855E8CD276FE3F7C9600B4C" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/76C8C560FDE4EFE9F4AEFB0679E6D523CFF6A62BCD3F9541E8F6E3DA6831550E" + "address": "ibc/42ABF9E931A230BB249FE1F51F67C5E8C3D69FD756DB8D91D5DBED16170C2DF8" }, - "wsteth-wei": { - "symbol": "axl-wstETH", + "nftl-wei": { + "symbol": "NFTL", "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "name": "Nifty League", + "is_native": false, + "address": "ibc/0EC86DF2C1CA20CEF5F4FA72A356566D5F5D9F080FD55282D94BCCC177FCEB11" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", "is_native": false, - "address": "ibc/F24CE80D9167C162DB1D4A05C341A934204D996B77D2223AF9ECD376CA886F1D" + "address": "ibc/E944357653E98750D83BCD02956F39A8D63B12DBD8F52AF5B70B2846D61891F9" } }, - "persistence": { + "filecoin-2": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/8C275A830F26090ADDE3378B6E0680F1893E4E86B6908F3A4019161C6C78C736" + "address": "0xCb7996d51Ff923b2C6076d42C065a6ca000D32A1" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x68C07f87517F7300DdBC1793135362aFbfE65843" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/6D2941E457157854297D7DB338E754E3359581D70CD16A37911A1BAD82CFD1BD" + "address": "0xcCDF43cC00A2d88c3A9D7B0e0BeD39E9B899F723" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/82D92564637104908525F1C6EB78954C5B99C94CE208D88EE37126BD81893138" + "address": "0x08349ecC52e1Ba8351f2564117f3918BCbF90Ff0" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/09C3249B2D55421228D10E5C75BA4C06E5255C3CE4E773EF72AA128D404EACD4" + "address": "0x0497Cae18E666A7d9cC13715DB0b5c13CE04C177" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/41EDC197F5BBDEB4B2040EB2CFEAEBD612F1F51E42D936D42FC927FD83C8337C" + "address": "0xa82783a70de6a47Fa0f4d664D2998cB5D5C5291C" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/2839BD2A6E34FD4F4E73CF520C163615598312D94AB13D6088C3DA84E1833E69" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/71C4C2209A0868411FCB6A91CFBCF8EC8B4C9AE432FE3879B0038CD45324E847" + "address": "0x0797715C25C31022c710DEce62A17AAE91281567" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/836BE368D315B5F0B8D1DC4948183A4722D35247DB71EFB7B27EBB9A463508A5" + "address": "0x3bA33A79504d5A9C398e2C6f284b61F182739aC7" + }, + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", + "is_native": false, + "address": "0x72e3eC90781b8972C5f47ab0489940F89fC8AC49" } }, - "secret-snip-2": { + "haqq": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/EC221949F015457A8651216B2BF6C2059204F509200F3C66DB0738E976F30A89" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "ibc/C130A7E0C82A705ACE4EA785346B76939268B4DD085D5AAE5B51AD0AC46D23FC" + "address": "ibc/3D3E77333E4AAE1BCE0F03BEDA9A538166D113AF1B60EB1C35365D03506F07F4" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/3D73756D8F92FBD7A238FCE59561A69EA98F2D0A48FB9EE5A25246712B8A44BE" + "address": "ibc/9BE75CAB3126DA45896BBA7CC269199120F7E7B256E6EA07A57D20007042AD50" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/FEA664B9F4F91C910463B0E3DE8AA6B434F78C85456F2A14CD8AAD208D900C38" + "address": "ibc/C322C7D0867CC3EE6FA3495DC9685E5A0F49B506369341287FDA1E110841A950" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/A562DA85411D7F3394A3775CBB9A68016DA9C9EA4BB3485A48BEF4E2A42DAFEA" + "address": "ibc/0886E3462B7DD438353781848DBDF90E58BB7DE90266E3F95E41B3FA8ED1B453" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/E8A9C94509E014C05D67F17FA5D703D3A245FD373F05D07EC0E6DBF1EA04C2E2" + "address": "ibc/23B62EFD1B9444733889B42362570C774801430A1C656A0A3F8D6D69AE93ED8B" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/93B02E5D1129D137086F567BB2436BEEB694D7FF40EBE18A9EFF2375B05C3AF5" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/15CCA81AFFA1CA099B28EF61359C83EC9D9117D83AF12E08E05FA218C597E868" + "address": "ibc/3D4499D811B055223D0EFB06D2211F84772CAEF0FB987F71BAE716191714B391" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/7C5B5074D80173C552B57ED24E1344F8696FBD2A1461540F2FF873C433A11B0F" + "address": "ibc/C036FCFBF39952E97FE3D860C3926B1AA6DAB443C82F19142F5EE8925694E095" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/98AD7CD4FE565439082A0669AC1913012C14BD52817CA95B2D992E9F836FB39F" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/EBEB5A9AE60ECD42A6A5B26C4CBF83421BB95AC466BF4BBC9DE6C686AB0128CD" } }, - "sei-2": { + "impacthub": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/F188CCE5FBD070508295DA9772C250D71484A00FA816229CD9817DF81CFDA069" + "address": "ibc/D36138944A9A06A5361EB9F9713D2AAC8B9A9ED88AFC9960A0005C17C8A0B447" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/8AE8FE1B0D2B3742FB90C698ECF566248CC13BE70C10AC40E046B35457E4E6E4" + "address": "ibc/D236A44A8AB79841929225744AA3B4F7766E132654898E72B364FD8B1825FD70" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/6020C0719D983DAF4D6FBAB21A305D5D318DC76FDDD7062AEE8DC41BC3384CD5" + "address": "ibc/A64467480BBE4CCFC3CF7E25AD1446AA9BDBD4F5BCB9EF6038B83D6964C784E6" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/F935B69081D1E452C88F6AB87B34D354E1EE5E1EE0083EED1EF77D061EDEAB84" + "address": "ibc/004EBF085BBED1029326D56BE8A2E67C08CECE670A94AC1947DF413EF5130EB2" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/051697D58955FD06B4B25B4153B8F860DC06CB7B11E74A06EDF108E504DBF8B6" + "address": "ibc/E67ADA2204A941CD4743E70771BA08E24885E1ADD6FD140CE1F9E0FEBB68C6B2" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/FDF635D324EBEDEC14DE95770CEC1D57F1853D8FECD6B0899AEABD707C7F0896" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/E03BF4FBAC8F38113913E9B5BA09145743ED1AB875C78B7EB2E2B5828027547B" + "address": "ibc/DADB399E742FCEE71853E98225D13E44E90292852CD0033DF5CABAB96F80B833" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/AB8948A844DB07E8AF2CC90F1C6BCDB9C2BD14041A0D18A6E9B7FF2A4703050F" + "address": "ibc/1CA16CA6C642FD2C6105872B51C059A108D82072911274BAF2E63EC0827D5074" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/1A67ACDADED2406071763C442869FB07561B0E719F2BDC421F9D4D050D3DA68A" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/817400270DAC1F343C57BDE7753FC2E64F9FC863FC4E0D88876B13C7BCFBAFFD" } }, - "terra-3": { + "immutable": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/720B52BDE1E2B84C5898D07C983B085C77EB5ED2D4C0ACD56B882A14777F750C" + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" + } + }, + "kujira": { + "uausdc": { + "symbol": "aUSDC", + "decimals": 6, + "name": "USD coin", + "is_native": false, + "address": "ibc/F91EA2C0A23697A1048E08C2F787E3A58AC6F706A1CD2257A504925158CFC0F3" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/7C2C1F14F3BD93792CCEDB76FDA5C1BB8F981F7C2C7308339BBCBA677224CA8F" + "address": "ibc/CC8B40E3F3536D003C6ED7C65421067215453AECE1517A6F0935470C634A036B" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/8DE781194A674B7129D9EFA838F3E50B5F50212995AA825634BF702E0D037AC3" + "address": "ibc/91C6798C23EE6AD5B8336C247371546FFA0026854162612EA4EBC80C62A2841C" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/2B84B3D7B8AA4B04607ACD2E5096D20B34D6D355D33F4F5DD4659449EB757597" + "address": "ibc/C74D5A562B2D54AF03198E5BC6693D16EF978EBA0BD3BA22A7098511B43249CA" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/F2D6753B652120212D09EE59075F0D820FCF580620DA8D3DE0349B614ED69A2B" + "address": "ibc/C2BA0743260DDCD9B2E5464860584E2F0826E7C021E19B16A9F5CEF29D225CD3" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/8291F71592AEE7C593D5DC05C1B66CD190B2EEA74DF09D2B8BF57BF6C4E8BCAA" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/ECB83640D0E55A8A7E9A7C1515559BA1D1B8685575E609144C9F7BD5C9F301F9" + "address": "ibc/E09D271B56568F9C4E4B6A32D877F4E904C35FF3B8A4503AD8547A95F6D9925C" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/4F89D2416F2E2CF9CFE68CE8B77A11A07B4F590B13E410DA86B1A5E6BCBDA24B" + "address": "ibc/25C4852211900E04B162241362DB1F1D9B7939875A038913E56C9FEF66EA9AD6" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/B5CF863E268C257A747612B1955718A7437F4E814A78C52B42E3EB0113A11372" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/EC6967E1C9FBBC8C304AC00045665D8AEBA1730CC55824F1EB1EA826588542B6" } }, - "xpla": { + "linea": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/5BDD47E9E73BF91C14497E254F0A751F1A7D3A6084343F66EA7CEE834A384651" + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/B8FEE8FE30746C96641E48F94053D5D0BE99CCB5B98C58A0239B70F082E713EA" + "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/8BCD6BB5E8AD820584B798724B16398C413D7B7C475E1B676DEC223FCD32F7E5" + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/6771714762A6F8F541DE7C461F09C68F310621315FA70C70799F66A0DE6B95D2" + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/9B50579E4AE3CF7B1705F04A4C715EE4E859F03620F0DE560C67CBB9B9A239A2" + "address": "0x594D8b81eC765410536ab59E98091700b99508D8" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/FEC1C247382FE8A2E67AC699D8AADC01AD1DE04A860D85A2C68BF5BFCB7D8468" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/42A6CC4488E8E9A41C8EA5F05916639F8DD369688225A676CDD0C82F357CCEE9" + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/9790D25467E96C073CC3701C5BF9B74009955604859C7A31C6EE2F673EF67A3C" + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + }, + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", + "is_native": false, + "address": "0x08b7bC06e46C0cc11f29e1a6fc3d6e19965174bC" } }, - "arbitrum": { + "mantle": { "uausdc": { "symbol": "aUSDC", "decimals": 6, @@ -8603,7 +12501,7 @@ "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, @@ -8642,13 +12540,6 @@ "is_native": false, "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "0x6Bf48cac8a850fA48b893f754AeD54A19a505A6F" - }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, @@ -8656,630 +12547,663 @@ "is_native": false, "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" }, - "wsteth-wei": { - "symbol": "axl-wstETH", - "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", - "is_native": false, - "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" - } - }, - "aurora": { - "uausdc": { - "symbol": "aUSDC", - "decimals": 6, - "name": "USD coin", - "is_native": false, - "address": "0xFfB4749710EC6286b3A0dC2F24165DA622dA2ff5" - }, - "uaxl": { - "symbol": "AXL", + "uxion": { + "symbol": "XION", "decimals": 6, - "name": null, + "name": "Xion", "is_native": false, - "address": "0x1AA14c03783e3C31b14615a83a58E1eAF98Bf596" + "address": "0x08b7bC06e46C0cc11f29e1a6fc3d6e19965174bC" } }, - "avalanche": { + "moonbeam": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0x57F1c63497AEe0bE305B8852b354CEc793da43bB" + "address": "0xD1633F7Fb3d716643125d6415d4177bC36b7186b" }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "0xa8B51e6517f9A6Ab7b247bF10b71b1A738eD8E50" + "address": "0xB4D56B6AD4DD2B48e68D2a26C25A04dC1c0eE393" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0xe840BE8D9aB1ACD5AfC7168b05EC350B7FD18709" + "address": "0x4faB8Ad67eF3173501c512B9367f0B0f62287fE7" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0xB923E2374639D0605388D91CFedAfCeCE03Cfd8f" + "address": "0xde3dB4FD7D7A5Cc7D8811b7BaFA4103FD90282f3" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", - "is_native": true, - "address": "0xd00ae08403B9bbb9124bB305C09058E32C39A48c" + "is_native": false, + "address": "0x64aae6319934995Bf30e67EBBBA9750256E07283" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0xeF721BaBf08A2eE5BCcfd2f2A34CbF4Dc9A56959" + "address": "0x40EebD34eC6CB4C0644a18494365171b1dcE97eb" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0xd020f566723e8402f925A891605c02ce7AF2477F" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "0xf925964646CFaB2d8e8Df572158b5277a398C954" + "address": "0x8d0BBbA567Ae73a06A8678e53Dc7ADD0AF6b7039" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", + "is_native": true, + "address": "0x1436aE0dF0A8663F18c0Ec51d7e2E46591730715" + }, + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", "is_native": false, - "address": "0xF58537d9061f7257e44442Fb7870A094AAE92B43" + "address": "0xeaCd938E14969900e5b364775c7d594B320c3b66" } }, - "binance": { + "neutron": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0xc2fA98faB811B785b81c64Ac875b31CC9E40F9D2" + "address": "ibc/F91EA2C0A23697A1048E08C2F787E3A58AC6F706A1CD2257A504925158CFC0F3" }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "0xfC3B4feb754d8082F745940347600D373f03dcaC" + "address": "ibc/CB610AD37E154A759FBBC7998C0543546DA9C16A8870A8B0211003D2F01AF3BD" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0x409A57A5Ee1F37FB58b3A3eB9717398F328da1eD" + "address": "ibc/CC8B40E3F3536D003C6ED7C65421067215453AECE1517A6F0935470C634A036B" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x920fA0DbB65cE928C29103AeC7B5c188bbea2f24" + "address": "ibc/91C6798C23EE6AD5B8336C247371546FFA0026854162612EA4EBC80C62A2841C" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0x1B29EC62efC689c462b4E0512457175793cEc9e6" + "address": "ibc/C74D5A562B2D54AF03198E5BC6693D16EF978EBA0BD3BA22A7098511B43249CA" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0x90dEcD89a744a0CFbB3cc8DE08A5f3B14875B6C4" + "address": "ibc/C2BA0743260DDCD9B2E5464860584E2F0826E7C021E19B16A9F5CEF29D225CD3" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", + "is_native": false, + "address": "ibc/E09D271B56568F9C4E4B6A32D877F4E904C35FF3B8A4503AD8547A95F6D9925C" + }, + "wdev-wei": { + "symbol": "WDEV", + "decimals": 18, + "name": "Wrapped DEV", + "is_native": false, + "address": "ibc/25C4852211900E04B162241362DB1F1D9B7939875A038913E56C9FEF66EA9AD6" + }, + "untrn": { + "symbol": "NTRN", + "decimals": 6, + "name": "Axelar Wrapped NTRN", "is_native": true, - "address": "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd" + "address": "untrn" }, - "wfil-wei": { - "symbol": "WFIL", + "nftl-wei": { + "symbol": "NFTL", "decimals": 18, - "name": "Wrapped FIL", + "name": "Nifty League", "is_native": false, - "address": "0x1E66eE00AD4B230bC24Ec303F1e342F4568237E9" + "address": "ibc/B5CF863E268C257A747612B1955718A7437F4E814A78C52B42E3EB0113A11372" }, - "wdev-wei": { - "symbol": "WDEV", + "sepolia-wsteth-wei": { + "symbol": "wstETH", "decimals": 18, - "name": "Wrapped DEV", + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "0xa893Fd868c3159B294f6416F512203be53315fd8" + "address": "ibc/0EC52CCE352772D3AF4230BBB0C1EBDC8581F0A80076E6C57841F2119BB43E95" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/EC6967E1C9FBBC8C304AC00045665D8AEBA1730CC55824F1EB1EA826588542B6" } }, - "celo": { + "nibiru": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" - }, - "celo-wei": { - "symbol": "CELO", - "decimals": 18, - "name": "Celo native asset", - "is_native": true, - "address": "0xF194afDf50B03e69Bd7D057c1Aa9e10c9954E4C9" + "address": "ibc/4BDF2D63B8FFE3454AF30E9BC10D2D7979BD3A938D989889ABC94FC5B86F1E2D" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" + "address": "ibc/13F73121EEA6CAA0DF51B06F64C39FD55EF394C64223881569DFA5628FA1288D" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" + "address": "ibc/7BFC5893BCCC6C9A4B173BC1183D2706141CBF71679EA6BDCE15E679CEC05183" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" + "address": "ibc/78D5DAB545549A930F5DB22CFA7C821ACE8EF55DCF787BED93A56D04CC7477F5" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0x594D8b81eC765410536ab59E98091700b99508D8" + "address": "ibc/301A96A9BB897EF914BA74534EE1D75417753A0E113F2F766838274057290B79" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "0x6Bf48cac8a850fA48b893f754AeD54A19a505A6F" + "address": "ibc/52F7DAC8D338E4D7388D02EBD6E522B86EBB62A48C6732C2651423A9E79377DE" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + "address": "ibc/6A4043BCBD3FB6E9D86A14F6A018C33CD4E05990E977729CC1946395B2972B11" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/1ABFEF83A0A3F29490D029D97773AE3D3B3A446C2001E791E8B9EBA0B7E47E05" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/F5697D50A2DB33983439166EEC41C24BD61EE53975E72799F37E7C83B8F75BB5" } }, - "ethereum-2": { + "odin": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + "address": "ibc/035BDC396AA81E38271D2FA5E4799AE159044B90BCF02CCA218EB364829C869E" }, "eth-wei": { - "symbol": "WETH", + "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", - "is_native": true, - "address": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6" + "is_native": false, + "address": "ibc/75C575824692FA642ED57B7B5CB1C11807E8B5D80027095DDA724DC98C6C018A" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" + "address": "ibc/E97CB9081D7EB7CAEAE022E448FDEF6D1D0781B63DA4112CAE50285594B2B32C" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" + "address": "ibc/2991B858634D22E4637F772FA5A5F5BFCE3F30EA3ED208E36DD8DC07330490A9" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0x594D8b81eC765410536ab59E98091700b99508D8" + "address": "ibc/BB68A322BA69ED1661EA38363B6A6D06D27AD205896875E78EA225AAF3A65CA6" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "0x6Bf48cac8a850fA48b893f754AeD54A19a505A6F" + "address": "ibc/A0D7A4D3545AAF4C23FE0C432503D3EFB13A796B852AEF9B1B92D39AD80BD471" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + "address": "ibc/CF03353110E55C2E4D952D0DF4542AE8443CF5FA7023EB572B4A863DFB61EBA2" }, - "wsteth-wei": { - "symbol": "wstETH", + "nftl-wei": { + "symbol": "NFTL", "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", - "is_native": true, - "address": "0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f" + "name": "Nifty League", + "is_native": false, + "address": "ibc/9F090915A735E382A455C7E7B6B495501DD1D033D7F9A2A9813F548294E7FD93" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/2E81BD542D44C7D3C1E5E03483E6A4C33419BF6A73B90984C5DAA438AE83556B" } }, - "fantom": { + "ojo": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0x75Cc4fDf1ee3E781C1A3Ee9151D5c6Ce34Cf5C61" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x66A5df72619982a2Ef49e8317079b6806d56f66B" + "address": "ibc/4BDF2D63B8FFE3454AF30E9BC10D2D7979BD3A938D989889ABC94FC5B86F1E2D" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0xB17053aE763aCfD65A58e265aa9A4a59b25A7a87" + "address": "ibc/13F73121EEA6CAA0DF51B06F64C39FD55EF394C64223881569DFA5628FA1288D" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x3C12d813bb36295A8361C4740A732Bb700df6Db0" + "address": "ibc/7BFC5893BCCC6C9A4B173BC1183D2706141CBF71679EA6BDCE15E679CEC05183" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0x8776aDD48553518641a589C39792cc409d4C8B84" + "address": "ibc/78D5DAB545549A930F5DB22CFA7C821ACE8EF55DCF787BED93A56D04CC7477F5" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", - "is_native": true, - "address": "0x812666209b90344Ec8e528375298ab9045c2Bd08" + "is_native": false, + "address": "ibc/301A96A9BB897EF914BA74534EE1D75417753A0E113F2F766838274057290B79" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x8DA729FC44366eFE36d522B865FeC34653e85F6e" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "0x5d68f6DeA308211f1Fd16166Dfd530f323538A1D" + "address": "ibc/52F7DAC8D338E4D7388D02EBD6E522B86EBB62A48C6732C2651423A9E79377DE" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0xD6f858A1E75e9a06c42dcd86BB876C5E9FccA572" + "address": "ibc/6A4043BCBD3FB6E9D86A14F6A018C33CD4E05990E977729CC1946395B2972B11" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/1ABFEF83A0A3F29490D029D97773AE3D3B3A446C2001E791E8B9EBA0B7E47E05" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/F5697D50A2DB33983439166EEC41C24BD61EE53975E72799F37E7C83B8F75BB5" } }, - "kava": { + "optimism": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0xAa03872057AD496Bd6f3eE85b85e1e4DABdb1a5d" + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "0xA3A2b6F3b34F513BA0084D504E8a6162bd7C7EE6" + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + }, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0x3F8a312113ED10833F27bbC1ee08A8cDB4df16B4" + "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x5e372F445C6afc91Aaca0d6C0Fa170d5f8F30f49" + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0xf3280d7a127Bb743918040fB99108728388e3c9e" + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0xd7ba4DE2d9cDF1D34D0aE608F3725Aed1A32821E" + "address": "0x594D8b81eC765410536ab59E98091700b99508D8" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x500c333DC86813F930299a68B990F57D1ca6e243" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "0x13B83b6D03A23BCB2A24f09a9D311fF3b6078bBE" + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0xe9a3a0E5C9cFed51E1D60d57e10DeE4478415e52" + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + }, + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", + "is_native": false, + "address": "0x08b7bC06e46C0cc11f29e1a6fc3d6e19965174bC" } }, - "moonbeam": { + "osmosis-7": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0xD1633F7Fb3d716643125d6415d4177bC36b7186b" + "address": "ibc/1587E7B54FC9EFDA2350DC690EC2F9B9ECEB6FC31CF11884F9C0C5207ABE3921" }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "0xB4D56B6AD4DD2B48e68D2a26C25A04dC1c0eE393" + "address": "ibc/44E584C7B0EBEE2D268ABE24AE408825A60E55AC08C5E97D94497741B26C9654" + }, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "ibc/7F129FB502171BDD3CAA1E81D1B540083115634BC6C467A454C2ECB541105448" + }, + "celo-wei": { + "symbol": "axlCELO", + "decimals": 18, + "name": "Celo native asset", + "is_native": false, + "address": "ibc/729CEA0820B0B5E581D45FDE9C9289C0BEA1433FC9F5D7D64BD555A575D48BEA" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0x4faB8Ad67eF3173501c512B9367f0B0f62287fE7" + "address": "ibc/2CFA055AF589184D8875D15DED01A9777A097B14EE420F541BDF7F10274959F4" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0xde3dB4FD7D7A5Cc7D8811b7BaFA4103FD90282f3" + "address": "ibc/BBB55EA097A0EDF27EE323BF922C84536E6B1805BE764E24DB59B70802E748B6" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0x64aae6319934995Bf30e67EBBBA9750256E07283" + "address": "ibc/7D4154153936FD83E044899228DD5D166DF07FFCEFD898670B14725D0552130C" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0x40EebD34eC6CB4C0644a18494365171b1dcE97eb" + "address": "ibc/CC9C83FD1F5AFDA4A5F32AE911B36D7204483A541C76F32EC759CCE54016B636" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x8d0BBbA567Ae73a06A8678e53Dc7ADD0AF6b7039" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "0xc1D15Ac584AAC606813D404be35e66c36bc6F7a8" + "address": "ibc/7B5335E2A8FEDFBC7C8A0719D14F09D4F08F52FE4C3D22A48D11A7D37B26EBA7" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", - "is_native": true, - "address": "0x1436aE0dF0A8663F18c0Ec51d7e2E46591730715" + "is_native": false, + "address": "ibc/4D186FF90D7F5F2D1025EE76BE0A90ACAC0E22538F31630B1EFDC77285568B90" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/DC48B21DCA767F4CEF44C03A7656DDCD92B2508CA7BFA6755C2DAF241359815C" + }, + "sepolia-wsteth-wei": { + "symbol": "wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "ibc/B8062BC152E782256ACE5233C705138C097C66E3903CC9577F7405A17052BB47" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/235D29A649115E16617B79225592BFA290274CB45AD35AC7D0DC5DF53D3EDA8B" } }, - "polygon": { + "persistence": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0x2c852e740B62308c46DD29B982FBb650D063Bd07" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x9c79782d2B13CAC0Fa2FB00D188104fe6f98E533" + "address": "ibc/8C275A830F26090ADDE3378B6E0680F1893E4E86B6908F3A4019161C6C78C736" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0x786D82A436EA836A8669919D605FfeaEFa51744e" + "address": "ibc/6D2941E457157854297D7DB338E754E3359581D70CD16A37911A1BAD82CFD1BD" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", - "is_native": true, - "address": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889" + "is_native": false, + "address": "ibc/82D92564637104908525F1C6EB78954C5B99C94CE208D88EE37126BD81893138" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0x6DD60c05FdA1255A44Ffaa9A8200b5b179A578D6" + "address": "ibc/09C3249B2D55421228D10E5C75BA4C06E5255C3CE4E773EF72AA128D404EACD4" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0x62b6F2A4eE6a4801bfcD2056d19c6d71654D2582" + "address": "ibc/41EDC197F5BBDEB4B2040EB2CFEAEBD612F1F51E42D936D42FC927FD83C8337C" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x55fDE07dEF3261a41fC59B783D27A6357e8A86Df" + "address": "ibc/2839BD2A6E34FD4F4E73CF520C163615598312D94AB13D6088C3DA84E1833E69" }, - "wfil-wei": { - "symbol": "WFIL", + "wdev-wei": { + "symbol": "WDEV", "decimals": 18, - "name": "Wrapped FIL", + "name": "Wrapped DEV", "is_native": false, - "address": "0x50bd8f2a19E23e2d27d7C7f3016De4668AF63d9d" + "address": "ibc/836BE368D315B5F0B8D1DC4948183A4722D35247DB71EFB7B27EBB9A463508A5" }, - "wdev-wei": { - "symbol": "WDEV", + "nftl-wei": { + "symbol": "NFTL", "decimals": 18, - "name": "Wrapped DEV", + "name": "Nifty League", "is_native": false, - "address": "0xb6a2f51C219A66866263Cb18DD41EE6C51B464cB" + "address": "ibc/F1CB5E4B35526415010055DD563A2859D941B1CC8FB9DFD1882DCF9FB05753A0" }, - "wsteth-wei": { - "symbol": "axl-wstETH", + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", "decimals": 18, - "name": "Wrapped liquid staked Ether 2.0", + "name": "Wrapped Ether", "is_native": false, - "address": "0xb48D2ce84900ff4dFFaf53CbE5ea8Ec6195cb67b" + "address": "ibc/9D35CBE9B11C0423232CFB2B977E5AD1CD52F0CB203CA29F32D5D178F0359CBE" } }, - "impacthub": { + "polygon": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/D36138944A9A06A5361EB9F9713D2AAC8B9A9ED88AFC9960A0005C17C8A0B447" + "address": "0x2c852e740B62308c46DD29B982FBb650D063Bd07" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x9c79782d2B13CAC0Fa2FB00D188104fe6f98E533" + }, + "wsteth-wei": { + "symbol": "axl-wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "0xb48D2ce84900ff4dFFaf53CbE5ea8Ec6195cb67b" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/D236A44A8AB79841929225744AA3B4F7766E132654898E72B364FD8B1825FD70" + "address": "0x786D82A436EA836A8669919D605FfeaEFa51744e" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", - "is_native": false, - "address": "ibc/A64467480BBE4CCFC3CF7E25AD1446AA9BDBD4F5BCB9EF6038B83D6964C784E6" + "is_native": true, + "address": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/004EBF085BBED1029326D56BE8A2E67C08CECE670A94AC1947DF413EF5130EB2" + "address": "0x6DD60c05FdA1255A44Ffaa9A8200b5b179A578D6" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/E67ADA2204A941CD4743E70771BA08E24885E1ADD6FD140CE1F9E0FEBB68C6B2" + "address": "0x62b6F2A4eE6a4801bfcD2056d19c6d71654D2582" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/DADB399E742FCEE71853E98225D13E44E90292852CD0033DF5CABAB96F80B833" - }, - "wfil-wei": { - "symbol": "WFIL", - "decimals": 18, - "name": "Wrapped FIL", - "is_native": false, - "address": "ibc/12B075C6C552060240E92A4A215CAF4DB0F1CA98F90897AB30282B9A15842595" + "address": "0x55fDE07dEF3261a41fC59B783D27A6357e8A86Df" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/1CA16CA6C642FD2C6105872B51C059A108D82072911274BAF2E63EC0827D5074" + "address": "0xb6a2f51C219A66866263Cb18DD41EE6C51B464cB" + }, + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", + "is_native": false, + "address": "0x08CFb75e4716e864449C57f6d16e1a2e9f5F713f" } }, - "filecoin-2": { + "polygon-zkevm": { "uausdc": { "symbol": "aUSDC", "decimals": 6, @@ -9290,7 +13214,7 @@ "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, "address": "0x68C07f87517F7300DdBC1793135362aFbfE65843" }, @@ -9337,1468 +13261,1625 @@ "address": "0x3bA33A79504d5A9C398e2C6f284b61F182739aC7" } }, - "polygon-zkevm": { + "saga": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0xCb7996d51Ff923b2C6076d42C065a6ca000D32A1" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x68C07f87517F7300DdBC1793135362aFbfE65843" + "address": "ibc/D36138944A9A06A5361EB9F9713D2AAC8B9A9ED88AFC9960A0005C17C8A0B447" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0xcCDF43cC00A2d88c3A9D7B0e0BeD39E9B899F723" + "address": "ibc/D236A44A8AB79841929225744AA3B4F7766E132654898E72B364FD8B1825FD70" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x08349ecC52e1Ba8351f2564117f3918BCbF90Ff0" + "address": "ibc/A64467480BBE4CCFC3CF7E25AD1446AA9BDBD4F5BCB9EF6038B83D6964C784E6" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0x0497Cae18E666A7d9cC13715DB0b5c13CE04C177" + "address": "ibc/004EBF085BBED1029326D56BE8A2E67C08CECE670A94AC1947DF413EF5130EB2" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0xa82783a70de6a47Fa0f4d664D2998cB5D5C5291C" + "address": "ibc/E67ADA2204A941CD4743E70771BA08E24885E1ADD6FD140CE1F9E0FEBB68C6B2" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x0797715C25C31022c710DEce62A17AAE91281567" + "address": "ibc/DADB399E742FCEE71853E98225D13E44E90292852CD0033DF5CABAB96F80B833" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x3bA33A79504d5A9C398e2C6f284b61F182739aC7" + "address": "ibc/1CA16CA6C642FD2C6105872B51C059A108D82072911274BAF2E63EC0827D5074" + }, + "utsaga": { + "symbol": "TSAGA", + "decimals": 6, + "name": "Axelar Wrapped TSAGA", + "is_native": true, + "address": "utsaga" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/1A67ACDADED2406071763C442869FB07561B0E719F2BDC421F9D4D050D3DA68A" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/817400270DAC1F343C57BDE7753FC2E64F9FC863FC4E0D88876B13C7BCFBAFFD" } }, - "burnt-2": { + "scroll": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/035BDC396AA81E38271D2FA5E4799AE159044B90BCF02CCA218EB364829C869E" + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/75C575824692FA642ED57B7B5CB1C11807E8B5D80027095DDA724DC98C6C018A" + "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/E97CB9081D7EB7CAEAE022E448FDEF6D1D0781B63DA4112CAE50285594B2B32C" + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/2991B858634D22E4637F772FA5A5F5BFCE3F30EA3ED208E36DD8DC07330490A9" + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/BB68A322BA69ED1661EA38363B6A6D06D27AD205896875E78EA225AAF3A65CA6" + "address": "0x594D8b81eC765410536ab59E98091700b99508D8" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/A0D7A4D3545AAF4C23FE0C432503D3EFB13A796B852AEF9B1B92D39AD80BD471" + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/CF03353110E55C2E4D952D0DF4542AE8443CF5FA7023EB572B4A863DFB61EBA2" + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + }, + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", + "is_native": false, + "address": "0x08b7bC06e46C0cc11f29e1a6fc3d6e19965174bC" } }, - "teritori": { + "secret": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/C4046F3A4AA6127655A47764D5CAED8F4B4A0122661801B0AC3CCD1113DA2B5F" + "address": "ibc/6F34E1BD664C36CE49ACC28E60D62559A5F96C4F9A6CCE4FC5A67B2852E24CFE" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "ibc/9463E39D230614B313B487836D13A392BD1731928713D4C8427A083627048DB3" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/1184A13CDB18E5C31B8FE2E749AF6414FA128A3E0C8B7B88611A869F577A67CB" + "address": "ibc/29320BE25C3BF64A2355344625410899C1EB164038E328531C36095B0AA8BBFC" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/2B7CBCD839F156E607AF97DF4696D8DA18B706AF847B43A04DEE06066BC18524" + "address": "ibc/2B5D096F5732F3BADBFB987FE42FDA24B3569514BC5DFDEA1BC042B223A0CED3" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/9469AD908C58A8E5307F2CEC12E449DD4C393CCD01F62D38B05840AB93668212" + "address": "ibc/609C07B33C99E40A50498BDDECDD14D8BCC89D1A14D4E36053082AEA2E8D193D" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/B18F7DEB4D9CCADAC3F2CA78903A289B3F02F0A2D28882741B38F9D49E89E171" + "address": "ibc/055E7CBD9F1EF910CA7CA1DD293B39439CB33172F929194855DBAC6CB3081B95" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/8AFA21187F4D6637FDCD71C1CF622572848100BFF419B6A754271659DD3FB3C2" + "address": "ibc/55E995E3FD16C2C717A18D818A862E90A8414D1C7FCBA9B9349DB944275C98A3" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/4F16908C007312B4B6324E22E6AF1C0D7FCC611FBBB714B0DC20C1307989DB53" + "address": "ibc/76C8C560FDE4EFE9F4AEFB0679E6D523CFF6A62BCD3F9541E8F6E3DA6831550E" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/F275F32257587EA449D89966B76F93458092C0C4CF08004AD0189C134DBB499A" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/4919DE40A784F357502DD6DD3334FCAD5D98E4C29E343DE0948D167E227113B4" } }, - "mantle": { + "secret-snip-3": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + "address": "ibc/86E8410215D13DC44C7E783AFDF948E3E7DBC07F2E993CA9E27C77EABA3339C9" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" + "address": "ibc/E487CC4EE4736A0208B2C7F575EF28DD350B3BDABC50B2F5FFB194CADCF855B6" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" + "address": "ibc/E059BF4BC1132FF2147230B9255530943C4FAEFA5980B17C91CCF12F7BD17CC7" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" + "address": "ibc/4685A90948646A65E16C9202A90C779B9C07954CF9ADB0B13432134EE523FA32" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0x594D8b81eC765410536ab59E98091700b99508D8" + "address": "ibc/E0EDAC5CB0FEB719A126A117724F4DD37428ED05A9F37068B1C116D0D2196192" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" + "address": "ibc/87779EC5798D1164DF206FAB21139CC43F5D9AFA8AC7BEB9672E7E3DAE81D40D" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" - } - }, - "centrifuge": { - "wftm-wei": { - "symbol": "WFTM", + "address": "ibc/70B75792DDBADFF3EB6372753808E5B1C23897B4BDED20A458EBFC1F7962DAA6" + }, + "nftl-wei": { + "symbol": "NFTL", "decimals": 18, - "name": "Wrapped FTM", + "name": "Nifty League", "is_native": false, - "address": "0x594D8b81eC765410536ab59E98091700b99508D8" + "address": "ibc/E7F0B35981419FFB29F8D904C85498127F60FE24081FCE157059DFAAF9A759DF" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/9D181E83907857C1AF3A49D4B5D97A3FC0588CEA4F378B14E36A241BF9690356" } }, - "haqq": { + "sei-2": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/3D3E77333E4AAE1BCE0F03BEDA9A538166D113AF1B60EB1C35365D03506F07F4" + "address": "ibc/F188CCE5FBD070508295DA9772C250D71484A00FA816229CD9817DF81CFDA069" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/9BE75CAB3126DA45896BBA7CC269199120F7E7B256E6EA07A57D20007042AD50" + "address": "ibc/8AE8FE1B0D2B3742FB90C698ECF566248CC13BE70C10AC40E046B35457E4E6E4" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/C322C7D0867CC3EE6FA3495DC9685E5A0F49B506369341287FDA1E110841A950" + "address": "ibc/6020C0719D983DAF4D6FBAB21A305D5D318DC76FDDD7062AEE8DC41BC3384CD5" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/0886E3462B7DD438353781848DBDF90E58BB7DE90266E3F95E41B3FA8ED1B453" + "address": "ibc/F935B69081D1E452C88F6AB87B34D354E1EE5E1EE0083EED1EF77D061EDEAB84" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/23B62EFD1B9444733889B42362570C774801430A1C656A0A3F8D6D69AE93ED8B" + "address": "ibc/051697D58955FD06B4B25B4153B8F860DC06CB7B11E74A06EDF108E504DBF8B6" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/3D4499D811B055223D0EFB06D2211F84772CAEF0FB987F71BAE716191714B391" + "address": "ibc/FDF635D324EBEDEC14DE95770CEC1D57F1853D8FECD6B0899AEABD707C7F0896" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/C036FCFBF39952E97FE3D860C3926B1AA6DAB443C82F19142F5EE8925694E095" + "address": "ibc/AB8948A844DB07E8AF2CC90F1C6BCDB9C2BD14041A0D18A6E9B7FF2A4703050F" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/D248105D0DB9EECA11CE2500CA1C01BDC9571C96AADD64692AC887C632CCF3A7" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/FD5EDA6954DD7FEBA713CD6A90A173013D011038E3695FE901A7E5C291114A39" } }, - "secret-snip-3": { + "teritori-2": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/86E8410215D13DC44C7E783AFDF948E3E7DBC07F2E993CA9E27C77EABA3339C9" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "ibc/291E318390A85C44474303FB27D8DBD5FB1EE9EADF0C9A5C07E6C5FC85C7E9BE" + "address": "ibc/5BDD47E9E73BF91C14497E254F0A751F1A7D3A6084343F66EA7CEE834A384651" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/E487CC4EE4736A0208B2C7F575EF28DD350B3BDABC50B2F5FFB194CADCF855B6" + "address": "ibc/B8FEE8FE30746C96641E48F94053D5D0BE99CCB5B98C58A0239B70F082E713EA" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/E059BF4BC1132FF2147230B9255530943C4FAEFA5980B17C91CCF12F7BD17CC7" + "address": "ibc/8BCD6BB5E8AD820584B798724B16398C413D7B7C475E1B676DEC223FCD32F7E5" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/4685A90948646A65E16C9202A90C779B9C07954CF9ADB0B13432134EE523FA32" + "address": "ibc/6771714762A6F8F541DE7C461F09C68F310621315FA70C70799F66A0DE6B95D2" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/E0EDAC5CB0FEB719A126A117724F4DD37428ED05A9F37068B1C116D0D2196192" + "address": "ibc/9B50579E4AE3CF7B1705F04A4C715EE4E859F03620F0DE560C67CBB9B9A239A2" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/87779EC5798D1164DF206FAB21139CC43F5D9AFA8AC7BEB9672E7E3DAE81D40D" + "address": "ibc/FEC1C247382FE8A2E67AC699D8AADC01AD1DE04A860D85A2C68BF5BFCB7D8468" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/70B75792DDBADFF3EB6372753808E5B1C23897B4BDED20A458EBFC1F7962DAA6" + "address": "ibc/9790D25467E96C073CC3701C5BF9B74009955604859C7A31C6EE2F673EF67A3C" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/D36FDC1790A9928516FE0FD4512D20124652A809D3B63F8590307C51ABA31FFA" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/D10BA03DAB722234AEC3D719C8CFD72114B2FCAD6158E9A5F26762520AFEEF69" } }, - "scroll": { + "terra-3": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + "address": "ibc/720B52BDE1E2B84C5898D07C983B085C77EB5ED2D4C0ACD56B882A14777F750C" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" + "address": "ibc/7C2C1F14F3BD93792CCEDB76FDA5C1BB8F981F7C2C7308339BBCBA677224CA8F" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" + "address": "ibc/8DE781194A674B7129D9EFA838F3E50B5F50212995AA825634BF702E0D037AC3" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" + "address": "ibc/2B84B3D7B8AA4B04607ACD2E5096D20B34D6D355D33F4F5DD4659449EB757597" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0x594D8b81eC765410536ab59E98091700b99508D8" + "address": "ibc/F2D6753B652120212D09EE59075F0D820FCF580620DA8D3DE0349B614ED69A2B" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" + "address": "ibc/8291F71592AEE7C593D5DC05C1B66CD190B2EEA74DF09D2B8BF57BF6C4E8BCAA" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + "address": "ibc/4F89D2416F2E2CF9CFE68CE8B77A11A07B4F590B13E410DA86B1A5E6BCBDA24B" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/ACF3BF4CF6833720DE74885EDCBA5385DD40348DE726845745613295679C443D" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/68B7D936AAEB02366608C6E23E48776BCDF97C002B8B77FF79752393BBE5FFBF" } }, - "secret": { + "xpla": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/6F34E1BD664C36CE49ACC28E60D62559A5F96C4F9A6CCE4FC5A67B2852E24CFE" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "ibc/9463E39D230614B313B487836D13A392BD1731928713D4C8427A083627048DB3" + "address": "ibc/5BDD47E9E73BF91C14497E254F0A751F1A7D3A6084343F66EA7CEE834A384651" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/29320BE25C3BF64A2355344625410899C1EB164038E328531C36095B0AA8BBFC" + "address": "ibc/B8FEE8FE30746C96641E48F94053D5D0BE99CCB5B98C58A0239B70F082E713EA" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/2B5D096F5732F3BADBFB987FE42FDA24B3569514BC5DFDEA1BC042B223A0CED3" + "address": "ibc/8BCD6BB5E8AD820584B798724B16398C413D7B7C475E1B676DEC223FCD32F7E5" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/609C07B33C99E40A50498BDDECDD14D8BCC89D1A14D4E36053082AEA2E8D193D" + "address": "ibc/6771714762A6F8F541DE7C461F09C68F310621315FA70C70799F66A0DE6B95D2" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/055E7CBD9F1EF910CA7CA1DD293B39439CB33172F929194855DBAC6CB3081B95" + "address": "ibc/9B50579E4AE3CF7B1705F04A4C715EE4E859F03620F0DE560C67CBB9B9A239A2" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/55E995E3FD16C2C717A18D818A862E90A8414D1C7FCBA9B9349DB944275C98A3" + "address": "ibc/FEC1C247382FE8A2E67AC699D8AADC01AD1DE04A860D85A2C68BF5BFCB7D8468" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/76C8C560FDE4EFE9F4AEFB0679E6D523CFF6A62BCD3F9541E8F6E3DA6831550E" + "address": "ibc/9790D25467E96C073CC3701C5BF9B74009955604859C7A31C6EE2F673EF67A3C" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/D36FDC1790A9928516FE0FD4512D20124652A809D3B63F8590307C51ABA31FFA" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/D10BA03DAB722234AEC3D719C8CFD72114B2FCAD6158E9A5F26762520AFEEF69" } }, - "osmosis-7": { + "arbitrum": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/1587E7B54FC9EFDA2350DC690EC2F9B9ECEB6FC31CF11884F9C0C5207ABE3921" + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "ibc/44E584C7B0EBEE2D268ABE24AE408825A60E55AC08C5E97D94497741B26C9654" + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, "wsteth-wei": { "symbol": "axl-wstETH", "decimals": 18, "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "ibc/7F129FB502171BDD3CAA1E81D1B540083115634BC6C467A454C2ECB541105448" - }, - "celo-wei": { - "symbol": "axlCELO", - "decimals": 18, - "name": "Celo native asset", - "is_native": false, - "address": "ibc/729CEA0820B0B5E581D45FDE9C9289C0BEA1433FC9F5D7D64BD555A575D48BEA" + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/2CFA055AF589184D8875D15DED01A9777A097B14EE420F541BDF7F10274959F4" + "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/BBB55EA097A0EDF27EE323BF922C84536E6B1805BE764E24DB59B70802E748B6" + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/7D4154153936FD83E044899228DD5D166DF07FFCEFD898670B14725D0552130C" + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/CC9C83FD1F5AFDA4A5F32AE911B36D7204483A541C76F32EC759CCE54016B636" + "address": "0x594D8b81eC765410536ab59E98091700b99508D8" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/7B5335E2A8FEDFBC7C8A0719D14F09D4F08F52FE4C3D22A48D11A7D37B26EBA7" + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/4D186FF90D7F5F2D1025EE76BE0A90ACAC0E22538F31630B1EFDC77285568B90" + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" } }, - "provenance": { + "celo": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/F53E48CE45EF24BD633402397B0013E02013E9ABD420FEAB905EAF01B8F15DD0" + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + }, + "celo-wei": { + "symbol": "CELO", + "decimals": 18, + "name": "Celo native asset", + "is_native": true, + "address": "0xF194afDf50B03e69Bd7D057c1Aa9e10c9954E4C9" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/5284F2F6A518924A0CBCA19B428DB5914625DD944B71C50932654D53BAE4F46A" + "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/7375351C415AB12F9C8CECF25EB8631F8DB3F01E3701C287E3AE94B4F2463A0F" + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/102B5C801FC6949F1917F261ECAFCC30715960BF5F2579261F0F4FFB0FB2862D" + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/703D72BCB1280219A589353F10E96BE5F742CB903885FF46DEC9770DF3567799" + "address": "0x594D8b81eC765410536ab59E98091700b99508D8" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/A6CB0A8984F9E56A7C29280A5D6E7085CFACA086525E94D59FB838ABF4EB6D00" + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/0C032AE90993A345CCFFDDD163F61AECC09DCCB2257C54CCFF60393FED9602E6" + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + }, + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", + "is_native": false, + "address": "0x08b7bC06e46C0cc11f29e1a6fc3d6e19965174bC" } }, - "celestia": { + "fxcore": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/57CC4D880A8C71F530D6EF54B65B6BE4F48E3973A776EE40D53CD443ABF7AC61" + "address": "ibc/A4CEA4766647FE70F414F9AE310F38B85B5D6C4F38A893E0072D735153B36845" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/BE25BB3D2A4F9A537BD30DEE5689F9B83B628AEDCC80B66AD81B5E4DA7E5DEF4" + "address": "ibc/0DBF4A36139D93F477A728CBA10DFB4DD915D39D4FF440C312E53E7589B2BE89" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/83016A0BDA530D473A3C7DA9247CCBFC39029CA4B0800A23C8B77E31252AD306" + "address": "ibc/C42B67A2559609F974D54BA91F33C2E458BB3C783EB0C1F298DA21BC9BF191A6" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/DA6EF9A26484CD3EE2AB2E3291C022DF05AEE63099D1C0CE72FC2760820DD1DF" + "address": "ibc/7F7DB257AE11CB585B14B298C160A271ABC024EEC2CA894DD5B9B3E6D83A1FDE" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/7155119EAC3E0A1A7FF0A03F543EFE720EBDE183E39E4AB0C2EA2F0F0CB96DD7" + "address": "ibc/A1F450E3D6FBEE7742642B0699D70E3508167302BEC78BC4E5C1ECDFF1CA73E9" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/158CDA722C42E81211A6E26CAD436F5BA1AA90F283865A47591222185F60471F" + "address": "ibc/6D57CC97C38769E83360454569DCD1EF9D8FD3A220EE9D65AFA11DE94D320A67" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/3B003BA11A453299613A59F8B1A44BFB3AD8F82FCC98B1E98DF6DB203EAA0E1C" + "address": "ibc/C3467FC3FEF4285B822DC1915E1C13FA6CE7817D4747663E83D2E6F9936CC1F2" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/82D92D7986740C5D8537430B7D276F7DC271BA8BC096B520A739124EA13EE7FB" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/5EC33C8D92DD745D5D0FAAD4295D4C20F1DFA9E3FC3DEAB8513A5B4F46BF5245" } }, - "elys": { + "kava": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/B128141D55C96F1E2CA7406FB24B339D6385E84A6B1CC27B2EAE482E3F20F1B4" + "address": "0xAa03872057AD496Bd6f3eE85b85e1e4DABdb1a5d" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0xA3A2b6F3b34F513BA0084D504E8a6162bd7C7EE6" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/FB22E35236996F6B0B1C9D407E8A379A7B1F4083F1960907A1622F022AE450E1" + "address": "0x3F8a312113ED10833F27bbC1ee08A8cDB4df16B4" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/E059CD828E5009D4CF03C4494BEA73749250287FC98DD46E19F9016B918BF49D" + "address": "0x5e372F445C6afc91Aaca0d6C0Fa170d5f8F30f49" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/43881AB3B3D05FD9D3606D7F57CBE6EEEA89D18AC66AF9E2915ED43940E71CFD" + "address": "0xf3280d7a127Bb743918040fB99108728388e3c9e" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/66000303A64E819F9B46E71EF3B62172921EEE3A74F19076F88D7EDA519F9C3B" + "address": "0xd7ba4DE2d9cDF1D34D0aE608F3725Aed1A32821E" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/2FBCFC209420E6CECED6EE0BC599E74349759352CE953E27A6871BB3D84BC058" + "address": "0x500c333DC86813F930299a68B990F57D1ca6e243" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/122EF3EFDC416F25FE521AEA5766742EA6F938155AA8198D56E8CBDC07E9F55A" + "address": "0xe9a3a0E5C9cFed51E1D60d57e10DeE4478415e52" + }, + "uxion": { + "symbol": "XION", + "decimals": 6, + "name": "Xion", + "is_native": false, + "address": "0x74C792AA473443F6629b2c79f4f6760857211049" } }, - "arbitrum-sepolia": {}, - "centrifuge-2": {}, - "immutable": {}, - "ethereum-sepolia": { + "provenance": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" - }, - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" + "address": "ibc/F53E48CE45EF24BD633402397B0013E02013E9ABD420FEAB905EAF01B8F15DD0" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" + "address": "ibc/5284F2F6A518924A0CBCA19B428DB5914625DD944B71C50932654D53BAE4F46A" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" + "address": "ibc/7375351C415AB12F9C8CECF25EB8631F8DB3F01E3701C287E3AE94B4F2463A0F" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" + "address": "ibc/102B5C801FC6949F1917F261ECAFCC30715960BF5F2579261F0F4FFB0FB2862D" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0x594D8b81eC765410536ab59E98091700b99508D8" + "address": "ibc/703D72BCB1280219A589353F10E96BE5F742CB903885FF46DEC9770DF3567799" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" + "address": "ibc/A6CB0A8984F9E56A7C29280A5D6E7085CFACA086525E94D59FB838ABF4EB6D00" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + "address": "ibc/0C032AE90993A345CCFFDDD163F61AECC09DCCB2257C54CCFF60393FED9602E6" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/57D1B4F973BCFCF3E85EE9BF3A9895F78E157F4958546642A62258AC699C8185" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/2B296CFEDDAB2ECBE5E68F30A4BEB6AC525AE5ECA506ECA44E8F83AF0E735584" } }, - "ojo": { + "fraxtal": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/4BDF2D63B8FFE3454AF30E9BC10D2D7979BD3A938D989889ABC94FC5B86F1E2D" + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" + }, + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", + "is_native": false, + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/13F73121EEA6CAA0DF51B06F64C39FD55EF394C64223881569DFA5628FA1288D" + "address": "0xeA700DCe55e72C4C08b97AcFc7dF214EC30F4a64" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/7BFC5893BCCC6C9A4B173BC1183D2706141CBF71679EA6BDCE15E679CEC05183" + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/78D5DAB545549A930F5DB22CFA7C821ACE8EF55DCF787BED93A56D04CC7477F5" + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/301A96A9BB897EF914BA74534EE1D75417753A0E113F2F766838274057290B79" + "address": "0x594D8b81eC765410536ab59E98091700b99508D8" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/52F7DAC8D338E4D7388D02EBD6E522B86EBB62A48C6732C2651423A9E79377DE" + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/6A4043BCBD3FB6E9D86A14F6A018C33CD4E05990E977729CC1946395B2972B11" + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" } }, - "saga": { + "sommelier": { "uausdc": { "symbol": "aUSDC", "decimals": 6, "name": "USD coin", "is_native": false, - "address": "ibc/D36138944A9A06A5361EB9F9713D2AAC8B9A9ED88AFC9960A0005C17C8A0B447" + "address": "ibc/6F34E1BD664C36CE49ACC28E60D62559A5F96C4F9A6CCE4FC5A67B2852E24CFE" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "ibc/D236A44A8AB79841929225744AA3B4F7766E132654898E72B364FD8B1825FD70" + "address": "ibc/29320BE25C3BF64A2355344625410899C1EB164038E328531C36095B0AA8BBFC" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/A64467480BBE4CCFC3CF7E25AD1446AA9BDBD4F5BCB9EF6038B83D6964C784E6" + "address": "ibc/2B5D096F5732F3BADBFB987FE42FDA24B3569514BC5DFDEA1BC042B223A0CED3" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/004EBF085BBED1029326D56BE8A2E67C08CECE670A94AC1947DF413EF5130EB2" + "address": "ibc/609C07B33C99E40A50498BDDECDD14D8BCC89D1A14D4E36053082AEA2E8D193D" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/E67ADA2204A941CD4743E70771BA08E24885E1ADD6FD140CE1F9E0FEBB68C6B2" + "address": "ibc/055E7CBD9F1EF910CA7CA1DD293B39439CB33172F929194855DBAC6CB3081B95" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/DADB399E742FCEE71853E98225D13E44E90292852CD0033DF5CABAB96F80B833" + "address": "ibc/55E995E3FD16C2C717A18D818A862E90A8414D1C7FCBA9B9349DB944275C98A3" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/1CA16CA6C642FD2C6105872B51C059A108D82072911274BAF2E63EC0827D5074" + "address": "ibc/76C8C560FDE4EFE9F4AEFB0679E6D523CFF6A62BCD3F9541E8F6E3DA6831550E" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/F275F32257587EA449D89966B76F93458092C0C4CF08004AD0189C134DBB499A" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "ibc/4919DE40A784F357502DD6DD3334FCAD5D98E4C29E343DE0948D167E227113B4" } - } - }, - "stagenet": { - "axelarnet": { + }, + "arbitrum-sepolia": { + "uausdc": { + "symbol": "aUSDC", + "decimals": 6, + "name": "USD coin", + "is_native": false, + "address": "0xA2Ba06a76eC793d1Faf23Cc8220A887402b27331" + }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, - "is_native": true, - "address": "uaxl" - }, - "eth-wei": { - "symbol": "axlWETH", - "decimals": 18, - "name": "Wrapped Ether", + "name": "Axelar", "is_native": false, - "address": "eth-wei" + "address": "0x6822d8A56904A746C4812e3E54998295F4667e76" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "wmatic-wei" + "address": "0xa98742504D7764b36aC2e3B62006f387d138b88B" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "wavax-wei" + "address": "0x12e5E00075acd8dBfa00576Da30ea81b8c3038a0" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "wftm-wei" + "address": "0x0075fBA58E4A23Fb1f6EAf43EBA88D0E64580a70" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "wbnb-wei" + "address": "0x109E2C78C68F6388F6f50841C9A175BaC139B3d7" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "wdev-wei" - } - }, - "base": { - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, - "is_native": false, - "address": "0xc9D703f503197f71220C144d15e237ee0cfcc255" - }, - "eth-wei": { - "symbol": "axlWETH", - "decimals": 18, - "name": "Wrapped Ether", - "is_native": false, - "address": "0x75d7CAad59a7f0A66f930e6c6De33FfB6f063b24" - }, - "wmatic-wei": { - "symbol": "WMATIC", - "decimals": 18, - "name": "Wrapped Matic", - "is_native": false, - "address": "0x009558ab8591E6913df8C100DdF7C874A857daEc" - }, - "wavax-wei": { - "symbol": "WAVAX", - "decimals": 18, - "name": "Wrapped AVAX", - "is_native": false, - "address": "0xDC3e51096509b071AC92D7B85CA218befF0aa497" - }, - "wftm-wei": { - "symbol": "WFTM", - "decimals": 18, - "name": "Wrapped FTM", - "is_native": false, - "address": "0xf2f229F957B7977C7dAab536a59020CE358bAb22" + "address": "0x757eFF1c2096cF0f95F699E6E72a6bf5Ff572664" }, - "wbnb-wei": { - "symbol": "WBNB", + "sepolia-wsteth-wei": { + "symbol": "wstETH", "decimals": 18, - "name": "Wrapped BNB", + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "0x9F729416F7EdeeD845e309db9FfcdC64dA6cBAA9" + "address": "0xa190ff582011eFEa55A87209F85D6f411D07d052" }, - "wdev-wei": { - "symbol": "WDEV", + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", "decimals": 18, - "name": "Wrapped DEV", + "name": "Wrapped Ether", "is_native": false, - "address": "0x5c9F07309Bd8C03397B6402AAb9f2DE1E44b377f" + "address": "0x49E4D97AF0e05E5d1d6cB821918e5a00D69E91Af" } }, - "optimism": { - "uaxl": { - "symbol": "AXL", + "base-sepolia": { + "uausdc": { + "symbol": "aUSDC", "decimals": 6, - "name": null, + "name": "USD coin", "is_native": false, - "address": "0xc9D703f503197f71220C144d15e237ee0cfcc255" + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" }, - "eth-wei": { - "symbol": "axlWETH", - "decimals": 18, - "name": "Wrapped Ether", + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", "is_native": false, - "address": "0x75d7CAad59a7f0A66f930e6c6De33FfB6f063b24" + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x009558ab8591E6913df8C100DdF7C874A857daEc" + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0xDC3e51096509b071AC92D7B85CA218befF0aa497" + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0xf2f229F957B7977C7dAab536a59020CE358bAb22" + "address": "0x594D8b81eC765410536ab59E98091700b99508D8" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x9F729416F7EdeeD845e309db9FfcdC64dA6cBAA9" + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x5c9F07309Bd8C03397B6402AAb9f2DE1E44b377f" + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" } }, - "osmosis-6": { - "uaxl": { - "symbol": "AXL", + "blast-sepolia": { + "uausdc": { + "symbol": "aUSDC", "decimals": 6, - "name": null, + "name": "USD coin", "is_native": false, - "address": "ibc/5F0773CD25867447671476F2155271095453C7318D6D5F8CD0E7FA0D28FF9419" + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" }, - "eth-wei": { - "symbol": "axlWETH", - "decimals": 18, - "name": "Wrapped Ether", + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", "is_native": false, - "address": "ibc/D659EE7BD9B1DE5C3BA8622330083533D299DA57323567763E5C66DBBD936A80" + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "ibc/24A9E63F5262DDB625332D8F43C4FDD7EEF7308F9B6FD304A3A460DB10B4DFB1" + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "ibc/463593532B87FC1581FFBAF9F9B8A9975742DE28552A553CCDB1423CA15018DA" + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "ibc/F5F6C82A27666E4D3D1E094ED0D9DDBEDD1A19D30403D61774A73F84F67068EF" + "address": "0x594D8b81eC765410536ab59E98091700b99508D8" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "ibc/66E7EC4547351E4ED6F5114677CD8930F4D55DC91494BDA2DC216632674B717D" + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "ibc/4F86D0095577712A3F3605D58261ECA69DDA5B7B9F8393798A88FD44CF91DCBF" + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" } }, - "arbitrum": { - "uaxl": { - "symbol": "AXL", + "mantle-sepolia": { + "uausdc": { + "symbol": "aUSDC", "decimals": 6, - "name": null, + "name": "USD coin", "is_native": false, - "address": "0xc9D703f503197f71220C144d15e237ee0cfcc255" + "address": "0xAa03872057AD496Bd6f3eE85b85e1e4DABdb1a5d" }, - "eth-wei": { - "symbol": "axlWETH", - "decimals": 18, - "name": "Wrapped Ether", + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", "is_native": false, - "address": "0x75d7CAad59a7f0A66f930e6c6De33FfB6f063b24" + "address": "0xA3A2b6F3b34F513BA0084D504E8a6162bd7C7EE6" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x009558ab8591E6913df8C100DdF7C874A857daEc" + "address": "0x5e372F445C6afc91Aaca0d6C0Fa170d5f8F30f49" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0xDC3e51096509b071AC92D7B85CA218befF0aa497" + "address": "0xf3280d7a127Bb743918040fB99108728388e3c9e" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0xf2f229F957B7977C7dAab536a59020CE358bAb22" + "address": "0xd7ba4DE2d9cDF1D34D0aE608F3725Aed1A32821E" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x9F729416F7EdeeD845e309db9FfcdC64dA6cBAA9" + "address": "0x500c333DC86813F930299a68B990F57D1ca6e243" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x5c9F07309Bd8C03397B6402AAb9f2DE1E44b377f" + "address": "0xe9a3a0E5C9cFed51E1D60d57e10DeE4478415e52" } }, - "avalanche": { - "uaxl": { - "symbol": "AXL", + "optimism-sepolia": { + "uausdc": { + "symbol": "aUSDC", "decimals": 6, - "name": null, + "name": "USD coin", "is_native": false, - "address": "0xc9D703f503197f71220C144d15e237ee0cfcc255" + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" }, - "eth-wei": { - "symbol": "axlWETH", - "decimals": 18, - "name": "Wrapped Ether", + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", "is_native": false, - "address": "0x75d7CAad59a7f0A66f930e6c6De33FfB6f063b24" + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x009558ab8591E6913df8C100DdF7C874A857daEc" + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", - "is_native": true, - "address": "0xd00ae08403B9bbb9124bB305C09058E32C39A48c" + "is_native": false, + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0xf2f229F957B7977C7dAab536a59020CE358bAb22" + "address": "0x594D8b81eC765410536ab59E98091700b99508D8" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x9F729416F7EdeeD845e309db9FfcdC64dA6cBAA9" + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x5c9F07309Bd8C03397B6402AAb9f2DE1E44b377f" + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + }, + "sepolia-wsteth-wei": { + "symbol": "wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", + "is_native": false, + "address": "0x04f9c3c252B280C92530490c6E02a3DD06651C2F" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", + "is_native": false, + "address": "0x520863FA61Fe346687231477fe74867667F1423B" } }, - "binance": { - "uaxl": { - "symbol": "AXL", + "lava": { + "uausdc": { + "symbol": "aUSDC", "decimals": 6, - "name": null, + "name": "USD coin", "is_native": false, - "address": "0xc9D703f503197f71220C144d15e237ee0cfcc255" + "address": "ibc/3D3E77333E4AAE1BCE0F03BEDA9A538166D113AF1B60EB1C35365D03506F07F4" }, "eth-wei": { "symbol": "axlWETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0x75d7CAad59a7f0A66f930e6c6De33FfB6f063b24" + "address": "ibc/9BE75CAB3126DA45896BBA7CC269199120F7E7B256E6EA07A57D20007042AD50" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x009558ab8591E6913df8C100DdF7C874A857daEc" + "address": "ibc/C322C7D0867CC3EE6FA3495DC9685E5A0F49B506369341287FDA1E110841A950" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0xDC3e51096509b071AC92D7B85CA218befF0aa497" + "address": "ibc/0886E3462B7DD438353781848DBDF90E58BB7DE90266E3F95E41B3FA8ED1B453" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0xf2f229F957B7977C7dAab536a59020CE358bAb22" + "address": "ibc/23B62EFD1B9444733889B42362570C774801430A1C656A0A3F8D6D69AE93ED8B" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", - "is_native": true, - "address": "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd" + "is_native": false, + "address": "ibc/3D4499D811B055223D0EFB06D2211F84772CAEF0FB987F71BAE716191714B391" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x5c9F07309Bd8C03397B6402AAb9f2DE1E44b377f" - } - }, - "ethereum-2": { - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, + "address": "ibc/C036FCFBF39952E97FE3D860C3926B1AA6DAB443C82F19142F5EE8925694E095" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", "is_native": false, - "address": "0xc9D703f503197f71220C144d15e237ee0cfcc255" + "address": "ibc/98AD7CD4FE565439082A0669AC1913012C14BD52817CA95B2D992E9F836FB39F" }, - "eth-wei": { - "symbol": "WETH", + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", "decimals": 18, "name": "Wrapped Ether", - "is_native": true, - "address": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6" + "is_native": false, + "address": "ibc/EBEB5A9AE60ECD42A6A5B26C4CBF83421BB95AC466BF4BBC9DE6C686AB0128CD" + } + }, + "umee": { + "uausdc": { + "symbol": "aUSDC", + "decimals": 6, + "name": "USD coin", + "is_native": false, + "address": "ibc/6F34E1BD664C36CE49ACC28E60D62559A5F96C4F9A6CCE4FC5A67B2852E24CFE" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x009558ab8591E6913df8C100DdF7C874A857daEc" + "address": "ibc/2B5D096F5732F3BADBFB987FE42FDA24B3569514BC5DFDEA1BC042B223A0CED3" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0xDC3e51096509b071AC92D7B85CA218befF0aa497" + "address": "ibc/609C07B33C99E40A50498BDDECDD14D8BCC89D1A14D4E36053082AEA2E8D193D" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0xf2f229F957B7977C7dAab536a59020CE358bAb22" + "address": "ibc/055E7CBD9F1EF910CA7CA1DD293B39439CB33172F929194855DBAC6CB3081B95" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x9F729416F7EdeeD845e309db9FfcdC64dA6cBAA9" + "address": "ibc/55E995E3FD16C2C717A18D818A862E90A8414D1C7FCBA9B9349DB944275C98A3" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x5c9F07309Bd8C03397B6402AAb9f2DE1E44b377f" + "address": "ibc/76C8C560FDE4EFE9F4AEFB0679E6D523CFF6A62BCD3F9541E8F6E3DA6831550E" } }, - "fantom": { - "uaxl": { - "symbol": "AXL", + "linea-sepolia": { + "uausdc": { + "symbol": "aUSDC", "decimals": 6, - "name": null, + "name": "USD coin", "is_native": false, - "address": "0xc9D703f503197f71220C144d15e237ee0cfcc255" + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" }, - "eth-wei": { - "symbol": "axlWETH", - "decimals": 18, - "name": "Wrapped Ether", + "uaxl": { + "symbol": "AXL", + "decimals": 6, + "name": "Axelar", "is_native": false, - "address": "0x75d7CAad59a7f0A66f930e6c6De33FfB6f063b24" + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x009558ab8591E6913df8C100DdF7C874A857daEc" + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0xDC3e51096509b071AC92D7B85CA218befF0aa497" + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", - "is_native": true, - "address": "0x812666209b90344Ec8e528375298ab9045c2Bd08" + "is_native": false, + "address": "0x594D8b81eC765410536ab59E98091700b99508D8" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x9F729416F7EdeeD845e309db9FfcdC64dA6cBAA9" + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x5c9F07309Bd8C03397B6402AAb9f2DE1E44b377f" + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" } }, - "kava": { + "polygon-sepolia": { + "uausdc": { + "symbol": "aUSDC", + "decimals": 6, + "name": "USD coin", + "is_native": false, + "address": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" + }, "uaxl": { "symbol": "AXL", "decimals": 6, - "name": null, + "name": "Axelar", "is_native": false, - "address": "0xc9D703f503197f71220C144d15e237ee0cfcc255" + "address": "0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f" }, - "eth-wei": { - "symbol": "axlWETH", + "wsteth-wei": { + "symbol": "axl-wstETH", "decimals": 18, - "name": "Wrapped Ether", + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "0x75d7CAad59a7f0A66f930e6c6De33FfB6f063b24" + "address": "0x9cfB13E6c11054ac9fcB92BA89644F30775436e4" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x009558ab8591E6913df8C100DdF7C874A857daEc" + "address": "0x21ba4f6aEdA155DD77Cc33Fb93646910543F0380" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0xDC3e51096509b071AC92D7B85CA218befF0aa497" + "address": "0x2a87806561C550ba2dA9677c5323413E6e539740" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0xf2f229F957B7977C7dAab536a59020CE358bAb22" + "address": "0x594D8b81eC765410536ab59E98091700b99508D8" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x9F729416F7EdeeD845e309db9FfcdC64dA6cBAA9" + "address": "0xA9A2D8F279ABC436a18DBB1df3FB233039935D0A" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x5c9F07309Bd8C03397B6402AAb9f2DE1E44b377f" - } - }, - "moonbeam": { - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, + "address": "0x4B13D583F45Aa01fb2bE18a7AAfE14DE183B1Ac9" + }, + "sepolia-wsteth-wei": { + "symbol": "wstETH", + "decimals": 18, + "name": "Wrapped liquid staked Ether 2.0", "is_native": false, - "address": "0xc9D703f503197f71220C144d15e237ee0cfcc255" + "address": "0x04f9c3c252B280C92530490c6E02a3DD06651C2F" }, - "eth-wei": { - "symbol": "axlWETH", + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0x75d7CAad59a7f0A66f930e6c6De33FfB6f063b24" + "address": "0x520863FA61Fe346687231477fe74867667F1423B" + } + }, + "warden": { + "uausdc": { + "symbol": "aUSDC", + "decimals": 6, + "name": "USD coin", + "is_native": false, + "address": "ibc/4BDF2D63B8FFE3454AF30E9BC10D2D7979BD3A938D989889ABC94FC5B86F1E2D" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", "is_native": false, - "address": "0x009558ab8591E6913df8C100DdF7C874A857daEc" + "address": "ibc/7BFC5893BCCC6C9A4B173BC1183D2706141CBF71679EA6BDCE15E679CEC05183" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0xDC3e51096509b071AC92D7B85CA218befF0aa497" + "address": "ibc/78D5DAB545549A930F5DB22CFA7C821ACE8EF55DCF787BED93A56D04CC7477F5" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0xf2f229F957B7977C7dAab536a59020CE358bAb22" + "address": "ibc/301A96A9BB897EF914BA74534EE1D75417753A0E113F2F766838274057290B79" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x9F729416F7EdeeD845e309db9FfcdC64dA6cBAA9" + "address": "ibc/52F7DAC8D338E4D7388D02EBD6E522B86EBB62A48C6732C2651423A9E79377DE" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", - "is_native": true, - "address": "0x1436aE0dF0A8663F18c0Ec51d7e2E46591730715" - } - }, - "polygon": { - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, "is_native": false, - "address": "0xc9D703f503197f71220C144d15e237ee0cfcc255" + "address": "ibc/6A4043BCBD3FB6E9D86A14F6A018C33CD4E05990E977729CC1946395B2972B11" }, - "eth-wei": { - "symbol": "axlWETH", + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/1ABFEF83A0A3F29490D029D97773AE3D3B3A446C2001E791E8B9EBA0B7E47E05" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", "decimals": 18, "name": "Wrapped Ether", "is_native": false, - "address": "0x75d7CAad59a7f0A66f930e6c6De33FfB6f063b24" + "address": "ibc/F5697D50A2DB33983439166EEC41C24BD61EE53975E72799F37E7C83B8F75BB5" + } + }, + "nillion": { + "uausdc": { + "symbol": "aUSDC", + "decimals": 6, + "name": "USD coin", + "is_native": false, + "address": "ibc/96CF88731A06654F8510473865C75200005B81A2A9FECB90389034F787015CA3" }, "wmatic-wei": { "symbol": "WMATIC", "decimals": 18, "name": "Wrapped Matic", - "is_native": true, - "address": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889" + "is_native": false, + "address": "ibc/14767887A69DBEFF3B99AA3E5B176C7989B1DAD2395A1E843F48EE981AC4F83F" }, "wavax-wei": { "symbol": "WAVAX", "decimals": 18, "name": "Wrapped AVAX", "is_native": false, - "address": "0xDC3e51096509b071AC92D7B85CA218befF0aa497" + "address": "ibc/7B6FFC996FC2984AA98DBA4CEBFBF790E55F4D7E65360DD614F2BE2D08F4D324" }, "wftm-wei": { "symbol": "WFTM", "decimals": 18, "name": "Wrapped FTM", "is_native": false, - "address": "0xf2f229F957B7977C7dAab536a59020CE358bAb22" + "address": "ibc/A96863E0BDFA3F2D96625FD5A649AF53F62F97521EF78FBBFE5B4199C3E23ABD" }, "wbnb-wei": { "symbol": "WBNB", "decimals": 18, "name": "Wrapped BNB", "is_native": false, - "address": "0x9F729416F7EdeeD845e309db9FfcdC64dA6cBAA9" + "address": "ibc/5CB2E12B07D0B6D8EC24A68BA6B6E6E8D5BF85B7D22091D3A480DCDD61C6AC84" }, "wdev-wei": { "symbol": "WDEV", "decimals": 18, "name": "Wrapped DEV", "is_native": false, - "address": "0x5c9F07309Bd8C03397B6402AAb9f2DE1E44b377f" - } - }, - "immutable-devnet": { - "uaxl": { - "symbol": "AXL", - "decimals": 6, - "name": null, + "address": "ibc/245E6F47B96AFEA80863B40807312AF5AF42EA6AFCB927AC6A03015492BCC899" + }, + "nftl-wei": { + "symbol": "NFTL", + "decimals": 18, + "name": "Nifty League", + "is_native": false, + "address": "ibc/60245C9F9F66EF9E3EA45EFF16AA3FD78C9471E593A232C2469845C2D060C0AB" + }, + "sepolia-weth-wei": { + "symbol": "Sepolia axlETH", + "decimals": 18, + "name": "Wrapped Ether", "is_native": false, - "address": "0xc9D703f503197f71220C144d15e237ee0cfcc255" + "address": "ibc/8DC68451B4B2A4260144877058D5C452667B83274B2330D610143846EA20FDF6" } } } -} \ No newline at end of file +} diff --git a/src/env.d.ts b/src/env.d.ts index f964fe0cf..acef35f17 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -1 +1,2 @@ +/// /// diff --git a/src/layouts/ContentLayout.astro b/src/layouts/ContentLayout.astro new file mode 100644 index 000000000..8ba717e66 --- /dev/null +++ b/src/layouts/ContentLayout.astro @@ -0,0 +1,23 @@ +--- +import WorldMap from "@/components/ui/world-map.astro"; +import MainLayout from "@/layouts/MainLayout.astro"; +import { proseClasses } from "@/lib/prose-classes"; +import clsx from "clsx"; +--- + + +
    + +
    +
    + +
    +
    +
    +
    +
    diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro deleted file mode 100644 index 7479f9c39..000000000 --- a/src/layouts/Layout.astro +++ /dev/null @@ -1,36 +0,0 @@ ---- -export interface Props { - title: string; -} - -const { title } = Astro.props; ---- - - - - - - - - - - {title} - - - - - - diff --git a/src/layouts/MainLayout.astro b/src/layouts/MainLayout.astro index 078e19127..319bb6421 100644 --- a/src/layouts/MainLayout.astro +++ b/src/layouts/MainLayout.astro @@ -1,163 +1,227 @@ --- -import "../styles/main.scss"; +import Sidebar from "@/components/sidebar/sidebar.astro"; +import Header from "@/components/header/header.astro"; +import "../styles/global.css"; +import Footer from "@/components/footer/footer.astro"; -const { title, description, image, hidden } = Astro.props.frontmatter || Astro.props; +import { clsx } from "clsx"; +type Props = { + title?: string; + description?: string; + image?: string; + hidden?: boolean; + notSidebar?: boolean; + className?: string; + publishDate?: string; + modifiedDate?: string; +}; -const shownTitle = title ? title + ` | Axelar Documentation` : 'Axelar Documentation'; -const shownDescription = description || 'The Axelar Documentation tells you how to get started and be successful using Axelar. Axelar allows developers to build interchain dApps that connect to any blockchain. '; +const { + title, + description, + image = "/open-graph.webp", + hidden, + notSidebar, + className, + publishDate = new Date().toISOString(), + modifiedDate = new Date().toISOString(), +} = Astro.props; + +const shownTitle = title ? title : "Axelar Documentation"; +const shownDescription = + description || + "The Axelar Documentation tells you how to get started and be successful using Axelar. Axelar allows developers to build interchain dApps that connect to any blockchain. "; +const canonicalURL = new URL(Astro.url.pathname, Astro.site); --- - + + - - - - - - + + + + + + + + + + + {shownTitle} - - - {shownDescription && - - - + + + + + + + + + {image && } + { + image && ( + + ) } - - - - {image && - - + + + + { + hidden ? ( + + ) : ( + + ) } - - - - - {hidden && - - + { + publishDate && ( + + ) } + { + modifiedDate && ( + + ) + } + + + + + + - - - + return "light"; + })(); + if ( + theme === "light" || + (theme === "system" && + !window.matchMedia("(prefers-color-scheme: dark)").matches) + ) { + root.classList.remove("dark"); + } else { + root.classList.add("dark"); + } + - -