diff --git a/.github/workflows/firebase-live.yml b/.github/workflows/firebase-live.yml
index 3055e255..c515651a 100644
--- a/.github/workflows/firebase-live.yml
+++ b/.github/workflows/firebase-live.yml
@@ -24,7 +24,7 @@ jobs:
- name: Build Docs
env:
NODE_OPTIONS: "--max_old_space_size=4096"
- run: npm run docs:build
+ run: pnpm docs:build
- uses: FirebaseExtended/action-hosting-deploy@v0
with:
diff --git a/.github/workflows/firebase-preview.yml b/.github/workflows/firebase-preview.yml
index c25b3b1f..46968f0a 100644
--- a/.github/workflows/firebase-preview.yml
+++ b/.github/workflows/firebase-preview.yml
@@ -1,8 +1,6 @@
name: Deploy Preview to Firebase Hosting
on:
pull_request:
- branches-ignore:
- - live-site
jobs:
build_and_preview:
@@ -24,7 +22,7 @@ jobs:
- name: Build Docs
env:
NODE_OPTIONS: "--max_old_space_size=4096"
- run: npm run docs:build
+ run: pnpm docs:build
- uses: FirebaseExtended/action-hosting-deploy@v0
with:
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 4aa07faf..64846800 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -29,9 +29,6 @@ jobs:
- name: Lint
run: pnpm lint
- - name: Test
- run: pnpm test
-
- name: Build documentation
run: pnpm docs:build
diff --git a/.gitignore b/.gitignore
index 8376144b..f0dc63e5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,3 @@
-/.DS_Store/
.DS_Store
.idea/
.vscode/
@@ -12,19 +11,5 @@ docs/.vitepress/.temp
docs/public/llms.txt
docs/public/llms-full.txt
-/indexes/content-files/
-
-yarn-error.log
package-lock.json
firebase-debug.log
-libs/myGitHubToken.json
-
-
-# Ignoring a Previously Committed Files #
-# The files in your working copy can be either tracked or untracked.
-# To ignore a file that has been previously committed, you’ll need to
-# unstage and remove the file from the index, and then add a rule for the file in .gitignore:
-# git rm --cached filename
-# The --cached option tells git not to delete the file from the working tree
-# but only to remove it from the index.
-# To recursively remove a directory, use the -r option:
diff --git a/.prettierignore b/.prettierignore
index 56855849..22d064f3 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -2,25 +2,11 @@
/.github
/.vscode
/node_modules
-/archives
pnpm-lock.yaml
-# .vitepress
/docs/.vitepress/cache
/docs/.vitepress/dist
-/docs/.vitepress/public
-/docs/.vuepress/styles
-
/docs/public/img
-/docs/public/api3-whitepaper-v1.0.3.pdf
docs/public/llms.txt
docs/public/llms-full.txt
-
-# assets
-/docs/reference/ois/latest/assets
-/docs/reference/airnode/latest/assets
-/docs/reference/dao-members/assets
-/docs/reference/chainapi/assets
-/docs/reference/qrng/assets
-/docs/oev/assets
diff --git a/README.md b/README.md
index 5ca4cb23..b5bf8f95 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
> Source of the API3 documentation published at https://docs.api3.org
-The site is built with [VitePress](https://vitepress.dev/). Content lives under [`docs/`](./docs), one directory per top-level section. Each section owns its `sidebar.js` and is registered in [`docs/.vitepress/config.js`](./docs/.vitepress/config.js) and in [`scripts/generate-llms-files.js`](./scripts/generate-llms-files.js). The landing page is [`docs/index.md`](./docs/index.md).
+The site is built with [VitePress](https://vitepress.dev/). Content lives under [`docs/`](./docs), one directory per top-level section. Each section owns its `sidebar.js` and is registered in [`docs/.vitepress/config.js`](./docs/.vitepress/config.js), which the llms generator reads too. The landing page is [`docs/index.md`](./docs/index.md).
## Development
diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js
index 831380b5..c2b09ad5 100644
--- a/docs/.vitepress/config.js
+++ b/docs/.vitepress/config.js
@@ -1,6 +1,6 @@
-export default {
- title: 'Api3 documentation',
- description: 'Api3 documentation',
+module.exports = {
+ title: 'API3 documentation',
+ description: 'API3 documentation',
markdown: {
lineNumbers: true,
toc: ['h2', 'h3', 'h4', 'h5'],
diff --git a/docs/.vitepress/theme/index.js b/docs/.vitepress/theme/index.js
index a436f4e6..e858f83f 100644
--- a/docs/.vitepress/theme/index.js
+++ b/docs/.vitepress/theme/index.js
@@ -3,8 +3,6 @@ import { onMounted, watch, nextTick } from 'vue';
import { useRoute } from 'vitepress';
import mediumZoom from 'medium-zoom';
import PageHeader from '../../_components/PageHeader.vue';
-import CopyIcon from '../../_components/CopyIcon.vue';
-import Video from '../../_components/Video.vue';
import './zoom.css';
@@ -26,7 +24,5 @@ export default {
enhanceApp({ app }) {
app.component('PageHeader', PageHeader);
- app.component('CopyIcon', CopyIcon);
- app.component('Video', Video);
},
};
diff --git a/docs/_components/CopyIcon.vue b/docs/_components/CopyIcon.vue
deleted file mode 100644
index aa14be1d..00000000
--- a/docs/_components/CopyIcon.vue
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
- ❏
-
-
-
-
-
-
-
diff --git a/docs/_components/Video.vue b/docs/_components/Video.vue
deleted file mode 100644
index f8b4e7a5..00000000
--- a/docs/_components/Video.vue
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/docs/curation/disclosure.md b/docs/curation/disclosure.md
index 6d5961f0..83a24090 100644
--- a/docs/curation/disclosure.md
+++ b/docs/curation/disclosure.md
@@ -8,68 +8,68 @@ outline: deep
# Disclosure
-This page describes the scope of Api3's role as a Morpho vault curator, the risks involved in interacting with Api3-curated vaults, and the limits of Api3's responsibility and ability.
-By depositing into, withdrawing from, or otherwise interacting with any vault curated by Api3, you acknowledge and accept the Api3 [terms and conditions,](https://api3.org/terms-and-conditions/) which apply to all services and software provided by the API3 Foundation ("Api3"), as well as the additional supplemental disclosures in these docs.
+This page describes the scope of API3's role as a Morpho vault curator, the risks involved in interacting with API3-curated vaults, and the limits of API3's responsibility and ability.
+By depositing into, withdrawing from, or otherwise interacting with any vault curated by API3, you acknowledge and accept the API3 [terms and conditions,](https://api3.org/terms-and-conditions/) which apply to all services and software provided by the API3 Foundation ("API3"), as well as the additional supplemental disclosures in these docs.
## Scope of curation
-Api3's role as a curator is limited to setting on-chain vault parameters within the [Morpho Protocol](https://morpho.org/) — selecting enabled markets, configuring supply caps, assigning roles, and operating the automation described elsewhere in these docs.
+API3's role as a curator is limited to setting on-chain vault parameters within the [Morpho Protocol](https://morpho.org/) - selecting enabled markets, configuring supply caps, assigning roles, and operating the automation described elsewhere in these docs.
-Api3 does not hold, control, or take custody of any user assets.
+API3 does not hold, control, or take custody of any user assets.
All deposits, withdrawals, and market interactions occur directly through Morpho's open-source, non-custodial smart contracts.
Users remain solely responsible for the custody and security of their private keys and digital assets.
-Interactions with Morpho's smart contracts, interfaces, and other services are governed by Morpho's own [terms](https://morpho.org/terms-of-use/) and documentation. Api3 has no responsibility for nor ability to affect the Morpho Protocol services, smart contracts, nor its operation or maintenance.
+Interactions with Morpho's smart contracts, interfaces, and other services are governed by Morpho's own [terms](https://morpho.org/terms-of-use/) and documentation. API3 has no responsibility for nor ability to affect the Morpho Protocol services, smart contracts, nor its operation or maintenance.
## No offer, no advice
-Nothing in this documentation, nor any parameters, strategies, or materials related to Api3-curated vaults, constitutes:
+Nothing in this documentation, nor any parameters, strategies, or materials related to API3-curated vaults, constitutes:
- An offer to sell or solicitation to buy any financial instrument, investment product, or security.
- Financial, investment, legal, tax, accounting, or other professional advice.
- A recommendation to take or refrain from taking any action.
-Api3 does not act as your broker, investment adviser, fiduciary, or asset manager. All information is provided for general informational purposes only, and users are expected to conduct their own due diligence before interacting with any vault, including the verification of any transaction settings and parameters whether or not shown or suggested by any Api3 service or site.
+API3 does not act as your broker, investment adviser, fiduciary, or asset manager. All information is provided for general informational purposes only, and users are expected to conduct their own due diligence before interacting with any vault, including the verification of any transaction settings and parameters whether or not shown or suggested by any API3 service or site.
## Risks
-Interacting with Api3-curated vaults involves significant risks. These include, but are not limited to:
+Interacting with API3-curated vaults involves significant risks. These include, but are not limited to:
-- **Market risk** — Collateral assets may experience extreme volatility or illiquidity, leading to bad debt in the underlying lending markets that cannot be fully liquidated.
-- **Smart contract risk** — Vulnerabilities or bugs in the Morpho Protocol, the collateral tokens, the oracle infrastructure, or any other contract in the stack may result in partial or total loss of funds.
-- **Oracle risk** — Although Api3 operates as the oracle provider for its own markets, oracle systems can fail, be manipulated, or behave unexpectedly during adverse market conditions.
-- **Parameter and governance risk** — Market configurations, supply caps, role assignments, and other parameters may be changed. Changes that increase risk to depositors, such as adding markets or raising supply caps, are subject to a timelock to ensure users have enough time to review the changes.
-- **Liquidity risk** — Under stressed market conditions, withdrawals may be temporarily delayed pending the availability of idle liquidity or successful rebalancing across markets.
-- **Regulatory risk** — Legal and regulatory treatment of vaults, tokenized positions, and DeFi lending may change in ways that adversely affect users.
+- **Market risk** - Collateral assets may experience extreme volatility or illiquidity, leading to bad debt in the underlying lending markets that cannot be fully liquidated.
+- **Smart contract risk** - Vulnerabilities or bugs in the Morpho Protocol, the collateral tokens, the oracle infrastructure, or any other contract in the stack may result in partial or total loss of funds.
+- **Oracle risk** - Although API3 operates as the oracle provider for its own markets, oracle systems can fail, be manipulated, or behave unexpectedly during adverse market conditions.
+- **Parameter and governance risk** - Market configurations, supply caps, role assignments, and other parameters may be changed. Changes that increase risk to depositors, such as adding markets or raising supply caps, are subject to a timelock to ensure users have enough time to review the changes.
+- **Liquidity risk** - Under stressed market conditions, withdrawals may be temporarily delayed pending the availability of idle liquidity or successful rebalancing across markets.
+- **Regulatory risk** - Legal and regulatory treatment of vaults, tokenized positions, and DeFi lending may change in ways that adversely affect users.
-Past performance does not guarantee future results. Vault strategies may be changed, expanded, or discontinued at any time, and parameter changes are at Api3's sole discretion.
+Past performance does not guarantee future results. Vault strategies may be changed, expanded, or discontinued at any time, and parameter changes are at API3's sole discretion.
## No guarantees
-Api3's curation services are provided on an "as is" basis, without warranties of any kind, whether express or implied.
-Api3 makes no representation or guarantee as to:
+API3's curation services are provided on an "as is" basis, without warranties of any kind, whether express or implied.
+API3 makes no representation or guarantee as to:
- The safety of assets deposited into any vault.
- The accuracy or appropriateness of any parameter or risk classification.
- The future yield or performance of any strategy.
- The availability of withdrawal liquidity at any given time.
-The fact that Api3 deploys a portion of its own treasury into the vaults it curates (as described under [Skin in the game](/curation/#skin-in-the-game)) reflects alignment of incentives, but is not a guarantee, backstop, or commitment to compensate third-party depositors for any loss.
+The fact that API3 deploys a portion of its own treasury into the vaults it curates (as described under [Skin in the game](/curation/#skin-in-the-game)) reflects alignment of incentives, but is not a guarantee, backstop, or commitment to compensate third-party depositors for any loss.
## Restricted access
-To Api3's knowledge, Morpho's vaults (whether or not Api3-curated) are not registered with, or approved by, any financial regulatory authority in any jurisdiction.
-They are not available to, and must not be accessed by, persons or entities located, incorporated, or resident in jurisdictions where such access is restricted or prohibited — including, without limitation, jurisdictions subject to comprehensive sanctions administered by the UN, OFAC or other competent authorities.
+To API3's knowledge, Morpho's vaults (whether or not API3-curated) are not registered with, or approved by, any financial regulatory authority in any jurisdiction.
+They are not available to, and must not be accessed by, persons or entities located, incorporated, or resident in jurisdictions where such access is restricted or prohibited - including, without limitation, jurisdictions subject to comprehensive sanctions administered by the UN, OFAC or other competent authorities.
-By interacting with an Api3-curated vault, you represent that you are not a prohibited person and that you are acting in full compliance with Api3's terms and all laws applicable to you.
+By interacting with an API3-curated vault, you represent that you are not a prohibited person and that you are acting in full compliance with API3's terms and all laws applicable to you.
## Limitation of liability
-Api3's role is limited to setting vault parameters within the Morpho Protocol. Api3 has no contractual relationship with vault users and assumes no liability nor responsibility for any losses, damages, or claims arising out of or in connection with the use of any vault nor any of the Risks enumerated above, including but not limited to those caused by:
+API3's role is limited to setting vault parameters within the Morpho Protocol. API3 has no contractual relationship with vault users and assumes no liability nor responsibility for any losses, damages, or claims arising out of or in connection with the use of any vault nor any of the Risks enumerated above, including but not limited to those caused by:
- Smart contract failures, exploits, or forks of the underlying protocols.
- Failures or inaccuracies of any third-party data source, valuation, or price feed.
- User error, loss of private keys, or compromised wallets.
- Regulatory actions, changes in law, or force majeure events (including cyberattacks and network failures).
-To the maximum extent permitted by law, Api3 shall not be liable for any direct, indirect, incidental, special, consequential, or punitive damages arising from your use of any Api3-curated vault or other service. In the event of any conflict between these disclosures and the Api3 [terms and conditions](https://api3.org/terms-and-conditions/), the Api3 terms and conditions shall control.
+To the maximum extent permitted by law, API3 shall not be liable for any direct, indirect, incidental, special, consequential, or punitive damages arising from your use of any API3-curated vault or other service. In the event of any conflict between these disclosures and the API3 [terms and conditions](https://api3.org/terms-and-conditions/), the API3 terms and conditions shall control.
diff --git a/docs/curation/index.md b/docs/curation/index.md
index 057f2500..85c86fc9 100644
--- a/docs/curation/index.md
+++ b/docs/curation/index.md
@@ -8,12 +8,12 @@ outline: deep
# Curation
-Api3 operates as a vault curator on [Morpho,](https://morpho.org/) the largest decentralized lending protocol on Ethereum.
+API3 operates as a vault curator on [Morpho,](https://morpho.org/) a decentralized lending protocol.
Morpho is a permissionless protocol that allows anyone to create isolated lending markets with custom parameters.
Morpho Vaults aggregate deposits and allocate them across these markets, abstracting the complexity of individual market selection for depositors.
-As a curator, Api3 selects lending markets, manages risk parameters, and allocates capital to generate yield for vault depositors.
-Api3 operates a set of vaults across multiple networks, each targeting different markets and strategies.
+As a curator, API3 selects lending markets, manages risk parameters, and allocates capital to generate yield for vault depositors.
+API3 operates a set of vaults across multiple networks, each targeting different markets and strategies.
::: info 💡 Tip
@@ -23,45 +23,45 @@ For quick reference, you can copy-paste [`llms-full.txt`](https://docs.api3.org/
## Skin in the game
-Unlike most curators who manage third-party capital exclusively, Api3 deploys a majority of its own treasury as the primary supplier in its vaults.
-This means Api3 has direct financial exposure to every market it enables and every risk decision it makes.
+Unlike most curators who manage third-party capital exclusively, API3 deploys a majority of its own treasury as the primary supplier in its vaults.
+This means API3 has direct financial exposure to every market it enables and every risk decision it makes.
-External depositors are welcome to supply alongside the Api3 treasury, benefiting from the same risk management and yield strategies, with the assurance that Api3's own capital is subject to identical conditions.
+External depositors are welcome to supply alongside the API3 treasury, benefiting from the same risk management and yield strategies, with the assurance that API3's own capital is subject to identical conditions.
## OEV advantage
-Api3 is uniquely positioned as a curator because it is also the oracle provider for its own markets.
+API3 is uniquely positioned as a curator because it is also the oracle provider for its own markets.
This creates a competitive advantage that no other lending protocol or curator has.
-During market turmoil, liquidations on lending markets generate [Oracle Extractable Value (OEV)](/oev/) — value that the oracle has priority in capturing by batching additional operations with price updates.
-On Api3-curated markets, the entirety of this OEV belongs to Api3 as protocol revenue.
+During market turmoil, liquidations on lending markets generate [Oracle Extractable Value (OEV)](/oev/) - value that the oracle has priority in capturing by batching additional operations with price updates.
+On API3-curated markets, the entirety of this OEV belongs to API3 as protocol revenue.
Other protocols, at best, capture only a fraction of the OEV generated on their markets.
-This allows Api3 to set lower curation fees to attract borrowers, which in turn decreases the cost of borrowing.
-While this means supply-side APY may be lower during calm markets, it makes Api3 markets more attractive to borrowers, driving higher utilization and a healthier lending ecosystem.
-The OEV captured during volatile periods more than compensates, providing Api3 with a sustainable revenue stream that is independent of the fee structure.
+This allows API3 to set lower curation fees to attract borrowers, which in turn decreases the cost of borrowing.
+While this means supply-side APY may be lower during calm markets, it makes API3 markets more attractive to borrowers, driving higher utilization and a healthier lending ecosystem.
+The OEV captured during volatile periods more than compensates, providing API3 with a sustainable revenue stream that is independent of the fee structure.
## Vaults
-Api3 operates multiple vaults across Ethereum mainnet, Base, and the Robinhood chain.
+API3 operates multiple vaults across Ethereum mainnet, Base, and the Robinhood chain.
All vaults share the same [role structure](/curation/roles-and-operations) and [risk framework](/curation/risk-management).
-| Vault | Network | Asset | Strategy | Collateral |
-| ------------------------------ | --------- | ----- | ---------------------------------- | -------------------------------------------- |
-| [Api3 Core](#api3-core) | Ethereum | USDC | Conservative, blue-chip collateral | wstETH, cbBTC, kBTC |
-| [Kabu](#kabu) | Ethereum | USDC | Mid-cap governance tokens | MORPHO, EIGEN, ONDO, BAL, SYRUP, COMP, FLUID |
-| [Kabu](#kabu) | Base | WETH | Mid-cap governance tokens | AERO, VVV, MORPHO, VIRTUAL |
-| [Api3 dCOMP](#api3-dcomp) | Ethereum | USDC | Dedicated dCOMP collateral market | dCOMP |
-| [Purinta](#purinta) | Ethereum | USDC | Meme token collateral markets | PEPE, SPX6900, SHIB |
-| [Purinta](#purinta) | Robinhood | USDG | Meme token collateral markets | CASHCAT |
+| Vault | Network | Asset | Strategy |
+| ------------------------------ | --------- | ----- | ---------------------------------- |
+| [Api3 Core](#api3-core) | Ethereum | USDC | Conservative, blue-chip collateral |
+| [Kabu](#kabu) | Ethereum | USDC | Mid-cap governance tokens |
+| [Kabu](#kabu) | Base | WETH | Mid-cap governance tokens |
+| [Api3 dCOMP](#api3-dcomp) | Ethereum | USDC | Dedicated dCOMP collateral market |
+| [Purinta](#purinta) | Ethereum | USDC | Meme token collateral markets |
+| [Purinta](#purinta) | Robinhood | USDG | Meme token collateral markets |
Each vault section below lists the markets it supplies, with the liquidation loan-to-value (LLTV) ratio and supply cap configured for each.
-An LLTV is fixed for the lifetime of a Morpho market, while [supply caps](/curation/risk-management#supply-caps) are reviewed and adjusted as conditions evolve — follow the vault links below for current values.
+An LLTV is fixed for the lifetime of a Morpho market, while [supply caps](/curation/risk-management#supply-caps) are reviewed and adjusted as conditions evolve - follow the vault links below for current values.
### Api3 Core
-Api3 Core is Api3's flagship conservative vault.
-It supplies USDC to lending markets backed by blue-chip collateral — Lido wrapped staked ETH (wstETH), and wrapped BTC issued by Coinbase (cbBTC) and Kraken (kBTC).
+Api3 Core is API3's flagship conservative vault.
+It supplies USDC to lending markets backed by blue-chip collateral - Lido wrapped staked ETH (wstETH), and wrapped BTC issued by Coinbase (cbBTC) and Kraken (kBTC).
These are high-liquidity, battle-tested assets with deep on-chain liquidity and well-established oracle infrastructure.
The vault targets stable, lower-risk yield from borrowing demand against these widely held collateral types.
@@ -101,7 +101,7 @@ Given the higher volatility and lower liquidity of these assets compared to blue
### Api3 dCOMP
-Api3 dCOMP is a vault built around a dedicated lending market collateralized by [dCOMP](https://github.com/api3dao/dcomp) — a lightweight, ownable wrapper for the COMP governance token configured with a specific delegate.
+Api3 dCOMP is a vault built around a dedicated lending market collateralized by [dCOMP](https://github.com/api3dao/dcomp) - a lightweight, ownable wrapper for the COMP governance token configured with a specific delegate.
While preserving the inherent voting power of the underlying COMP, this wrapper allows the owner to reassign the delegated address. Users can wrap their COMP to receive dCOMP tokens, which can then be deposited as collateral. By wrapping COMP into dCOMP, users can effectively amplify the voting power of the designated delegate.
@@ -113,7 +113,7 @@ The Api3 dCOMP vault supplies the USDC borrow-side liquidity for this market, ma
### Purinta
-Purinta is a pair of meme token lending vaults curated by Api3: a USDC vault on Ethereum mainnet and a USDG vault on the Robinhood chain.
+Purinta is a pair of meme token lending vaults curated by API3: a USDC vault on Ethereum mainnet and a USDG vault on the Robinhood chain.
Each supplies the borrow-side liquidity for a set of isolated meme token markets.
Meme tokens are more volatile and higher-risk than blue-chip collateral, so a market is only listed when its token has enough on-chain liquidity to support healthy swaps and liquidations. Supply caps and LLTVs are configured conservatively to limit that exposure.
@@ -152,7 +152,7 @@ Because this market is a yield destination for unallocated liquidity, not part o
## Accessing the vaults
-Each of the vaults can be also accessed through the Morpho app, where Api3 operates as a [verified curator.](https://forum.morpho.org/c/vaults/api3/57) Live figures - total deposits, APY, enabled markets, and current supply caps - are shown there.
+Each of the vaults can be also accessed through the Morpho app, where API3 operates as a [verified curator.](https://forum.morpho.org/c/vaults/api3/57) Live figures - total deposits, APY, enabled markets, and current supply caps - are shown there.
| Vault | Network | Address | Link |
| --------------- | --------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
@@ -165,7 +165,7 @@ Each of the vaults can be also accessed through the Morpho app, where Api3 opera
## Fees
-Each Api3 vault charges a single **5% performance fee** on the interest earned from borrowers (see [vault architecture](/curation/roles-and-operations#vault-architecture)).
+Each API3 vault charges a single **5% performance fee** on the interest earned from borrowers (see [vault architecture](/curation/roles-and-operations#vault-architecture)).
There is no management fee on assets under management.
| Fee type | Amount |
diff --git a/docs/curation/risk-management.md b/docs/curation/risk-management.md
index 63d37bac..190bb7b3 100644
--- a/docs/curation/risk-management.md
+++ b/docs/curation/risk-management.md
@@ -8,26 +8,26 @@ outline: deep
# Risk management
-Api3's curation risk framework builds on the same rigorous evaluation processes used for its data feed listing policies — processes that have maintained Api3's track record of never misreporting a data feed.
+API3's curation risk framework builds on the same rigorous evaluation processes used for its data feed listing policies - processes that have maintained API3's track record of never misreporting a data feed.
## Market selection
-The primary prerequisite for listing a collateral asset is that it passes the Api3 data feed listing policy.
-This policy avoids many common industry pitfalls — for example, it prevents listing "stablecoin" assets with weakly protected minting functions.
+The primary prerequisite for listing a collateral asset is that it passes the API3 data feed listing policy.
+This policy avoids many common industry pitfalls - for example, it prevents listing "stablecoin" assets with weakly protected minting functions.
An asset that passes the listing policy is eligible for market creation.
-Beyond the listing policy, Api3 evaluates:
+Beyond the listing policy, API3 evaluates:
-- **Token liquidity** — Is there sufficient on-chain liquidity to support healthy liquidations under adverse market conditions?
-- **Token volatility** — Volatile tokens can be listed as long as there is enough liquidity. In these cases, market parameters (such as LLTV) are set conservatively.
-- **Smart contract risk** — Has the collateral token been audited and battle-tested in production?
+- **Token liquidity** - Is there sufficient on-chain liquidity to support healthy liquidations under adverse market conditions?
+- **Token volatility** - Volatile tokens can be listed as long as there is enough liquidity. In these cases, market parameters (such as LLTV) are set conservatively.
+- **Smart contract risk** - Has the collateral token been audited and battle-tested in production?
-Api3 also lists assets that are unique on the market to fill gaps in the lending ecosystem, even when borrowing demand is not yet established.
+API3 also lists assets that are unique on the market to fill gaps in the lending ecosystem, even when borrowing demand is not yet established.
## Supply caps
Each enabled market is assigned a supply cap that limits the maximum amount the vault can allocate to that market.
-Supply caps are set according to Api3's internal risk guidelines and are calibrated based on:
+Supply caps are set according to API3's internal risk guidelines and are calibrated based on:
- The collateral asset's on-chain liquidity depth
- Historical and expected borrowing demand
@@ -38,26 +38,26 @@ Caps are reviewed and adjusted as market conditions evolve.
## Oracles
-Every lending market relies on a price feed to value collateral and trigger liquidations. The markets Api3 creates and curates are priced by Api3's own data feeds, read on-chain through [Api3ReaderProxyV1](/dapps/integration/contract-integration).
+Every lending market relies on a price feed to value collateral and trigger liquidations. The markets API3 creates and curates are priced by API3's own data feeds, read on-chain through [Api3ReaderProxyV1](/dapps/integration/contract-integration).
-These are first-party feeds: prices are signed by the data sources themselves, with no third-party node operators sitting between the source and the chain. Removing that intermediary layer eliminates a common source of oracle manipulation and downtime, and underpins Api3's track record of never misreporting a data feed. This considerably reduces the oracle risk that depositors are exposed to compared with markets that rely on third-party oracles.
+These are first-party feeds: prices are signed by the data sources themselves, with no third-party node operators sitting between the source and the chain. Removing that intermediary layer eliminates a common source of oracle manipulation and downtime, and underpins API3's track record of never misreporting a data feed. This considerably reduces the oracle risk that depositors are exposed to compared with markets that rely on third-party oracles.
-Because Api3 is both the curator and the oracle provider for these markets, the party setting risk parameters and the party operating the price feed are one and the same. Api3 also captures the [Oracle Extractable Value (OEV)](/oev/) generated during liquidations as protocol revenue.
+Because API3 is both the curator and the oracle provider for these markets, the party setting risk parameters and the party operating the price feed are one and the same. API3 also captures the [Oracle Extractable Value (OEV)](/oev/) generated during liquidations as protocol revenue.
## Smart contract security
The vaults are built on Morpho's audited contracts. Morpho Blue (the underlying market protocol), the Morpho Vault V2 standard, and the market adapter through which the vaults supply liquidity have each been reviewed by multiple independent firms, including Spearbit, OpenZeppelin, Zellic, ChainSecurity, and Certora. The full list is published in [Morpho's audit overview.](https://docs.morpho.org/overview/resources/audits/)
-The [dCOMP](https://github.com/api3dao/dcomp) wrapper used by the Api3 dCOMP vault is an intentionally minimal, source-verified contract built by Api3 and provided as-is. As with any smart contract, residual risk remains; see the [disclosure](/curation/disclosure#risks) for the full statement on smart contract risk.
+The [dCOMP](https://github.com/api3dao/dcomp) wrapper used by the Api3 dCOMP vault is an intentionally minimal, source-verified contract built by API3 and provided as-is. As with any smart contract, residual risk remains; see the [disclosure](/curation/disclosure#risks) for the full statement on smart contract risk.
## Treasury-backed risk alignment
-A distinguishing feature of Api3's curation is that Api3 deploys a majority of its own treasury as vault supply.
+A distinguishing feature of API3's curation is that API3 deploys a majority of its own treasury as vault supply.
This creates a direct alignment of incentives:
-- Api3 bears the primary and largest loss in the event of bad debt.
-- Every risk parameter decision — market selection, supply caps, LLTV configuration — directly affects Api3's own capital.
-- External depositors benefit from the same risk management applied to protect the Api3 treasury.
+- API3 bears the primary and largest loss in the event of bad debt.
+- Every risk parameter decision - market selection, supply caps, LLTV configuration - directly affects API3's own capital.
+- External depositors benefit from the same risk management applied to protect the API3 treasury.
This "skin in the game" model stands in contrast to curators who manage exclusively third-party capital with limited personal exposure to their risk decisions.
@@ -65,4 +65,4 @@ This "skin in the game" model stands in contrast to curators who manage exclusiv
A lending market incurs bad debt when a borrower's collateral can no longer cover their debt and the position cannot be fully liquidated - typically during sharp price moves or when collateral liquidity dries up. Conservative supply caps, LLTV settings, and healthy [liquidation markets](/curation/roles-and-operations#liquidations) are the primary defenses against this.
-When bad debt does occur in a Morpho market, it is borne proportionally across all of that market's suppliers. Because Api3 supplies the majority of each vault from its own treasury, it is the largest supplier and absorbs the largest share of any such loss. This is the practical meaning of Api3's [skin in the game](/curation/#skin-in-the-game): it is an alignment of incentives, not a backstop, and Api3 does not commit to compensate third-party depositors for losses (see the [disclosure](/curation/disclosure#no-guarantees)).
+When bad debt does occur in a Morpho market, it is borne proportionally across all of that market's suppliers. Because API3 supplies the majority of each vault from its own treasury, it is the largest supplier and absorbs the largest share of any such loss. This is the practical meaning of API3's [skin in the game](/curation/#skin-in-the-game): it is an alignment of incentives, not a backstop, and API3 does not commit to compensate third-party depositors for losses (see the [disclosure](/curation/disclosure#no-guarantees)).
diff --git a/docs/curation/roles-and-operations.md b/docs/curation/roles-and-operations.md
index 9870da8f..c2dd255f 100644
--- a/docs/curation/roles-and-operations.md
+++ b/docs/curation/roles-and-operations.md
@@ -8,53 +8,53 @@ outline: deep
# Roles and operations
-All Api3 vaults share the same role structure and operational setup stewarded by the API3 Foundation.
+All API3 vaults share the same role structure and operational setup stewarded by the API3 Foundation.
## Roles
| Role | Held by |
| --------- | ------------------------------------------------ |
-| Owner | Api3 Foundation Multisig |
-| Curator | Api3 Foundation |
-| Allocator | Api3 allocation bot and Api3 Foundation Multisig |
-| Sentinel | Api3 monitoring team |
+| Owner | API3 Foundation Multisig |
+| Curator | API3 Foundation |
+| Allocator | API3 allocation bot and API3 Foundation Multisig |
+| Sentinel | API3 monitoring team |
-All four roles are controlled by Api3, consolidating governance and operational control under a single entity whose express mission is the development, operation, and maintenance of Api3 services and operations. The Api3 Foundation Multisig holds the owner role, which controls top-level permissions and appoints the curator and sentinels. The curator configures risk parameters - enabled markets, supply caps, fees, and interest rate limits. The allocator role, held by an automated Api3 bot alongside the multisig, moves capital between enabled markets. Role names correspond to terminology in underlying smart contracts and protocols, and do not carry any legal nor other significance or meaning.
+All four roles are controlled by API3, consolidating governance and operational control under a single entity whose express mission is the development, operation, and maintenance of API3 services and operations. The API3 Foundation Multisig holds the owner role, which controls top-level permissions and appoints the curator and sentinels. The curator configures risk parameters - enabled markets, supply caps, fees, and interest rate limits. The allocator role, held by an automated API3 bot alongside the multisig, moves capital between enabled markets. Role names correspond to terminology in underlying smart contracts and protocols, and do not carry any legal nor other significance or meaning.
-The sentinel role is operated by the Api3 monitoring team, who can reactively reduce risk - deallocating assets, decreasing caps, or revoking pending timelocked actions - in case of misconfiguration or adverse market conditions.
-The monitoring team also maintains an emergency fund for manual liquidations in the event that automated liquidation bots fail. Api3 provides no guarantee of the effectiveness or sufficiency of such bots or emergency fund's operation.
+The sentinel role is operated by the API3 monitoring team, who can reactively reduce risk - deallocating assets, decreasing caps, or revoking pending timelocked actions - in case of misconfiguration or adverse market conditions.
+The monitoring team also maintains an emergency fund for manual liquidations in the event that automated liquidation bots fail. API3 provides no guarantee of the effectiveness or sufficiency of such bots or emergency fund's operation.
## Vault architecture
-Each Api3 vault is a [Morpho Vault V2](https://docs.morpho.org/learn/concepts/vault-v2/) that supplies the assets directly to a curated set of isolated Morpho markets:
+Each API3 vault is a [Morpho Vault V2](https://docs.morpho.org/learn/concepts/vault-v2/) that supplies the assets directly to a curated set of isolated Morpho markets:
```
Depositor → Vault → Adapter → Morpho Markets
```
-Depositors supply the vault's asset (such as USDC) and receive vault shares. The vault routes capital into the underlying Morpho markets through a market adapter, and the Api3 role structure and governance controls described above apply at the vault level. The 5% performance fee is charged here (see [Fees](/curation/#fees)).
+Depositors supply the vault's asset (such as USDC) and receive vault shares. The vault routes capital into the underlying Morpho markets through a market adapter, and the API3 role structure and governance controls described above apply at the vault level. The 5% performance fee is charged here (see [Fees](/curation/#fees)).
Changes that could increase risk to depositors - adding a market adapter or raising a supply cap - are subject to a 7-day timelock, giving depositors advance notice before they take effect. The sentinel can act immediately to reduce risk.
## Allocation and rebalancing
Capital allocation across markets is automated.
-The Api3 allocation bot monitors market conditions and rebalances the vault's positions to maintain target utilization and competitive APY.
+The API3 allocation bot monitors market conditions and rebalances the vault's positions to maintain target utilization and competitive APY.
When an enabled market lacks borrowing demand, the bot can supply the vault's otherwise-idle assets to a deep, blue-chip market (such as wstETH/USDC) so that they continue to earn yield.
A portion of vault liquidity is kept readily withdrawable to assist with depositor withdrawals and mitigate delays. In addition, the Vault V2 design lets anyone permissionlessly pull supplied liquidity back from a market into the vault - a forced deallocation, subject to a small penalty - when liquidity is needed. Neither mechanism guarantees delay-free withdrawal.
## Monitoring
-Api3 leverages its existing data feed infrastructure to monitor token liquidity and market conditions — the same infrastructure that powers its oracle operations.
+API3 leverages its existing data feed infrastructure to monitor token liquidity and market conditions - the same infrastructure that powers its oracle operations.
-- **Liquidity bots** — Ensure smooth and automatic management of vault positions and market allocations.
-- **Risk engine alerts** — An alerts-based system that flags suspicious activity, unusual market conditions, or parameter deviations.
-- **24/7 monitoring team** — Api3's monitoring team handles escalations from the risk engine around the clock.
+- **Liquidity bots** - Ensure smooth and automatic management of vault positions and market allocations.
+- **Risk engine alerts** - An alerts-based system that flags suspicious activity, unusual market conditions, or parameter deviations.
+- **24/7 monitoring team** - API3's monitoring team handles escalations from the risk engine around the clock.
## Liquidations
Healthy liquidation markets are essential for vault safety.
When borrowers become undercollateralized, third-party liquidation bots may repay their debt and claim collateral at a discount, aiming to keep the vault solvent.
-In the event that automated liquidation bots fail to act, the Api3 monitoring team can execute manual liquidations using a dedicated emergency fund. The amount and usage of such fund is at Api3's sole discretion.
+In the event that automated liquidation bots fail to act, the API3 monitoring team can execute manual liquidations using a dedicated emergency fund. The amount and usage of such fund is at API3's sole discretion.
diff --git a/docs/dapps/index.md b/docs/dapps/index.md
index 14924223..bbdb16bb 100644
--- a/docs/dapps/index.md
+++ b/docs/dapps/index.md
@@ -7,11 +7,11 @@ pageHeader: dApps
# "Oracles that pay you"
-Api3 provides data feeds and pays dApps for using them.
+API3 provides data feeds and pays dApps for using them.
-1. [Api3 Market](#api3-market) serves a large and dynamic catalog of data feeds on all major EVM networks.
+1. [API3 Market](#api3-market) serves a large and dynamic catalog of data feeds on all major EVM networks.
-2. Api3 enables the Oracle Extractable Value (OEV) resulting from the usage of these data feeds to be captured, and pays it to the respective dApps in the form of [OEV Rewards.](#oev-rewards)
+2. API3 enables the Oracle Extractable Value (OEV) resulting from the usage of these data feeds to be captured, and pays it to the respective dApps in the form of [OEV Rewards.](#oev-rewards)
::: info 💡 Tip
@@ -19,12 +19,12 @@ For quick reference, you can copy-paste [`llms-full.txt`](https://docs.api3.org/
:::
-## Api3 Market
+## API3 Market
Liquidity is increasingly shifting to newly launched L2 networks, and dApps that are able to branch out to these more quickly are at a significant competitive advantage.
For dApps that utilize data feeds, this is only possible with a data feed provider that has recognized this fact and designed their solutions accordingly.
-Our answer to this is [Api3 Market,](https://market.api3.org/) which enables a dApp developer to purchase a plan for the data feed they need and integrate it within minutes, without speaking to a representative or signing a contract.
+Our answer to this is [API3 Market,](https://market.api3.org/) which enables a dApp developer to purchase a plan for the data feed they need and integrate it within minutes, without speaking to a representative or signing a contract.
Furthermore, the whole system is designed to streamline the addition of support for new networks and data feed types, resulting in a large and dynamic catalog.
## OEV Rewards
@@ -36,11 +36,11 @@ Rent-seeking third parties can exploit this fact to extract funds from data feed
[Oracle Extractable Value (OEV)](https://medium.com/api3/oracle-extractable-value-oev-13c1b6d53c5b) is a subset of MEV that oracles have priority in extracting by batching additional operations with their updates.
Furthermore, instead of searching for such OEV opportunities themselves, oracles can auction off this privilege.
-Api3 facilitates the capturing of such OEV opportunities, and pays 80% of the associated revenue to the respective partner dApps in the form of [OEV Rewards](/dapps/oev-rewards/), which serves as a new and sustainable revenue stream for them.
+API3 facilitates the capturing of such OEV opportunities, and pays 80% of the associated revenue to the respective partner dApps in the form of [OEV Rewards](/dapps/oev-rewards/), which serves as a new and sustainable revenue stream for them.
::: info ⚠️ Disclaimer
-We refer you to the Api3 [terms and conditions](https://api3.org/terms-and-conditions/), which apply to all services and software provided by Api3 (including but not limited to data feeds, and any example OEV bots).
+We refer you to the API3 [terms and conditions](https://api3.org/terms-and-conditions/), which apply to all services and software provided by API3 (including but not limited to data feeds, and any example OEV bots).
Nothing in this documentation nor related materials should be interpreted as financial, business, nor professional advice.
:::
diff --git a/docs/dapps/integration/aggregatorv2v3interface.md b/docs/dapps/integration/aggregatorv2v3interface.md
index 95082483..ce95ab1a 100644
--- a/docs/dapps/integration/aggregatorv2v3interface.md
+++ b/docs/dapps/integration/aggregatorv2v3interface.md
@@ -12,7 +12,7 @@ All considerations from the [contract integration page](/dapps/integration/contr
::: info ⚠️ Warning
-Api3 data feeds are aggregated from asynchronous data feeds to provide maximal availability guarantees, which means they are not updated in rounds.
+API3 data feeds are aggregated from asynchronous data feeds to provide maximal availability guarantees, which means they are not updated in rounds.
As a side effect, Api3ReaderProxyV1 does not implement the round-related functionality of AggregatorV2V3Interface.
If your contract depends on round-related functionality, it would not be appropriate to use Api3ReaderProxyV1 via AggregatorV2V3Interface.
Instead, we recommend using IApi3ReaderProxy with a custom adapter that fits your specific needs.
@@ -43,7 +43,7 @@ On the other hand, you should not interact with Api3ReaderProxyV1 through Aggreg
DeFi protocols such as perpetual derivative exchanges are typically vulnerable to MEV searchers performing time arbitrage.
Chainlink data feeds provide past round data primarily to address this issue, but this solution significantly degrades UX by requiring multiple transactions for certain actions.
-Instead, you can simply read the latest data feed value from an Api3 data feed and receive compensation for time arbitrage value extraction through [OEV Rewards.](/dapps/oev-rewards/)
+Instead, you can simply read the latest data feed value from an API3 data feed and receive compensation for time arbitrage value extraction through [OEV Rewards.](/dapps/oev-rewards/)
:::
diff --git a/docs/dapps/integration/api3-contracts.md b/docs/dapps/integration/api3-contracts.md
index 16e052e2..b52204bb 100644
--- a/docs/dapps/integration/api3-contracts.md
+++ b/docs/dapps/integration/api3-contracts.md
@@ -7,12 +7,12 @@ pageHeader: dApps → Integration
# `@api3/contracts`
-[`@api3/contracts`](https://www.npmjs.com/package/@api3/contracts) is an npm package that provides three basic features for Api3 data feed users:
+[`@api3/contracts`](https://www.npmjs.com/package/@api3/contracts) is an npm package that provides three basic features for API3 data feed users:
1. `@api3/contracts/interfaces/IApi3ReaderProxy.sol` is imported by contracts that call Api3ReaderProxyV1 contracts through IApi3ReaderProxy.
2. `@api3/contracts/mock/MockApi3ReaderProxy.sol` is used in tests.
-3. - `computeCommunalApi3ReaderProxyV1Address()` is used to validate adresses shown by Api3 Market when ["Skip OEV Rewards"](/dapps/integration/index.md#integration-information) is selected.
- - `computeDappSpecificApi3ReaderProxyV1Address()` is used to validate adresses shown by Api3 Market when ["Earn OEV Rewards"](/dapps/integration/index.md#integration-information) is selected.
+3. - `computeCommunalApi3ReaderProxyV1Address()` is used to validate addresses shown by API3 Market when ["Skip OEV Rewards"](/dapps/integration/index.md#integration-information) is selected.
+ - `computeDappSpecificApi3ReaderProxyV1Address()` is used to validate addresses shown by API3 Market when ["Earn OEV Rewards"](/dapps/integration/index.md#integration-information) is selected.
For detailed examples of how to use these features, see the [`data-feed-reader-example` repository.](https://github.com/api3dao/data-feed-reader-example)
diff --git a/docs/dapps/integration/contract-integration.md b/docs/dapps/integration/contract-integration.md
index 6833d6f9..978970b7 100644
--- a/docs/dapps/integration/contract-integration.md
+++ b/docs/dapps/integration/contract-integration.md
@@ -8,22 +8,22 @@ outline: deep
# Contract integration
-This page provides important information on how to integrate Api3 data feeds into a contract.
+This page provides important information on how to integrate API3 data feeds into a contract.
Please read it in its entirety before attempting an integration.
::: info ⚠️ Warning
-Api3 does not authorize any members or affiliates to provide security advice.
+API3 does not authorize any members or affiliates to provide security advice.
You are solely responsible for following the instructions on this page.
:::
## Api3ReaderProxyV1
-Api3ReaderProxyV1 is a contract that is used to read a specific Api3 data feed.
+Api3ReaderProxyV1 is a contract that is used to read a specific API3 data feed.
For example, to read ETH/USD on Ethereum, one can simply call the [`read()` function](https://etherscan.io/address/0x5b0cf2b36a65a6BB085D501B971e4c102B9Cd473#readProxyContract#F17) of a respective Api3ReaderProxyV1.
-You can use Api3 Market to see the Api3ReaderProxyV1 address you should use for a specific data feed, as described [here.](/dapps/integration/index.md#integration-information)
+You can use API3 Market to see the Api3ReaderProxyV1 address you should use for a specific data feed, as described [here.](/dapps/integration/index.md#integration-information)
To summarize, you should use the Api3ReaderProxyV1 address that appears after selecting "Earn OEV Rewards" and entering the name of your dApp.
::: info ⚠️ Warning
@@ -34,7 +34,7 @@ To be eligible for OEV Rewards, you are required to use the Api3ReaderProxyV1 co
### Printing Api3ReaderProxyV1 addresses
-For your convenience, Api3 representatives may deploy OEV Rewards-enabled Api3ReaderProxyV1 contracts on your behalf and provide you with a list of commands that will print their addresses.
+For your convenience, API3 representatives may deploy OEV Rewards-enabled Api3ReaderProxyV1 contracts on your behalf and provide you with a list of commands that will print their addresses.
By running these commands yourself, you can ensure that you are using the correct addresses.
::: info 💡 Tip
@@ -44,7 +44,7 @@ Since Api3ReaderProxyV1 is deployed deterministically, the lack of verification
:::
-These commands should be in the following format, where the dApp alias (assigned to you by Api3 during [registration](/dapps/oev-rewards/index.md#how-to-get-onboard)), chain ID, and dAPI names match your specific case:
+These commands should be in the following format, where the dApp alias (assigned to you by API3 during [registration](/dapps/oev-rewards/index.md#how-to-get-onboard)), chain ID, and dAPI names match your specific case:
```sh
npx @api3/contracts@latest print-api3readerproxyv1-address \
@@ -60,11 +60,11 @@ dApp alias: lendle
chain: Mantle
dAPI name: ETH/USD
• Please confirm that https://market.api3.org/mantle/eth-usd points to an active feed.
-• Your proxy address is https://mantlescan.xyz/address/0x776E79D916e49BBDb8FEe0F43fF148C2Ed3bE125
+• Your proxy is at https://mantlescan.xyz/address/0x776E79D916e49BBDb8FEe0F43fF148C2Ed3bE125
Please confirm that there is a contract deployed at this address before using it.
```
-Note that if an Api3 representative has provided you with this command, you can expect the Market page to point to an active feed and the proxy to already be deployed.
+Note that if an API3 representative has provided you with this command, you can expect the Market page to point to an active feed and the proxy to already be deployed.
Do not proceed with the integration until you confirm both conditions.
### Reading the data feed
@@ -96,7 +96,7 @@ It is good practice to validate against such conditions, as in `require(value >
:::
-All Api3 data feeds have 18 decimals.
+All API3 data feeds have 18 decimals.
For example, if ETH/USD is `2918.5652133`, `value` will read `2918565213300000000000`.
::: info ⚠️ Warning
@@ -135,7 +135,7 @@ However, unless your contract design specifically relies on the data feed value
::: info 💡 Tip
-Your auditors may not be familiar with best practices in the context of Api3 data feeds.
+Your auditors may not be familiar with best practices in the context of API3 data feeds.
We recommend directing them to this page.
:::
@@ -149,9 +149,9 @@ For example, you can combine an `ETH/USD` Api3ReaderProxyV1 contract and a `wstE
Some dApps choose to mix oracle solutions, either by refusing service if they are not in consensus, or by using one primarily and deferring to another in case of inconsistency.
-In such setups, Api3 data feeds need to be treated differently due to OEV considerations.
+In such setups, API3 data feeds need to be treated differently due to OEV considerations.
Specifically, the vast majority of OEV is extracted during times of volatility, and allowing other oracle solutions interfere during such times may result in the loss of a significant amount of OEV revenue, reducing your [OEV Rewards](/dapps/oev-rewards/).
-The golden standard is only using Api3 data feeds, and if you must use Api3 data feeds as your primary source with another solution as a fallback, you should tolerate as much inconsistency as possible.
+The golden standard is only using API3 data feeds, and if you must use API3 data feeds as your primary source with another solution as a fallback, you should tolerate as much inconsistency as possible.
::: info 💡 Tip
@@ -160,8 +160,8 @@ Based on our analysis, any less will hinder OEV extraction during times of high
:::
-Note that using Api3 data feeds for only some asset prices still counts as a mixed design.
-Consider a lending platform that uses the ETH/USD Api3 data feed and the USDT/USD data feed from another oracle solution.
+Note that using API3 data feeds for only some asset prices still counts as a mixed design.
+Consider a lending platform that uses the ETH/USD API3 data feed and the USDT/USD data feed from another oracle solution.
A user takes out a USDT loan with ETH collateral, and the following price action renders the position liquidatable once the ETH/USD data feed is updated.
However, a rogue USDT/USD update by the other oracle solution may expose the OEV opportunity to the public before it can be claimed for you.
diff --git a/docs/dapps/integration/index.md b/docs/dapps/integration/index.md
index d314051e..685b1115 100644
--- a/docs/dapps/integration/index.md
+++ b/docs/dapps/integration/index.md
@@ -1,20 +1,20 @@
---
-title: Using Api3 Market
+title: Using API3 Market
pageHeader: dApps → Integration
outline: deep
---
-# Using Api3 Market
+# Using API3 Market
-See the [Quickstart](/dapps/quickstart/index.md) page for a basic guide on how to use [Api3 Market.](https://market.api3.org/)
+See the [Quickstart](/dapps/quickstart/index.md) page for a basic guide on how to use [API3 Market.](https://market.api3.org/)
This page provides further details about using it in production.
## Update parameters
Update parameters specify the conditions that trigger a data feed update.
-Api3 Market supports two update parameters: [deviation threshold](#deviation-threshold) and [heartbeat interval](#heartbeat-interval).
+API3 Market supports two update parameters: [deviation threshold](#deviation-threshold) and [heartbeat interval](#heartbeat-interval).
### Deviation threshold
@@ -30,7 +30,7 @@ When we refer to a 1% deviation threshold, we mean that at the time of a deviati
:::
-Api3 Market offers the following deviation threshold options:
+API3 Market offers the following deviation threshold options:
- 5%
- 2.5%
@@ -42,7 +42,7 @@ Api3 Market offers the following deviation threshold options:
We assume that lower deviation thresholds are always more desirable, and thus do not validate if updates are necessary according to the update parameters.
In simpler terms, a data feed with a 1% deviation threshold can be updated even if it has only deviated by 0.5%.
-For rare use cases that require different behavior, we do not recommend using Api3 data feeds.
+For rare use cases that require different behavior, we do not recommend using API3 data feeds.
:::
@@ -53,7 +53,7 @@ Consequently, you can expect higher [prices](#pricing) for lower deviation thres
A heartbeat is a data feed update that is made to uphold a maximum period of time between two consecutive updates, which is called the **heartbeat interval**.
-Api3 Market only offers a 24-hour heartbeat interval.
+API3 Market only offers a 24-hour heartbeat interval.
::: info ℹ️ Info
@@ -66,7 +66,7 @@ Note that this still does not provide a hard guarantee, and your contract should
## Plan durations
-Api3 Market offers 7-day plans on testnets and 3-month plans on mainnets.
+API3 Market offers 7-day plans on testnets and 3-month plans on mainnets.
Each purchased plan has an expiration date, and the respective update parameters will stop being upheld after that.
Let's go over a few example cases:
@@ -83,13 +83,13 @@ Let's go over a few example cases:
The user purchases a 1% deviation threshold for 3 months (with a [discount](#discounts)).
The data feed will continue running with a 0.5% deviation threshold for 1 month, switch to a 1% deviation threshold, run for another 2 months, and deactivate.
-When plans with different deviation parameters are queued, the Api3 Market interface displays them as shown below.
+When plans with different deviation parameters are queued, the API3 Market interface displays them as shown below.
::: info 💡 Tip
-Once a plan has been purchased, Api3 guarantees that the [update parameters](#update-parameters) will be upheld for the [plan duration](#plan-durations).
+Once a plan has been purchased, API3 guarantees that the [update parameters](#update-parameters) will be upheld for the [plan duration](#plan-durations).
However, it is the user's responsibility to ensure that plans are purchased to keep the data feed active as long as necessary.
You can use the "Set Reminder" button under the expiration date to avoid forgetting to renew your plans.
@@ -107,7 +107,7 @@ We maintain a history of data feed update gas costs and update counts required t
::: info 💰 Financial
-The prices you see on Api3 Market are the exact operational costs that we estimate (or $0.05/day, whichever is higher).
+The prices you see on API3 Market are the exact operational costs that we estimate (or $0.05/day, whichever is higher).
This means that it is unlikely that you will find a better bargain.
We do not plan to monetize data feed plans at any point.
@@ -127,7 +127,7 @@ To resume updates in such cases, simply purchase a new plan.
:::
-If we overestimate the price, the remainder rolls over to the next plan purchased for the same network–data feed pair, which appears as a **discount** on Api3 Market as seen below.
+If we overestimate the price, the remainder rolls over to the next plan purchased for the same network-data feed pair, which appears as a **discount** on API3 Market as seen below.
Similarly, when a user purchases a plan for a data feed that is already active, the remainder of the payments made for earlier purchases will appear as a discount.
@@ -165,14 +165,14 @@ Follow the OEV Rewards [onboarding steps](/dapps/oev-rewards/index.md#how-to-get
## Verifying first-party sources
-The term _first-party oracle_ is coined in the Api3 whitepaper and refers to an API provider that provides oracle services without depending on any middlemen.
+The term _first-party oracle_ is coined in the API3 whitepaper and refers to an API provider that provides oracle services without depending on any middlemen.
There are three conditions to be verified to check if an oracle service is first-party:
- The operator of each individual node must also operate an independent API service as their primary business model for them to be called API providers.
- Each API provider must certify their public key and sign their data with the respective private key.
- Each API provider must make their signed data available themselves, without depending on third-party APIs, blockchains, or state channels.
-Api3 provides the only first-party oracle solution.
+API3 provides the only first-party oracle solution.
Furthermore, we have implemented functionality for the public to be able to easily audit this.
On a data feed page, when you hover your mouse over the logo of a source, you can observe the Market frontend verifying the conditions above in real-time.
diff --git a/docs/dapps/integration/security-considerations.md b/docs/dapps/integration/security-considerations.md
index e37c275e..cc30cfb4 100644
--- a/docs/dapps/integration/security-considerations.md
+++ b/docs/dapps/integration/security-considerations.md
@@ -12,14 +12,14 @@ Therefore, as long as you continue to use it, there will be ongoing security con
::: info ℹ️ Info
-Api3 data feeds have never misreported or experienced an outage.
+API3 data feeds have never misreported or experienced an outage.
This page merely discusses theoretical scenarios that apply to any data feed.
:::
## Smart contract risk
-Imperfections in a smart contract implementation may cause it to behave unexpectedly, potentially resulting in financial losses for interacting parties—a scenario known as smart contract risk.
+Imperfections in a smart contract implementation may cause it to behave unexpectedly, potentially resulting in financial losses for interacting parties - a scenario known as smart contract risk.
Like all smart contracts, Api3ReaderProxyV1 carries this inherent risk.
We propose three methods to assess the smart contract risk.
@@ -30,10 +30,10 @@ Our [contract developer docs](https://github.com/api3dao/contracts/tree/main/doc
## Privileged accounts
-Api3ReaderProxyV1 is a [UUPS-upgradeable](https://eips.ethereum.org/EIPS/eip-1822) contract, which can be upgraded by [a 4-of-8 multisig](https://github.com/api3dao/contracts/blob/main/data/manager-multisig-metadata.json#L2) that is owned by members of the Api3 technical team.
+Api3ReaderProxyV1 is a [UUPS-upgradeable](https://eips.ethereum.org/EIPS/eip-1822) contract, which can be upgraded by [a 4-of-8 multisig](https://github.com/api3dao/contracts/blob/main/data/manager-multisig-metadata.json#L2) that is owned by members of the API3 technical team.
This upgradeability feature is intended to be used only in exceptional occasions to respond to newly discovered compiler, library or contract vulnerabilities, or to migrate users to potential new versions of the contracts.
-[A 4-of-4 multisig,](https://github.com/api3dao/contracts/blob/main/data/dapi-management-metadata.json#L2) which again is owned by members of the Api3 technical team, approves the root of a Merkle tree containing data feed configurations.
+[A 4-of-4 multisig,](https://github.com/api3dao/contracts/blob/main/data/dapi-management-metadata.json#L2) which again is owned by members of the API3 technical team, approves the root of a Merkle tree containing data feed configurations.
This means adding, removing or replacing API providers that contribute to the aggregation of data feeds requires signatures from all owners of this multisig.
::: info ℹ️ Info
@@ -45,12 +45,12 @@ Multisig signers have access to this data and are responsible for its verificati
## Data correctness
-The [Api3 whitepaper](https://github.com/api3dao/api3-whitepaper) poses that all oracle data comes from API providers in practice, and the trust-minimized way to receive data from an API provider is for there to be no third-party intermediaries.
+The [API3 whitepaper](https://github.com/api3dao/api3-whitepaper) poses that all oracle data comes from API providers in practice, and the trust-minimized way to receive data from an API provider is for there to be no third-party intermediaries.
We have coined the term _first-party oracle_ to refer to this architecture, where API providers deliver oracle services without needing third parties to facilitate.
-Api3 data feeds are on-chain aggregations of data feeds powered by individual first-party oracles.
-Each API provider powers a single-source data feed on-chain, and the Api3 data feed is an on-chain median of these individual data feeds, which provides the strongest security guarantees (for example, compared to off-chain aggregation).
-You can easily verify the first-party nature of our data feeds [directly on the data feed page in Api3 Market.](/dapps/integration/index.md#verifying-first-party-sources)
+API3 data feeds are on-chain aggregations of data feeds powered by individual first-party oracles.
+Each API provider powers a single-source data feed on-chain, and the API3 data feed is an on-chain median of these individual data feeds, which provides the strongest security guarantees (for example, compared to off-chain aggregation).
+You can easily verify the first-party nature of our data feeds [directly on the data feed page in API3 Market.](/dapps/integration/index.md#verifying-first-party-sources)
::: info ⚠️ Warning
@@ -60,7 +60,7 @@ First, an API provider is a business that provides an API as a service, and most
Second, even when a Pyth oracle is an API provider, their data is aggregated and served through Wormhole, introducing a third-party point of failure.
In general, when oracle services use an intermediary blockchain or state channel for delivery, they create a third-party system since the intermediary's consensus model will not match the aggregation model.
-Consider a system where 7 API providers supply data and 100+ node operators provide aggregation and data availability—this creates two points of failure, typical of third-party oracle designs.
+Consider a system where 7 API providers supply data and 100+ node operators provide aggregation and data availability - this creates two points of failure, typical of third-party oracle designs.
The secondary point of failure (the node operators) is typically weaker than the primary one (the API providers).
Consequently, when dApps use Pyth data on Ethereum, users pay Ethereum gas fees while only receiving security equivalent to [Wormhole.](https://www.google.com/search?q=wormhole+outage+downtime+"pyth")
@@ -68,23 +68,21 @@ Consequently, when dApps use Pyth data on Ethereum, users pay Ethereum gas fees
## Update parameters
-Once a plan is purchased on Api3 Market, the respective data feed will maintain the advertised deviation threshold and heartbeat interval until plan expiration.
-This depends on the Api3 technical team to keep the wallets that will send the update transactions funded, and maintain the infrastructure that will use these wallets to send the update transactions.
+Once a plan is purchased on API3 Market, the respective data feed will maintain the advertised deviation threshold and heartbeat interval until plan expiration.
+This depends on the API3 technical team to keep the wallets that will send the update transactions funded, and maintain the infrastructure that will use these wallets to send the update transactions.
The operation is backed by the technical team's continuous monitoring, automated alerts, and redundant infrastructure layers.
::: info ℹ️ Info
-We have been providing oracle services as early as [2019](https://etherscan.io/txs?a=0x78e76126719715eddf107cd70f3a31dddf31f85a&p=1029), and were listed as the [best responding oracle](/assets/reputation-link.CxhU2iIj.png) among all Chainlink oracles by [`reputation.link`](https://www.google.com/search?q=%22reputation.link%22+chainlink) as of September 2020, which is when we published the [Api3 whitepaper](https://github.com/api3dao/api3-whitepaper) and requested to be removed from Chainlink data feeds.
+We have been providing oracle services as early as [2019](https://etherscan.io/txs?a=0x78e76126719715eddf107cd70f3a31dddf31f85a&p=1029), and were listed as the [best responding oracle](/img/reputation-link.png) among all Chainlink oracles by [`reputation.link`](https://www.google.com/search?q=%22reputation.link%22+chainlink) as of September 2020, which is when we published the [API3 whitepaper](https://github.com/api3dao/api3-whitepaper) and requested to be removed from Chainlink data feeds.
An important driving factor for this was our insight into systemic issues that could harm users and our confidence in building a better solution.
With this understanding, we designed our architecture and operations from the ground up, leading to our current performance.
-
-
:::
## Data availability
-We obtain API provider-signed data for feed updates from publicly accessible APIs (the same ones you can use to [verify first-party sources on Api3 Market.](/dapps/integration/index.md#verifying-first-party-sources))
+We obtain API provider-signed data for feed updates from publicly accessible APIs (the same ones you can use to [verify first-party sources on API3 Market.](/dapps/integration/index.md#verifying-first-party-sources))
While similar to the [Coinbase price oracle](https://www.coinbase.com/blog/introducing-the-coinbase-price-oracle), our approach involves multiple API providers using our standardized protocol, enabling aggregation.
As a result, even if we cease updating a data feed, further updates remain possible.
MEV searchers, for instance, can access these APIs to perform financially relevant updates.
@@ -92,19 +90,19 @@ Similarly, our OEV implementation uses this mechanism, ensuring OEV updates cont
## Oracle Extractable Value (OEV)
-[OEV](/oev/) updates provide identical guarantees to regular updates—they are on-chain aggregations of API provider-signed data—so they introduce no additional [data correctness](#data-correctness) risk.
+[OEV](/oev/) updates provide identical guarantees to regular updates - they are on-chain aggregations of API provider-signed data - so they introduce no additional [data correctness](#data-correctness) risk.
The OEV updates allows winners to frontrun updates of an artificially delayed base feed, a tradeoff designed to benefit the dApp.
-dApps using our system will experience a 0–15 second delay in their data feed.
+dApps using our system will experience a 0-15 second delay in their data feed.
While this delay concerns some users, we can evaluate its impact through a simple framework:
Consider a dApp that generates `X1` revenue with its current oracle solution.
-Using Api3 data feeds would generate `X2` revenue (potentially lower than `X1` due to the delay) plus `Y` in OEV Rewards.
-When `X1 < X2 + Y`—which is common—Api3 feeds are the more secure choice.
+Using API3 data feeds would generate `X2` revenue (potentially lower than `X1` due to the delay) plus `Y` in OEV Rewards.
+When `X1 < X2 + Y` - which is common - API3 feeds are the more secure choice.
::: info 💡 Tip
An overlooked fact is that traditional oracle solutions without OEV capture are inherently vulnerable.
-Their users have faced [hundreds of millions of dollars](https://members.delphidigital.io/reports/api3-the-state-of-oev) in exploits over the years—exploits that were entirely preventable.
+Their users have faced [hundreds of millions of dollars](https://members.delphidigital.io/reports/api3-the-state-of-oev) in exploits over the years - exploits that were entirely preventable.
Auditors should flag dApps lacking effective OEV capture mechanisms, and dApps continuing to use vulnerable traditional solutions should be required to justify this choice.
:::
diff --git a/docs/dapps/oev-rewards/index.md b/docs/dapps/oev-rewards/index.md
index ff7eb353..b8dc1f75 100644
--- a/docs/dapps/oev-rewards/index.md
+++ b/docs/dapps/oev-rewards/index.md
@@ -9,32 +9,32 @@ pageHeader: dApps → OEV Rewards
dApps that use traditional data feeds are constantly exploited by MEV bots that manipulate the order of operations around individual data feed updates.
In practice, this causes dApps to suffer significant and continuous financial losses.
-As the antidote, Api3 enables OEV searchers to determine the order of operations around data feed updates.
+As the antidote, API3 enables OEV searchers to determine the order of operations around data feed updates.
80% of the resulting revenue is paid to the dApp in the form of OEV Rewards.
::: info 💰 Financial
-Api3 provides data feeds [at cost](/dapps/integration/index#pricing) and enables dApps to benefit from OEV Rewards on top.
+API3 provides data feeds [at cost](/dapps/integration/index#pricing) and enables dApps to benefit from OEV Rewards on top.
You might ask, "What's the catch?"
-There is none; OEV Rewards come at the expense of third parties who would otherwise solely benefit from MEV.
+There is none. OEV Rewards come at the expense of third parties who would otherwise solely benefit from MEV.
:::
-Api3 data feeds work identically to traditional data feeds, which means that you do not need to modify your contracts in any way to use them.
-You can drop in Api3 data feeds to replace your current data feeds and immediately start earning OEV Rewards.
+API3 data feeds work identically to traditional data feeds, which means that you do not need to modify your contracts in any way to use them.
+You can drop in API3 data feeds to replace your current data feeds and immediately start earning OEV Rewards.
## How to get onboard
-Use [this form](https://api3dao.typeform.com/to/FHhFIL41) to get in contact with an Api3 representative who will walk you through the following steps:
+Use [this form](https://api3dao.typeform.com/to/FHhFIL41) to get in contact with an API3 representative who will walk you through the following steps:
-1. We register your dApp for it to show up on the Api3 Market [integration page.](/dapps/integration/index.md#integration-information)
+1. We register your dApp for it to show up on the API3 Market [integration page.](/dapps/integration/index.md#integration-information)
2. You let us know which chains you operate on and which data feeds you will use.
::: info 💡 Tip
Don't forget to notify us if you expand to new chains and data feeds later on.
:::
If a gas grant is applicable, we purchase subscriptions for you and deploy an OEV Rewards-enabled Api3ReaderProxyV1 contract for each data feed.
::: info 💡 Tip
- Alternatively, you can complete this step on your own using [Api3 Market.](https://market.api3.org/)
+ Alternatively, you can complete this step on your own using [API3 Market.](https://market.api3.org/)
:::
3. You let us know an address where to receive the OEV Rewards.
::: info 💡 Tip
@@ -43,4 +43,4 @@ Use [this form](https://api3dao.typeform.com/to/FHhFIL41) to get in contact with
:::
4. You [integrate](/dapps/integration/contract-integration) the OEV Rewards-enabled Api3ReaderProxyV1 contracts.
-At the end of each month, Api3 will make available a report and 80% of the OEV revenue in the native gas token of the network where your dApp is deployed, with the remainder retained as the protocol fee.
+At the end of each month, API3 will make available a report and 80% of the OEV revenue in the native gas token of the network where your dApp is deployed, with the remainder retained as the protocol fee.
diff --git a/docs/dapps/quickstart/index.md b/docs/dapps/quickstart/index.md
index 1c9aee20..424ba548 100644
--- a/docs/dapps/quickstart/index.md
+++ b/docs/dapps/quickstart/index.md
@@ -7,10 +7,10 @@ pageHeader: dApps
# Quickstart
-[Api3 Market](https://market.api3.org/) serves a large and dynamic catalog of data feeds on all major EVM networks.
-Follow this guide to learn how to use Api3 Market to integrate a data feed into an example contract.
+[API3 Market](https://market.api3.org/) serves a large and dynamic catalog of data feeds on all major EVM networks.
+Follow this guide to learn how to use API3 Market to integrate a data feed into an example contract.
-## Using Api3 Market
+## Using API3 Market
- Go to [market.api3.org.](https://market.api3.org/)
@@ -87,12 +87,12 @@ If you prefer using Hardhat, you can clone [`data-feed-reader-example`](https://
::: info 💡 Tip
-If you just purchased a plan on Api3 Market, your MetaMask wallet should be connected to the correct network.
+If you just purchased a plan on API3 Market, your MetaMask wallet should be connected to the correct network.
If not, ensure your wallet is connected to the network where the data feed exists, where we'll deploy DataFeedReaderExample.
:::
-- Return to the data feed page on Api3 Market and click "Integrate".
+- Return to the data feed page on API3 Market and click "Integrate".
@@ -116,5 +116,5 @@ If not, ensure your wallet is connected to the network where the data feed exist
## What next?
This guide should help you get started with a hackathon project.
-For production use of Api3 data feeds, please continue to the [integration section.](/dapps/integration/)
-You can also learn how to [get paid](/dapps/oev-rewards/) for using Api3 data feeds.
+For production use of API3 data feeds, please continue to the [integration section.](/dapps/integration/)
+You can also learn how to [get paid](/dapps/oev-rewards/) for using API3 data feeds.
diff --git a/docs/dapps/sidebar.js b/docs/dapps/sidebar.js
index c7a23de7..ab8dc53f 100644
--- a/docs/dapps/sidebar.js
+++ b/docs/dapps/sidebar.js
@@ -11,7 +11,7 @@ module.exports = [
text: 'Integration',
collapsed: false,
items: [
- { text: 'Using Api3 Market', link: '/dapps/integration/' },
+ { text: 'Using API3 Market', link: '/dapps/integration/' },
{
text: 'Contract integration',
link: '/dapps/integration/contract-integration',
diff --git a/docs/index.md b/docs/index.md
index 4b3d981a..267113b2 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -2,13 +2,13 @@
layout: home
hero:
- name: Api3
+ name: API3
text: Oracles that pay you
tagline: Receive OEV Rewards for your DeFi project
image:
light: /img/data-feeds-simple-to-integrate-light.svg
dark: /img/data-feeds-simple-to-integrate-dark.svg
- alt: Api3
+ alt: API3
actions:
- theme: brand
text: For dApps
diff --git a/docs/oev/in-depth/data-feeds/index.md b/docs/oev/in-depth/data-feeds/index.md
index 8fb6ac71..96cb2506 100644
--- a/docs/oev/in-depth/data-feeds/index.md
+++ b/docs/oev/in-depth/data-feeds/index.md
@@ -11,16 +11,16 @@ outline: deep
Searchers need a way to monitor real-time off-chain prices to find profitable
opportunities. Traditionally, searchers have needed to buy API subscriptions
from underlying oracle sources, creating additional friction in the process.
-Api3 simplifies this process by providing the same data that is used for
-updating data feeds to searchers publicly and without cost. But before that, one needs to understand how Api3 oracles work.
+API3 simplifies this process by providing the same data that is used for
+updating data feeds to searchers publicly and without cost. But before that, one needs to understand how API3 oracles work.
## How data feeds work?
Let's start from the ground up. The data feed logic is dictated by the Api3ServerV1
-contract. The central part of Api3 feeds is first-party oracles, relying on
+contract. The central part of API3 feeds is first-party oracles, relying on
cryptographic signatures verified on-chain.
-Internally, we refer to our data feeds as dAPIs. This is also the terminology used across Api3 contracts. We'll be following the same terminology in this section.
+Internally, we refer to our data feeds as dAPIs. This is also the terminology used across API3 contracts. We'll be following the same terminology in this section.
### dAPI structure
@@ -53,7 +53,7 @@ to a data feed ID.
### Updating data feed value
So far, we've referred to dAPIs and data feeds as sources of data, not
-mentioning how they are kept up-to-date. Api3 feeds are permissionless and
+mentioning how they are kept up-to-date. API3 feeds are permissionless and
anyone can perform an update, provided they have valid data. To update a beacon,
anyone can call `updateBeaconWithSignedData` on the Api3ServerV1 contract:
@@ -96,7 +96,7 @@ date:
2. [Signed API](https://github.com/api3dao/signed-api/tree/main/packages/signed-api) -
Signed API accepts signed data from API providers and provides an API layer
for off-chain querying.
-3. [Airseeker](https://github.com/api3dao/airseeker) - Airseeker is an Api3 push
+3. [Airseeker](https://github.com/api3dao/airseeker) - Airseeker is an API3 push
oracle. It monitors the off-chain and on-chain data and triggers an update
when needed.
@@ -112,7 +112,7 @@ not updated for a particular amount time.
::: warning ⚠️ Warning
-Currently, OEV updates are possible only for the Api3 partnered searchers and not the general public.
+Currently, OEV updates are possible only for the API3 partnered searchers and not the general public.
:::
@@ -193,7 +193,7 @@ Searchers can use [unsafeComputeDappId](https://github.com/api3dao/contracts/blo
::: info ℹ️ Example
-Say we want to determine dApp ID for [dTRINITY](https://dtrinity.org/). From the OEV dapps catalog, we see the dApp alias is `dtrinity` and the chain is Fraxtal. Fraxtal has chain ID `252`. To derive the dApp ID we call `unsafeComputeDappId` with arguments `dtrinity` and `252`.
+Say we want to determine dApp ID for [dTRINITY](https://dtrinity.org/). Its dApp alias is `dtrinity`, as listed in the [dApp registry](https://github.com/api3dao/contracts/tree/main/data/dapps) of `@api3/contracts`, and the chain is Fraxtal. Fraxtal has chain ID `252`. To derive the dApp ID we call `unsafeComputeDappId` with arguments `dtrinity` and `252`.
```js
const dTrinityDappId = unsafeComputeDappId('dtrinity', 252);
@@ -274,7 +274,7 @@ length depends on the number of beacons encoded.
::: warning ⚠️ Airnode Mnemonic Rotation
-Data providers rotate their Airnode mnemonics every 6 months as part of Api3's security practices. This results in new Airnode addresses being generated. Please refer to the [Api3 Market](https://market.api3.org) or directly on-chain data for the latest Airnode addresses.
+Data providers rotate their Airnode mnemonics every 6 months as part of API3's security practices. This results in new Airnode addresses being generated. Please refer to the [API3 Market](https://market.api3.org) or directly on-chain data for the latest Airnode addresses.
:::
@@ -284,8 +284,8 @@ Say there is a dApp proxy that uses the `ETH/USD` dAPI. We can compute the
details for this dAPI off-chain by:
```js
-const encodedDapiName = ethers.utils.formatBytes32String('ETH/USD'); // 0x4554482f55534400000000000000000000000000000000000000000000000000
-const encodedDapiNameHash = ethers.utils.keccak256(encodedDapiName); // 0x9e6138f8f57d7b493a8364edb0a0ac92399dfd890eecb9121050836a1749ba42
+const encodedDapiName = ethers.encodeBytes32String('ETH/USD'); // 0x4554482f55534400000000000000000000000000000000000000000000000000
+const encodedDapiNameHash = ethers.keccak256(encodedDapiName); // 0x9e6138f8f57d7b493a8364edb0a0ac92399dfd890eecb9121050836a1749ba42
```
To determine the data feed ID for this dAPI, we can use the
@@ -318,7 +318,7 @@ version of that decodes the data off-chain:
```js
const deriveBeaconId = (airnodeAddress, templateId) => {
- return ethers.utils.solidityKeccak256(
+ return ethers.solidityPackedKeccak256(
['address', 'bytes32'],
[airnodeAddress, templateId]
);
@@ -331,19 +331,19 @@ const decodeDataFeedDetails = (dataFeed) => {
// This is a hex encoded string, the contract works with bytes directly
// 2 characters for the '0x' preamble + 32 * 2 hexadecimals for 32 bytes + 32 * 2 hexadecimals for 32 bytes
if (dataFeed.length === 2 + 32 * 2 + 32 * 2) {
- const [airnodeAddress, templateId] = ethers.utils.defaultAbiCoder.decode(
- ['address', 'bytes32'],
- dataFeed
- );
+ const [airnodeAddress, templateId] =
+ ethers.AbiCoder.defaultAbiCoder().decode(
+ ['address', 'bytes32'],
+ dataFeed
+ );
const dataFeedId = deriveBeaconId(airnodeAddress, templateId);
return [{ beaconId: dataFeedId, airnodeAddress, templateId }];
}
- const [airnodeAddresses, templateIds] = ethers.utils.defaultAbiCoder.decode(
- ['address[]', 'bytes32[]'],
- dataFeed
- );
+ const [airnodeAddresses, templateIds] = ethers.AbiCoder.defaultAbiCoder()
+ .decode(['address[]', 'bytes32[]'], dataFeed)
+ .toArray(true);
const beacons = airnodeAddresses.map((airnodeAddress, idx) => {
const templateId = templateIds[idx];
@@ -404,9 +404,8 @@ Say the following is the output after decoding the data feed details:
Signed APIs store the data pushed by Airnode feeds and expose them to the public
via an API. As mentioned, base feed updates are delayed, permissionless and can be
-updated by anyone. The OEV feeds are real-time and can only be updated by the Api3 partnered searchers.
-The Signed APIs are publicly available. They are deployed on
-AWS, ensuring maximum uptime and reliability.
+updated by anyone. The OEV feeds are real-time and can only be updated by the API3 partnered searchers.
+The Signed APIs are publicly available.
Signed APIs only support querying data for a particular Airnode feed at a time. The
Airnode address is supplied as an HTTP path parameter. The endpoint is cached
@@ -417,11 +416,11 @@ rate limiting or full access denial.
The following are the base feed endpoints that are publicly available:
-1. `https://signed-api.api3.org/public/` - The official Api3
+1. `https://signed-api.api3.org/public/` - The official API3
Signed APIs used by the push oracle to update the base feeds.
For example, see the
-[Api3 response for Nodary Airnode feed](https://signed-api.api3.org/public/0xc52EeA00154B4fF1EbbF8Ba39FDe37F1AC3B9Fd4).
+[API3 response for Nodary Airnode feed](https://signed-api.api3.org/public/0xc52EeA00154B4fF1EbbF8Ba39FDe37F1AC3B9Fd4).
### OEV endpoints
@@ -430,7 +429,7 @@ The following are the OEV endpoints that are publicly available:
1. `https://signed-api.api3.org/public-oev/`
For example, see the
-[Api3 response for Nodary Airnode feed](https://signed-api.api3.org/public-oev/0xc52EeA00154B4fF1EbbF8Ba39FDe37F1AC3B9Fd4).
+[API3 response for Nodary Airnode feed](https://signed-api.api3.org/public-oev/0xc52EeA00154B4fF1EbbF8Ba39FDe37F1AC3B9Fd4).
### Response
diff --git a/docs/oev/in-depth/index.md b/docs/oev/in-depth/index.md
index 17c00b12..dd4d657f 100644
--- a/docs/oev/in-depth/index.md
+++ b/docs/oev/in-depth/index.md
@@ -11,4 +11,4 @@ outline: deep
To dive deep into OEV, there are two key parts to understand:
1. [Data feeds](/oev/in-depth/data-feeds/) - Focuses on the underlying smart contract architecture and explain how OEV is possible on the lowest level.
-2. [MEV with Signed APIs](/oev/in-depth/mev-with-signed-apis) - Explains how to utilize the public Api3 signed data endpoints for the delayed data to start searching.
+2. [MEV with Signed APIs](/oev/in-depth/mev-with-signed-apis) - Explains how to utilize the public API3 signed data endpoints for the delayed data to start searching.
diff --git a/docs/oev/index.md b/docs/oev/index.md
index 5e49dc2e..66c187be 100644
--- a/docs/oev/index.md
+++ b/docs/oev/index.md
@@ -22,7 +22,7 @@ oracle update(s), allowing searchers to atomically update the price feed(s) used
by the dApps and profit from the opportunities on the market. The exclusive update
rights guarantee no competition and searchers avoid paying premiums on gas fees.
-Api3 facilitates OEV using two ways:
+API3 facilitates OEV using two ways:
1. Private auctions performed via partnered searchers on non-delayed data.
2. Searching using public Signed APIs on delayed data, open for anyone to participate.
@@ -35,7 +35,7 @@ For quick reference, you can copy-paste [`llms-full.txt`](https://docs.api3.org/
## Practical example
-Imagine an overcollateralized lending platform that uses Api3 price feeds.
+Imagine an overcollateralized lending platform that uses API3 price feeds.
Borrowers in the protocol can be liquidated with an incentive whenever their
position becomes unhealthy to ensure the protocol remains solvent. Say
liquidations can occur if the loan-to-value ratio exceeds 90%. Let's look at
@@ -48,7 +48,7 @@ price drop that causes many positions using that asset as collateral to approach
the 90% liquidation threshold.
In this scenario, the next price update that causes a position to become
-unhealthy is valuable. Api3 partnered searchers monitor the dApp and public Api3 data sources and notice that a position will become unhealthy after the next oracle update. They submit a transaction that executes the oracle update and perform the liquidation
+unhealthy is valuable. API3 partnered searchers monitor the dApp and public API3 data sources and notice that a position will become unhealthy after the next oracle update. They submit a transaction that executes the oracle update and perform the liquidation
atomically.
The concept of OEV is not limited to liquidations, but can occur anywhere where
@@ -60,12 +60,12 @@ arbitrage and many others.
Thus, the majority of the OEV is distributed to the dApp and the
searchers.
-Api3 searching revenue is split between:
+API3 searching revenue is split between:
1. Paying the dApps in the form of [OEV Rewards](/dapps/oev-rewards/).
-2. Api3 protocol fee.
+2. API3 protocol fee.
-For [Api3-curated markets](/curation/), the entirety of the OEV belongs to Api3.
+For [API3-curated markets](/curation/), the entirety of the OEV belongs to API3.
## Get started with OEV
@@ -76,5 +76,5 @@ Here are resources to help you get started with OEV:
[OEV Litepaper](https://raw.githubusercontent.com/api3dao/oev-litepaper/main/oev-litepaper.pdf).
3. Connect with other developers and OEV enthusiasts in our
[OEV Discord channel](https://discord.com/channels/758003776174030948/1062909222347603989).
-4. Follow Api3 on [X](https://x.com/api3dao) for the latest news and updates on
+4. Follow API3 on [X](https://x.com/api3dao) for the latest news and updates on
OEV.
diff --git a/docs/public/img/Beacons-active.png b/docs/public/img/Beacons-active.png
deleted file mode 100644
index 03367ec5..00000000
Binary files a/docs/public/img/Beacons-active.png and /dev/null differ
diff --git a/docs/public/img/Magnifier-Dark.png b/docs/public/img/Magnifier-Dark.png
deleted file mode 100644
index 9aa2f32c..00000000
Binary files a/docs/public/img/Magnifier-Dark.png and /dev/null differ
diff --git a/docs/public/img/Magnifier-Light.png b/docs/public/img/Magnifier-Light.png
deleted file mode 100644
index 0f8634c8..00000000
Binary files a/docs/public/img/Magnifier-Light.png and /dev/null differ
diff --git a/docs/public/img/beacons.svg b/docs/public/img/beacons.svg
deleted file mode 100644
index db715040..00000000
--- a/docs/public/img/beacons.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
diff --git a/docs/public/img/circle-loading-gif.webp b/docs/public/img/circle-loading-gif.webp
deleted file mode 100644
index c893c8b1..00000000
Binary files a/docs/public/img/circle-loading-gif.webp and /dev/null differ
diff --git a/docs/public/img/marching-balls.gif b/docs/public/img/marching-balls.gif
deleted file mode 100644
index 684a0d63..00000000
Binary files a/docs/public/img/marching-balls.gif and /dev/null differ
diff --git a/docs/public/img/meta-mask-ext-btn.png b/docs/public/img/meta-mask-ext-btn.png
deleted file mode 100644
index 61fa942c..00000000
Binary files a/docs/public/img/meta-mask-ext-btn.png and /dev/null differ
diff --git a/docs/public/img/meta-mask-header.png b/docs/public/img/meta-mask-header.png
deleted file mode 100644
index d93de2b8..00000000
Binary files a/docs/public/img/meta-mask-header.png and /dev/null differ
diff --git a/docs/public/img/meta-mask-header2.png b/docs/public/img/meta-mask-header2.png
deleted file mode 100644
index 3e3d83b8..00000000
Binary files a/docs/public/img/meta-mask-header2.png and /dev/null differ
diff --git a/docs/public/img/metamak-fox-head.png b/docs/public/img/metamak-fox-head.png
deleted file mode 100644
index 7c82760d..00000000
Binary files a/docs/public/img/metamak-fox-head.png and /dev/null differ
diff --git a/docs/public/img/metamak-fox-head.webp b/docs/public/img/metamak-fox-head.webp
deleted file mode 100644
index b4bf6acd..00000000
Binary files a/docs/public/img/metamak-fox-head.webp and /dev/null differ
diff --git a/docs/public/img/refresh-icon.png b/docs/public/img/refresh-icon.png
deleted file mode 100644
index 745606f4..00000000
Binary files a/docs/public/img/refresh-icon.png and /dev/null differ
diff --git a/docs/dapps/integration/images/reputation-link.png b/docs/public/img/reputation-link.png
similarity index 100%
rename from docs/dapps/integration/images/reputation-link.png
rename to docs/public/img/reputation-link.png
diff --git a/docs/public/img/spinner.gif b/docs/public/img/spinner.gif
deleted file mode 100644
index ddccd41b..00000000
Binary files a/docs/public/img/spinner.gif and /dev/null differ
diff --git a/firebase-deploy.sh b/firebase-deploy.sh
deleted file mode 100644
index 75447513..00000000
--- a/firebase-deploy.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-# NOTE: wkande, Sept 2022
-# Use this script to deploy the site manually from
-# the local bracnh main. Be sure to pull down the
-# latest code form main.
-#
-# This script must be run from the project root.
-
-#!/usr/bin/env sh
-
-# abort on errors
-set -e
-
-# build the docs
-npm run docs:build
-
-# navigate to the build output directory
-cd docs/.vitepress/dist
-
-# if you are deploying to a custom domain
-# echo 'www.example.com' > CNAME
-
-# Use this section if you want to push to a deployment branch.
-# api3dao/api3-docs uses the main branch as default.
-# git init must start with a main branch so firebase-pages will
-# "hang" off of it.
-# git init --initial-branch=main
-# git add -A
-# git commit -m 'Deploying a locally built /dist folder to main:firebase-pages as its own commit history.'
-
-# if you are deploying to https://.github.io
-# git push -f git@github.com:/.github.io.git main
-
-# If you are deploying to https://.github.io/
-# NEVER push to main, use main:firebase-pages.
-# git push -f git@github.com:wkande/api3-docs.git main:firebase-pages
-
-cd -
-
-firebase deploy
diff --git a/libs/link-validator-ignore.json b/libs/link-validator-ignore.json
index e8f2fc3e..cc70f144 100644
--- a/libs/link-validator-ignore.json
+++ b/libs/link-validator-ignore.json
@@ -6,5 +6,6 @@
"https://x.com",
"https://docs.api3.org/llms.txt",
"https://docs.api3.org/llms-full.txt",
- "https://www.npmjs.com/package/@api3/contracts"
+ "https://www.npmjs.com/package/@api3/contracts",
+ "https://www.google.com/search"
]
diff --git a/package.json b/package.json
index 1a451a60..01108339 100644
--- a/package.json
+++ b/package.json
@@ -1,27 +1,23 @@
{
"name": "api3-docs",
"version": "1.0.0",
- "main": "index.js",
"license": "MIT",
"packageManager": "pnpm@10.34.4",
"engines": {
"pnpm": "^10.34.4"
},
- "resolutions": {},
"scripts": {
"docs:dev": "pnpm generate-llms-files && pnpm vitepress dev docs",
- "docs:build": "pnpm generate-llms-files && pnpm vitepress build docs;",
+ "docs:build": "pnpm generate-llms-files && pnpm vitepress build docs",
"docs:serve": "vitepress serve docs --port 8082",
"format": "prettier --write --cache \"./**/*.{js,vue,md,json,yaml}\" --log-level silent",
"format:check": "prettier --check --cache \"./**/*.{js,vue,md,json,yaml}\"",
"lint": "pnpm format:check",
- "test": "vitest run --passWithNoTests",
"generate-llms-files": "node scripts/generate-llms-files.js",
"prepare": "husky",
- "firebase:emulator": "pnpm docs:build; firebase emulators:start"
+ "firebase:emulator": "pnpm docs:build && firebase emulators:start"
},
"devDependencies": {
- "@types/node": "^24.13.2",
"axios": "^1.19.0",
"colors": "^1.4.0",
"file": "^0.2.2",
@@ -31,7 +27,6 @@
"oust": "^2.0.4",
"prettier": "^3.9.6",
"vitepress": "1.6.4",
- "vitest": "^4.1.11",
"walk-sync": "^4.0.2"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0e35936b..32cffbe5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,9 +8,6 @@ importers:
.:
devDependencies:
- '@types/node':
- specifier: ^24.13.2
- version: 24.13.2
axios:
specifier: ^1.19.0
version: 1.19.0
@@ -38,9 +35,6 @@ importers:
vitepress:
specifier: 1.6.4
version: 1.6.4(@algolia/client-search@5.20.4)(@types/node@24.13.2)(axios@1.19.0)(postcss@8.5.6)(search-insights@2.16.2)(typescript@5.9.2)
- vitest:
- specifier: ^4.1.11
- version: 4.1.11(@types/node@24.13.2)(vite@7.1.12(@types/node@24.13.2))
walk-sync:
specifier: ^4.0.2
version: 4.0.2
@@ -165,294 +159,138 @@ packages:
cpu: [ppc64]
os: [aix]
- '@esbuild/aix-ppc64@0.25.11':
- resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
- engines: {node: '>=18'}
- cpu: [ppc64]
- os: [aix]
-
'@esbuild/android-arm64@0.21.5':
resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm64@0.25.11':
- resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [android]
-
'@esbuild/android-arm@0.21.5':
resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
- '@esbuild/android-arm@0.25.11':
- resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==}
- engines: {node: '>=18'}
- cpu: [arm]
- os: [android]
-
'@esbuild/android-x64@0.21.5':
resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
- '@esbuild/android-x64@0.25.11':
- resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [android]
-
'@esbuild/darwin-arm64@0.21.5':
resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-arm64@0.25.11':
- resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [darwin]
-
'@esbuild/darwin-x64@0.21.5':
resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
- '@esbuild/darwin-x64@0.25.11':
- resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [darwin]
-
'@esbuild/freebsd-arm64@0.21.5':
resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-arm64@0.25.11':
- resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [freebsd]
-
'@esbuild/freebsd-x64@0.21.5':
resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.25.11':
- resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [freebsd]
-
'@esbuild/linux-arm64@0.21.5':
resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm64@0.25.11':
- resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [linux]
-
'@esbuild/linux-arm@0.21.5':
resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-arm@0.25.11':
- resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==}
- engines: {node: '>=18'}
- cpu: [arm]
- os: [linux]
-
'@esbuild/linux-ia32@0.21.5':
resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-ia32@0.25.11':
- resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [linux]
-
'@esbuild/linux-loong64@0.21.5':
resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-loong64@0.25.11':
- resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==}
- engines: {node: '>=18'}
- cpu: [loong64]
- os: [linux]
-
'@esbuild/linux-mips64el@0.21.5':
resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-mips64el@0.25.11':
- resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==}
- engines: {node: '>=18'}
- cpu: [mips64el]
- os: [linux]
-
'@esbuild/linux-ppc64@0.21.5':
resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-ppc64@0.25.11':
- resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==}
- engines: {node: '>=18'}
- cpu: [ppc64]
- os: [linux]
-
'@esbuild/linux-riscv64@0.21.5':
resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-riscv64@0.25.11':
- resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==}
- engines: {node: '>=18'}
- cpu: [riscv64]
- os: [linux]
-
'@esbuild/linux-s390x@0.21.5':
resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-s390x@0.25.11':
- resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==}
- engines: {node: '>=18'}
- cpu: [s390x]
- os: [linux]
-
'@esbuild/linux-x64@0.21.5':
resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
- '@esbuild/linux-x64@0.25.11':
- resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [linux]
-
- '@esbuild/netbsd-arm64@0.25.11':
- resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [netbsd]
-
'@esbuild/netbsd-x64@0.21.5':
resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.25.11':
- resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [netbsd]
-
- '@esbuild/openbsd-arm64@0.25.11':
- resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [openbsd]
-
'@esbuild/openbsd-x64@0.21.5':
resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.25.11':
- resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [openbsd]
-
- '@esbuild/openharmony-arm64@0.25.11':
- resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [openharmony]
-
'@esbuild/sunos-x64@0.21.5':
resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
- '@esbuild/sunos-x64@0.25.11':
- resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [sunos]
-
'@esbuild/win32-arm64@0.21.5':
resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-arm64@0.25.11':
- resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [win32]
-
'@esbuild/win32-ia32@0.21.5':
resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-ia32@0.25.11':
- resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [win32]
-
'@esbuild/win32-x64@0.21.5':
resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
- '@esbuild/win32-x64@0.25.11':
- resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [win32]
-
'@iconify-json/simple-icons@1.2.27':
resolution: {integrity: sha512-FtZwp/H7ih5rY9FPfDR+k6toOo/cuwpHWY8faNhxLs5O5uW6Q8TeqdNWfjVfgFtrs5tUUzWysjqNGL234v8EMA==}
@@ -475,211 +313,90 @@ packages:
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm-eabi@4.52.5':
- resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==}
- cpu: [arm]
- os: [android]
-
'@rollup/rollup-android-arm64@4.24.0':
resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-android-arm64@4.52.5':
- resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==}
- cpu: [arm64]
- os: [android]
-
'@rollup/rollup-darwin-arm64@4.24.0':
resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-arm64@4.52.5':
- resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==}
- cpu: [arm64]
- os: [darwin]
-
'@rollup/rollup-darwin-x64@4.24.0':
resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.52.5':
- resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==}
- cpu: [x64]
- os: [darwin]
-
- '@rollup/rollup-freebsd-arm64@4.52.5':
- resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==}
- cpu: [arm64]
- os: [freebsd]
-
- '@rollup/rollup-freebsd-x64@4.52.5':
- resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==}
- cpu: [x64]
- os: [freebsd]
-
'@rollup/rollup-linux-arm-gnueabihf@4.24.0':
resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==}
cpu: [arm]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-arm-gnueabihf@4.52.5':
- resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==}
- cpu: [arm]
- os: [linux]
- libc: [glibc]
-
'@rollup/rollup-linux-arm-musleabihf@4.24.0':
resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==}
cpu: [arm]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-arm-musleabihf@4.52.5':
- resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==}
- cpu: [arm]
- os: [linux]
- libc: [musl]
-
'@rollup/rollup-linux-arm64-gnu@4.24.0':
resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-arm64-gnu@4.52.5':
- resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
'@rollup/rollup-linux-arm64-musl@4.24.0':
resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-arm64-musl@4.52.5':
- resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-loong64-gnu@4.52.5':
- resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==}
- cpu: [loong64]
- os: [linux]
- libc: [glibc]
-
'@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-ppc64-gnu@4.52.5':
- resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==}
- cpu: [ppc64]
- os: [linux]
- libc: [glibc]
-
'@rollup/rollup-linux-riscv64-gnu@4.24.0':
resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-riscv64-gnu@4.52.5':
- resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==}
- cpu: [riscv64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-riscv64-musl@4.52.5':
- resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==}
- cpu: [riscv64]
- os: [linux]
- libc: [musl]
-
'@rollup/rollup-linux-s390x-gnu@4.24.0':
resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-s390x-gnu@4.52.5':
- resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==}
- cpu: [s390x]
- os: [linux]
- libc: [glibc]
-
'@rollup/rollup-linux-x64-gnu@4.24.0':
resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-x64-gnu@4.52.5':
- resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
'@rollup/rollup-linux-x64-musl@4.24.0':
resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==}
cpu: [x64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-x64-musl@4.52.5':
- resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==}
- cpu: [x64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-openharmony-arm64@4.52.5':
- resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==}
- cpu: [arm64]
- os: [openharmony]
-
'@rollup/rollup-win32-arm64-msvc@4.24.0':
resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-arm64-msvc@4.52.5':
- resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==}
- cpu: [arm64]
- os: [win32]
-
'@rollup/rollup-win32-ia32-msvc@4.24.0':
resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.52.5':
- resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==}
- cpu: [ia32]
- os: [win32]
-
- '@rollup/rollup-win32-x64-gnu@4.52.5':
- resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==}
- cpu: [x64]
- os: [win32]
-
'@rollup/rollup-win32-x64-msvc@4.24.0':
resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==}
cpu: [x64]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.52.5':
- resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==}
- cpu: [x64]
- os: [win32]
-
'@shikijs/core@2.5.0':
resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==}
@@ -704,21 +421,9 @@ packages:
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
- '@standard-schema/spec@1.1.0':
- resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
-
- '@types/chai@5.2.2':
- resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==}
-
- '@types/deep-eql@4.0.2':
- resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
-
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
- '@types/estree@1.0.8':
- resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
-
'@types/hast@3.0.4':
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
@@ -757,35 +462,6 @@ packages:
vite: ^5.0.0 || ^6.0.0
vue: ^3.2.25
- '@vitest/expect@4.1.11':
- resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==}
-
- '@vitest/mocker@4.1.11':
- resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==}
- peerDependencies:
- msw: ^2.4.9
- vite: ^6.0.0 || ^7.0.0 || ^8.0.0
- peerDependenciesMeta:
- msw:
- optional: true
- vite:
- optional: true
-
- '@vitest/pretty-format@4.1.11':
- resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==}
-
- '@vitest/runner@4.1.11':
- resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==}
-
- '@vitest/snapshot@4.1.11':
- resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==}
-
- '@vitest/spy@4.1.11':
- resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==}
-
- '@vitest/utils@4.1.11':
- resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==}
-
'@vue/compiler-core@3.5.13':
resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
@@ -907,10 +583,6 @@ packages:
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
- chai@6.2.2:
- resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
- engines: {node: '>=18'}
-
character-entities-html4@2.1.0:
resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
@@ -938,9 +610,6 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
- convert-source-map@2.0.0:
- resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
-
copy-anything@3.0.5:
resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
engines: {node: '>=12.13'}
@@ -1013,9 +682,6 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
- es-module-lexer@2.0.0:
- resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==}
-
es-object-atoms@1.1.1:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
engines: {node: '>= 0.4'}
@@ -1029,30 +695,9 @@ packages:
engines: {node: '>=12'}
hasBin: true
- esbuild@0.25.11:
- resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
- engines: {node: '>=18'}
- hasBin: true
-
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
- estree-walker@3.0.3:
- resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
-
- expect-type@1.3.0:
- resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==}
- engines: {node: '>=12.0.0'}
-
- fdir@6.5.0:
- resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
- engines: {node: '>=12.0.0'}
- peerDependencies:
- picomatch: ^3 || ^4
- peerDependenciesMeta:
- picomatch:
- optional: true
-
file@0.2.2:
resolution: {integrity: sha512-gwabMtChzdnpDJdPEpz8Vr/PX0pU85KailuPV71Zw/un5yJVKvzukhB3qf6O3lnTwIe5CxlMYLh3jOK3w5xrLA==}
@@ -1221,9 +866,6 @@ packages:
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
- obug@2.1.1:
- resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
-
oniguruma-to-es@3.1.1:
resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==}
@@ -1241,19 +883,12 @@ packages:
parse5@7.1.2:
resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
- pathe@2.0.3:
- resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
-
perfect-debounce@1.0.0:
resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
- picomatch@4.0.3:
- resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
- engines: {node: '>=12'}
-
postcss@8.4.49:
resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
engines: {node: ^10 || ^12 || >=14}
@@ -1294,11 +929,6 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
- rollup@4.52.5:
- resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
-
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
@@ -1308,9 +938,6 @@ packages:
shiki@2.5.0:
resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==}
- siginfo@2.0.0:
- resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
-
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
@@ -1322,12 +949,6 @@ packages:
resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
engines: {node: '>=0.10.0'}
- stackback@0.0.2:
- resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
-
- std-env@4.0.0:
- resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==}
-
stringify-entities@4.0.4:
resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
@@ -1338,21 +959,6 @@ packages:
tabbable@6.2.0:
resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
- tinybench@2.9.0:
- resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
-
- tinyexec@1.0.2:
- resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
- engines: {node: '>=18'}
-
- tinyglobby@0.2.15:
- resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
- engines: {node: '>=12.0.0'}
-
- tinyrainbow@3.1.0:
- resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==}
- engines: {node: '>=14.0.0'}
-
to-fast-properties@2.0.0:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
@@ -1428,46 +1034,6 @@ packages:
terser:
optional: true
- vite@7.1.12:
- resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==}
- engines: {node: ^20.19.0 || >=22.12.0}
- hasBin: true
- peerDependencies:
- '@types/node': ^20.19.0 || >=22.12.0
- jiti: '>=1.21.0'
- less: ^4.0.0
- lightningcss: ^1.21.0
- sass: ^1.70.0
- sass-embedded: ^1.70.0
- stylus: '>=0.54.8'
- sugarss: ^5.0.0
- terser: ^5.16.0
- tsx: ^4.8.1
- yaml: ^2.4.2
- peerDependenciesMeta:
- '@types/node':
- optional: true
- jiti:
- optional: true
- less:
- optional: true
- lightningcss:
- optional: true
- sass:
- optional: true
- sass-embedded:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
- tsx:
- optional: true
- yaml:
- optional: true
-
vitepress@1.6.4:
resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==}
hasBin: true
@@ -1480,47 +1046,6 @@ packages:
postcss:
optional: true
- vitest@4.1.11:
- resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==}
- engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
- hasBin: true
- peerDependencies:
- '@edge-runtime/vm': '*'
- '@opentelemetry/api': ^1.9.0
- '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
- '@vitest/browser-playwright': 4.1.11
- '@vitest/browser-preview': 4.1.11
- '@vitest/browser-webdriverio': 4.1.11
- '@vitest/coverage-istanbul': 4.1.11
- '@vitest/coverage-v8': 4.1.11
- '@vitest/ui': 4.1.11
- happy-dom: '*'
- jsdom: '*'
- vite: ^6.0.0 || ^7.0.0 || ^8.0.0
- peerDependenciesMeta:
- '@edge-runtime/vm':
- optional: true
- '@opentelemetry/api':
- optional: true
- '@types/node':
- optional: true
- '@vitest/browser-playwright':
- optional: true
- '@vitest/browser-preview':
- optional: true
- '@vitest/browser-webdriverio':
- optional: true
- '@vitest/coverage-istanbul':
- optional: true
- '@vitest/coverage-v8':
- optional: true
- '@vitest/ui':
- optional: true
- happy-dom:
- optional: true
- jsdom:
- optional: true
-
vue@3.5.13:
resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
peerDependencies:
@@ -1542,11 +1067,6 @@ packages:
resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
engines: {node: '>=18'}
- why-is-node-running@2.3.0:
- resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
- engines: {node: '>=8'}
- hasBin: true
-
zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
@@ -1698,150 +1218,72 @@ snapshots:
'@esbuild/aix-ppc64@0.21.5':
optional: true
- '@esbuild/aix-ppc64@0.25.11':
- optional: true
-
'@esbuild/android-arm64@0.21.5':
optional: true
- '@esbuild/android-arm64@0.25.11':
- optional: true
-
'@esbuild/android-arm@0.21.5':
optional: true
- '@esbuild/android-arm@0.25.11':
- optional: true
-
'@esbuild/android-x64@0.21.5':
optional: true
- '@esbuild/android-x64@0.25.11':
- optional: true
-
'@esbuild/darwin-arm64@0.21.5':
optional: true
- '@esbuild/darwin-arm64@0.25.11':
- optional: true
-
'@esbuild/darwin-x64@0.21.5':
optional: true
- '@esbuild/darwin-x64@0.25.11':
- optional: true
-
'@esbuild/freebsd-arm64@0.21.5':
optional: true
- '@esbuild/freebsd-arm64@0.25.11':
- optional: true
-
'@esbuild/freebsd-x64@0.21.5':
optional: true
- '@esbuild/freebsd-x64@0.25.11':
- optional: true
-
'@esbuild/linux-arm64@0.21.5':
optional: true
- '@esbuild/linux-arm64@0.25.11':
- optional: true
-
'@esbuild/linux-arm@0.21.5':
optional: true
- '@esbuild/linux-arm@0.25.11':
- optional: true
-
'@esbuild/linux-ia32@0.21.5':
optional: true
- '@esbuild/linux-ia32@0.25.11':
- optional: true
-
'@esbuild/linux-loong64@0.21.5':
optional: true
- '@esbuild/linux-loong64@0.25.11':
- optional: true
-
'@esbuild/linux-mips64el@0.21.5':
optional: true
- '@esbuild/linux-mips64el@0.25.11':
- optional: true
-
'@esbuild/linux-ppc64@0.21.5':
optional: true
- '@esbuild/linux-ppc64@0.25.11':
- optional: true
-
'@esbuild/linux-riscv64@0.21.5':
optional: true
- '@esbuild/linux-riscv64@0.25.11':
- optional: true
-
'@esbuild/linux-s390x@0.21.5':
optional: true
- '@esbuild/linux-s390x@0.25.11':
- optional: true
-
'@esbuild/linux-x64@0.21.5':
optional: true
- '@esbuild/linux-x64@0.25.11':
- optional: true
-
- '@esbuild/netbsd-arm64@0.25.11':
- optional: true
-
'@esbuild/netbsd-x64@0.21.5':
optional: true
- '@esbuild/netbsd-x64@0.25.11':
- optional: true
-
- '@esbuild/openbsd-arm64@0.25.11':
- optional: true
-
'@esbuild/openbsd-x64@0.21.5':
optional: true
- '@esbuild/openbsd-x64@0.25.11':
- optional: true
-
- '@esbuild/openharmony-arm64@0.25.11':
- optional: true
-
'@esbuild/sunos-x64@0.21.5':
optional: true
- '@esbuild/sunos-x64@0.25.11':
- optional: true
-
'@esbuild/win32-arm64@0.21.5':
optional: true
- '@esbuild/win32-arm64@0.25.11':
- optional: true
-
'@esbuild/win32-ia32@0.21.5':
optional: true
- '@esbuild/win32-ia32@0.25.11':
- optional: true
-
'@esbuild/win32-x64@0.21.5':
optional: true
- '@esbuild/win32-x64@0.25.11':
- optional: true
-
'@iconify-json/simple-icons@1.2.27':
dependencies:
'@iconify/types': 2.0.0
@@ -1859,117 +1301,51 @@ snapshots:
'@rollup/rollup-android-arm-eabi@4.24.0':
optional: true
- '@rollup/rollup-android-arm-eabi@4.52.5':
- optional: true
-
'@rollup/rollup-android-arm64@4.24.0':
optional: true
- '@rollup/rollup-android-arm64@4.52.5':
- optional: true
-
'@rollup/rollup-darwin-arm64@4.24.0':
optional: true
- '@rollup/rollup-darwin-arm64@4.52.5':
- optional: true
-
'@rollup/rollup-darwin-x64@4.24.0':
optional: true
- '@rollup/rollup-darwin-x64@4.52.5':
- optional: true
-
- '@rollup/rollup-freebsd-arm64@4.52.5':
- optional: true
-
- '@rollup/rollup-freebsd-x64@4.52.5':
- optional: true
-
'@rollup/rollup-linux-arm-gnueabihf@4.24.0':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.52.5':
- optional: true
-
'@rollup/rollup-linux-arm-musleabihf@4.24.0':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.52.5':
- optional: true
-
'@rollup/rollup-linux-arm64-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.52.5':
- optional: true
-
'@rollup/rollup-linux-arm64-musl@4.24.0':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.52.5':
- optional: true
-
- '@rollup/rollup-linux-loong64-gnu@4.52.5':
- optional: true
-
'@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-ppc64-gnu@4.52.5':
- optional: true
-
'@rollup/rollup-linux-riscv64-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.52.5':
- optional: true
-
- '@rollup/rollup-linux-riscv64-musl@4.52.5':
- optional: true
-
'@rollup/rollup-linux-s390x-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.52.5':
- optional: true
-
'@rollup/rollup-linux-x64-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.52.5':
- optional: true
-
'@rollup/rollup-linux-x64-musl@4.24.0':
optional: true
- '@rollup/rollup-linux-x64-musl@4.52.5':
- optional: true
-
- '@rollup/rollup-openharmony-arm64@4.52.5':
- optional: true
-
'@rollup/rollup-win32-arm64-msvc@4.24.0':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.52.5':
- optional: true
-
'@rollup/rollup-win32-ia32-msvc@4.24.0':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.52.5':
- optional: true
-
- '@rollup/rollup-win32-x64-gnu@4.52.5':
- optional: true
-
'@rollup/rollup-win32-x64-msvc@4.24.0':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.52.5':
- optional: true
-
'@shikijs/core@2.5.0':
dependencies:
'@shikijs/engine-javascript': 2.5.0
@@ -2010,18 +1386,8 @@ snapshots:
'@shikijs/vscode-textmate@10.0.2': {}
- '@standard-schema/spec@1.1.0': {}
-
- '@types/chai@5.2.2':
- dependencies:
- '@types/deep-eql': 4.0.2
-
- '@types/deep-eql@4.0.2': {}
-
'@types/estree@1.0.6': {}
- '@types/estree@1.0.8': {}
-
'@types/hast@3.0.4':
dependencies:
'@types/unist': 3.0.2
@@ -2044,6 +1410,7 @@ snapshots:
'@types/node@24.13.2':
dependencies:
undici-types: 7.18.2
+ optional: true
'@types/unist@3.0.2': {}
@@ -2056,47 +1423,6 @@ snapshots:
vite: 5.4.14(@types/node@24.13.2)
vue: 3.5.13(typescript@5.9.2)
- '@vitest/expect@4.1.11':
- dependencies:
- '@standard-schema/spec': 1.1.0
- '@types/chai': 5.2.2
- '@vitest/spy': 4.1.11
- '@vitest/utils': 4.1.11
- chai: 6.2.2
- tinyrainbow: 3.1.0
-
- '@vitest/mocker@4.1.11(vite@7.1.12(@types/node@24.13.2))':
- dependencies:
- '@vitest/spy': 4.1.11
- estree-walker: 3.0.3
- magic-string: 0.30.21
- optionalDependencies:
- vite: 7.1.12(@types/node@24.13.2)
-
- '@vitest/pretty-format@4.1.11':
- dependencies:
- tinyrainbow: 3.1.0
-
- '@vitest/runner@4.1.11':
- dependencies:
- '@vitest/utils': 4.1.11
- pathe: 2.0.3
-
- '@vitest/snapshot@4.1.11':
- dependencies:
- '@vitest/pretty-format': 4.1.11
- '@vitest/utils': 4.1.11
- magic-string: 0.30.21
- pathe: 2.0.3
-
- '@vitest/spy@4.1.11': {}
-
- '@vitest/utils@4.1.11':
- dependencies:
- '@vitest/pretty-format': 4.1.11
- convert-source-map: 2.0.0
- tinyrainbow: 3.1.0
-
'@vue/compiler-core@3.5.13':
dependencies:
'@babel/parser': 7.25.3
@@ -2249,8 +1575,6 @@ snapshots:
ccount@2.0.1: {}
- chai@6.2.2: {}
-
character-entities-html4@2.1.0: {}
character-entities-legacy@3.0.0: {}
@@ -2288,8 +1612,6 @@ snapshots:
concat-map@0.0.1: {}
- convert-source-map@2.0.0: {}
-
copy-anything@3.0.5:
dependencies:
is-what: 4.1.16
@@ -2357,8 +1679,6 @@ snapshots:
es-errors@1.3.0: {}
- es-module-lexer@2.0.0: {}
-
es-object-atoms@1.1.1:
dependencies:
es-errors: 1.3.0
@@ -2396,47 +1716,8 @@ snapshots:
'@esbuild/win32-ia32': 0.21.5
'@esbuild/win32-x64': 0.21.5
- esbuild@0.25.11:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.25.11
- '@esbuild/android-arm': 0.25.11
- '@esbuild/android-arm64': 0.25.11
- '@esbuild/android-x64': 0.25.11
- '@esbuild/darwin-arm64': 0.25.11
- '@esbuild/darwin-x64': 0.25.11
- '@esbuild/freebsd-arm64': 0.25.11
- '@esbuild/freebsd-x64': 0.25.11
- '@esbuild/linux-arm': 0.25.11
- '@esbuild/linux-arm64': 0.25.11
- '@esbuild/linux-ia32': 0.25.11
- '@esbuild/linux-loong64': 0.25.11
- '@esbuild/linux-mips64el': 0.25.11
- '@esbuild/linux-ppc64': 0.25.11
- '@esbuild/linux-riscv64': 0.25.11
- '@esbuild/linux-s390x': 0.25.11
- '@esbuild/linux-x64': 0.25.11
- '@esbuild/netbsd-arm64': 0.25.11
- '@esbuild/netbsd-x64': 0.25.11
- '@esbuild/openbsd-arm64': 0.25.11
- '@esbuild/openbsd-x64': 0.25.11
- '@esbuild/openharmony-arm64': 0.25.11
- '@esbuild/sunos-x64': 0.25.11
- '@esbuild/win32-arm64': 0.25.11
- '@esbuild/win32-ia32': 0.25.11
- '@esbuild/win32-x64': 0.25.11
-
estree-walker@2.0.2: {}
- estree-walker@3.0.3:
- dependencies:
- '@types/estree': 1.0.8
-
- expect-type@1.3.0: {}
-
- fdir@6.5.0(picomatch@4.0.3):
- optionalDependencies:
- picomatch: 4.0.3
-
file@0.2.2: {}
focus-trap@7.6.4:
@@ -2620,8 +1901,6 @@ snapshots:
dependencies:
boolbase: 1.0.0
- obug@2.1.1: {}
-
oniguruma-to-es@3.1.1:
dependencies:
emoji-regex-xs: 1.0.0
@@ -2646,14 +1925,10 @@ snapshots:
dependencies:
entities: 4.5.0
- pathe@2.0.3: {}
-
perfect-debounce@1.0.0: {}
picocolors@1.1.1: {}
- picomatch@4.0.3: {}
-
postcss@8.4.49:
dependencies:
nanoid: 3.3.8
@@ -2708,34 +1983,6 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.24.0
fsevents: 2.3.3
- rollup@4.52.5:
- dependencies:
- '@types/estree': 1.0.8
- optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.52.5
- '@rollup/rollup-android-arm64': 4.52.5
- '@rollup/rollup-darwin-arm64': 4.52.5
- '@rollup/rollup-darwin-x64': 4.52.5
- '@rollup/rollup-freebsd-arm64': 4.52.5
- '@rollup/rollup-freebsd-x64': 4.52.5
- '@rollup/rollup-linux-arm-gnueabihf': 4.52.5
- '@rollup/rollup-linux-arm-musleabihf': 4.52.5
- '@rollup/rollup-linux-arm64-gnu': 4.52.5
- '@rollup/rollup-linux-arm64-musl': 4.52.5
- '@rollup/rollup-linux-loong64-gnu': 4.52.5
- '@rollup/rollup-linux-ppc64-gnu': 4.52.5
- '@rollup/rollup-linux-riscv64-gnu': 4.52.5
- '@rollup/rollup-linux-riscv64-musl': 4.52.5
- '@rollup/rollup-linux-s390x-gnu': 4.52.5
- '@rollup/rollup-linux-x64-gnu': 4.52.5
- '@rollup/rollup-linux-x64-musl': 4.52.5
- '@rollup/rollup-openharmony-arm64': 4.52.5
- '@rollup/rollup-win32-arm64-msvc': 4.52.5
- '@rollup/rollup-win32-ia32-msvc': 4.52.5
- '@rollup/rollup-win32-x64-gnu': 4.52.5
- '@rollup/rollup-win32-x64-msvc': 4.52.5
- fsevents: 2.3.3
-
safer-buffer@2.1.2: {}
search-insights@2.16.2: {}
@@ -2751,18 +1998,12 @@ snapshots:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
- siginfo@2.0.0: {}
-
source-map-js@1.2.1: {}
space-separated-tokens@2.0.2: {}
speakingurl@14.0.1: {}
- stackback@0.0.2: {}
-
- std-env@4.0.0: {}
-
stringify-entities@4.0.4:
dependencies:
character-entities-html4: 2.1.0
@@ -2774,17 +2015,6 @@ snapshots:
tabbable@6.2.0: {}
- tinybench@2.9.0: {}
-
- tinyexec@1.0.2: {}
-
- tinyglobby@0.2.15:
- dependencies:
- fdir: 6.5.0(picomatch@4.0.3)
- picomatch: 4.0.3
-
- tinyrainbow@3.1.0: {}
-
to-fast-properties@2.0.0: {}
trim-lines@3.0.1: {}
@@ -2792,7 +2022,8 @@ snapshots:
typescript@5.9.2:
optional: true
- undici-types@7.18.2: {}
+ undici-types@7.18.2:
+ optional: true
undici@6.19.7: {}
@@ -2840,18 +2071,6 @@ snapshots:
'@types/node': 24.13.2
fsevents: 2.3.3
- vite@7.1.12(@types/node@24.13.2):
- dependencies:
- esbuild: 0.25.11
- fdir: 6.5.0(picomatch@4.0.3)
- picomatch: 4.0.3
- postcss: 8.5.6
- rollup: 4.52.5
- tinyglobby: 0.2.15
- optionalDependencies:
- '@types/node': 24.13.2
- fsevents: 2.3.3
-
vitepress@1.6.4(@algolia/client-search@5.20.4)(@types/node@24.13.2)(axios@1.19.0)(postcss@8.5.6)(search-insights@2.16.2)(typescript@5.9.2):
dependencies:
'@docsearch/css': 3.8.2
@@ -2901,33 +2120,6 @@ snapshots:
- typescript
- universal-cookie
- vitest@4.1.11(@types/node@24.13.2)(vite@7.1.12(@types/node@24.13.2)):
- dependencies:
- '@vitest/expect': 4.1.11
- '@vitest/mocker': 4.1.11(vite@7.1.12(@types/node@24.13.2))
- '@vitest/pretty-format': 4.1.11
- '@vitest/runner': 4.1.11
- '@vitest/snapshot': 4.1.11
- '@vitest/spy': 4.1.11
- '@vitest/utils': 4.1.11
- es-module-lexer: 2.0.0
- expect-type: 1.3.0
- magic-string: 0.30.21
- obug: 2.1.1
- pathe: 2.0.3
- picomatch: 4.0.3
- std-env: 4.0.0
- tinybench: 2.9.0
- tinyexec: 1.0.2
- tinyglobby: 0.2.15
- tinyrainbow: 3.1.0
- vite: 7.1.12(@types/node@24.13.2)
- why-is-node-running: 2.3.0
- optionalDependencies:
- '@types/node': 24.13.2
- transitivePeerDependencies:
- - msw
-
vue@3.5.13(typescript@5.9.2):
dependencies:
'@vue/compiler-dom': 3.5.13
@@ -2950,9 +2142,4 @@ snapshots:
whatwg-mimetype@4.0.0: {}
- why-is-node-running@2.3.0:
- dependencies:
- siginfo: 2.0.0
- stackback: 0.0.2
-
zwitch@2.0.4: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 6ae6b5ab..4a72b7ce 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,7 +1,3 @@
# See: https://pnpm.io/supply-chain-security
blockExoticSubdeps: true
minimumReleaseAge: 20160 # 14 days (keep in sync with Renovate config)
-minimumReleaseAgeExclude:
- - '@api3/*'
- # TODO Remove the below exclusions in the last week of Jan 2026
- - 'zod@4.3.5'
diff --git a/renovate.json b/renovate.json
index add488ca..e264cf74 100644
--- a/renovate.json
+++ b/renovate.json
@@ -1,13 +1,5 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["local>api3dao/renovate-config"],
- "packageRules": [
- {
- "matchPackageNames": ["@api3/*"],
- "schedule": ["before 6pm"],
- "minimumReleaseAge": "0 days",
- "groupName": "api3"
- }
- ],
"reviewers": ["Siegrift"]
}
diff --git a/scripts/generate-llms-files.js b/scripts/generate-llms-files.js
index deefb069..4491852f 100644
--- a/scripts/generate-llms-files.js
+++ b/scripts/generate-llms-files.js
@@ -1,14 +1,17 @@
const fs = require('fs');
const path = require('path');
-const dappsSidebar = require('../docs/dapps/sidebar.js');
-const oevSidebar = require('../docs/oev/sidebar.js');
-const curationSidebar = require('../docs/curation/sidebar.js');
+const config = require('../docs/.vitepress/config.js');
const docsDir = path.join(__dirname, '..', 'docs');
const staticDir = path.join(__dirname, '..', 'docs', 'public');
const llmsTxtPath = path.join(staticDir, 'llms.txt');
const llmsFullTxtPath = path.join(staticDir, 'llms-full.txt');
+const sections = Object.entries(config.themeConfig.sidebar).map(([prefix, sidebar]) => ({
+ title: config.themeConfig.nav.find((item) => item.link === prefix)?.text ?? prefix,
+ sidebar,
+}));
+
function getMarkdownFiles(items) {
let files = [];
for (const item of items) {
@@ -23,26 +26,32 @@ function getMarkdownFiles(items) {
}
function generateLlmsTxt() {
- let content = '# Api3 Docs\n\n';
- content += `> Api3 Docs helps developers build dApps using Api3 data feeds and searchers recapture oracle extractable value (OEV).\n\n`;
-
- const sidebars = {
- dapps: dappsSidebar,
- oev: oevSidebar,
- curation: curationSidebar,
- };
+ let content = `# ${config.title}\n\n`;
+ content += `> Documentation for API3, covering ${sections.map((section) => section.title).join(', ')}.\n\n`;
- for (const key in sidebars) {
- const sidebar = sidebars[key];
- if (sidebar) {
- content += `## ${key}\n\n`;
- const files = getMarkdownFiles(sidebar);
- for (const file of files) {
- const filePath = path.join(docsDir, `${file}.md`);
- if (fs.existsSync(filePath)) {
- const fileContent = fs.readFileSync(filePath, 'utf-8');
+ for (const { title, sidebar } of sections) {
+ content += `## ${title}\n\n`;
+ const files = getMarkdownFiles(sidebar);
+ for (const file of files) {
+ const filePath = path.join(docsDir, `${file}.md`);
+ if (fs.existsSync(filePath)) {
+ const fileContent = fs.readFileSync(filePath, 'utf-8');
+ const lines = fileContent.split('\n');
+ let title = path.basename(file, '.md');
+ for (const line of lines) {
+ if (line.startsWith('title: ')) {
+ title = line.substring('title: '.length);
+ break;
+ }
+ }
+ const url = `https://docs.api3.org${file}`;
+ content += `- [${title}](${url.replace(/\/$/, '/index')}.html)\n`;
+ } else {
+ const indexPath = path.join(docsDir, file, 'index.md');
+ if (fs.existsSync(indexPath)) {
+ const fileContent = fs.readFileSync(indexPath, 'utf-8');
const lines = fileContent.split('\n');
- let title = path.basename(file, '.md');
+ let title = path.basename(file);
for (const line of lines) {
if (line.startsWith('title: ')) {
title = line.substring('title: '.length);
@@ -50,26 +59,11 @@ function generateLlmsTxt() {
}
}
const url = `https://docs.api3.org${file}`;
- content += `- [${title}](${url.replace(/\/$/, '/index')}.html)\n`;
- } else {
- const indexPath = path.join(docsDir, file, 'index.md');
- if (fs.existsSync(indexPath)) {
- const fileContent = fs.readFileSync(indexPath, 'utf-8');
- const lines = fileContent.split('\n');
- let title = path.basename(file);
- for (const line of lines) {
- if (line.startsWith('title: ')) {
- title = line.substring('title: '.length);
- break;
- }
- }
- const url = `https://docs.api3.org${file}`;
- content += `- [${title}](${url.replace(/\/$/, '/index.html')})\n`;
- }
+ content += `- [${title}](${url.replace(/\/$/, '/index.html')})\n`;
}
}
- content += '\n';
}
+ content += '\n';
}
fs.writeFileSync(llmsTxtPath, content);
diff --git a/vite.config.js b/vite.config.js
deleted file mode 100644
index ef0ff398..00000000
--- a/vite.config.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineConfig } from 'vite';
-
-/*
-https://stackoverflow.com/questions/69260715/skipping-larger-chunks-while-running-npm-run-build
-https://rollupjs.org/guide/en/#outputmanualchunks
-*/
-export default defineConfig({
- build: {
- rollupOptions: {
- output: {
- manualChunks(id) {
- if (id.includes('node_modules')) {
- return id.toString().split('node_modules/')[1].split('/')[0].toString();
- }
- },
- },
- },
- },
-});