From 0f306b87482266f19aa517135bb5e7b1454be958 Mon Sep 17 00:00:00 2001 From: Nur Fikri Date: Sat, 7 Mar 2026 00:08:11 +0700 Subject: [PATCH 01/17] feat: cosmjs docs --- cosmjs/getting-started.mdx | 68 + cosmjs/overview.mdx | 43 + docs.json | 13 + sdk/v0.50/user/run-node/interact-node.mdx | 2 +- sdk/v0.50/user/run-node/txs.mdx | 2 +- yarn.lock | 6928 +++++++++++++++++++++ 6 files changed, 7054 insertions(+), 2 deletions(-) create mode 100644 cosmjs/getting-started.mdx create mode 100644 cosmjs/overview.mdx create mode 100644 yarn.lock diff --git a/cosmjs/getting-started.mdx b/cosmjs/getting-started.mdx new file mode 100644 index 000000000..927d21086 --- /dev/null +++ b/cosmjs/getting-started.mdx @@ -0,0 +1,68 @@ +--- +title: Getting Started with CosmJS +description: The official JavaScript & TypeScript client library for Cosmos SDK blockchains +--- + +Get started with CosmJS in 60 seconds. + +## 1. Install + +```bash +npm install @cosmjs/stargate @cosmjs/proto-signing +``` + +## 2. Connect to a Chain + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.cosmos.network"); + +const chainId = await client.getChainId(); +const height = await client.getHeight(); +console.info(`Connected to ${chainId} at height ${height}`); +``` + +## 3. Query Data + +```typescript +const balance = await client.getBalance("cosmos1...", "uatom"); +console.info(`Balance: ${balance.amount}${balance.denom}`); +``` + +## 4. Create a Signer + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic here ...", { + prefix: "cosmos", +}); +const [{ address }] = await wallet.getAccounts(); +console.info("Address:", address); +``` + +## 5. Send a Transaction + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const signingClient = await SigningStargateClient.connectWithSigner( + "https://rpc.cosmos.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const result = await signingClient.sendTokens( + address, + "cosmos1recipientaddress...", + [{ denom: "uatom", amount: "1000000" }], + "auto", +); +console.info("Tx hash:", result.transactionHash); +``` + +--- + +That's it. You've connected to a Cosmos chain, queried a balance, and sent +tokens — all in a few lines of TypeScript. diff --git a/cosmjs/overview.mdx b/cosmjs/overview.mdx new file mode 100644 index 000000000..601d59e13 --- /dev/null +++ b/cosmjs/overview.mdx @@ -0,0 +1,43 @@ +--- +title: What is CosmJS +description: The official JavaScript & TypeScript client library for Cosmos SDK blockchains +--- + +[CosmJS](https://github.com/cosmos/cosmjs) is the official JavaScript/TypeScript client library for interacting with Cosmos SDK blockchains. It enables web and Node.js applications to query on-chain state, construct and sign transactions, and broadcast them to the network. + +## Packages + +CosmJS is published as a set of scoped npm packages. Use the ones that match your needs: + +| Package | Description | +| --- | --- | +| `@cosmjs/stargate` | High-level client for querying and broadcasting on Cosmos SDK 0.40+ chains | +| `@cosmjs/proto-signing` | Wallet primitives and Protobuf-based transaction signing | +| `@cosmjs/cosmwasm-stargate` | Client extensions for CosmWasm-enabled chains | +| `@cosmjs/amino` | Amino signing support for legacy compatibility | +| `@cosmjs/tendermint-rpc` | Low-level Tendermint/CometBFT RPC client | +| `@cosmjs/encoding` | Encoding utilities (hex, base64, bech32, UTF-8) | +| `@cosmjs/math` | Integer and decimal math for blockchain amounts | +| `@cosmjs/crypto` | Cryptographic primitives (secp256k1, SHA-256, etc.) | + +## Key Features + +- **Query chain state** — balances, accounts, staking, governance, and arbitrary module queries via gRPC or RPC +- **Sign transactions** — Protobuf (`SIGN_MODE_DIRECT`) and Amino (`SIGN_MODE_LEGACY_AMINO_JSON`) signing +- **Broadcast transactions** — submit signed transactions and monitor results +- **Wallet support** — generate wallets from mnemonics or integrate browser extensions like [Keplr](https://keplr.app) and [Leap](https://leapwallet.io) +- **Custom modules** — register custom message types for application-specific chains +- **CosmWasm** — first-class support for deploying, instantiating, and executing smart contracts + +## Getting Started + + + + Install CosmJS, connect to a node, query state, and send your first transaction. + + + +## Further Resources + +- [CosmJS GitHub Repository](https://github.com/cosmos/cosmjs) +- [CosmJS API Documentation](https://cosmos.github.io/cosmjs) diff --git a/docs.json b/docs.json index 8a618a913..0e78292a4 100644 --- a/docs.json +++ b/docs.json @@ -6999,6 +6999,19 @@ } ] }, + { + "dropdown": "CosmJS", + "icon": "js", + "groups": [ + { + "group": "CosmJS", + "pages": [ + "cosmjs/overview", + "cosmjs/getting-started" + ] + } + ] + }, { "dropdown": "Cosmos Hub", "icon": "/assets/icons/hub.svg", diff --git a/sdk/v0.50/user/run-node/interact-node.mdx b/sdk/v0.50/user/run-node/interact-node.mdx index ce280ee28..d01bb8c70 100644 --- a/sdk/v0.50/user/run-node/interact-node.mdx +++ b/sdk/v0.50/user/run-node/interact-node.mdx @@ -256,7 +256,7 @@ func main() { ### CosmJS -CosmJS documentation can be found at [Link](https://cosmos.github.io/cosmjs). As of January 2021, CosmJS documentation is still work in progress. +CosmJS is the official JavaScript/TypeScript client library for Cosmos SDK chains. See the dedicated [CosmJS guide](/cosmjs/getting-started) for setup, querying, and transaction examples. ## Using the REST Endpoints diff --git a/sdk/v0.50/user/run-node/txs.mdx b/sdk/v0.50/user/run-node/txs.mdx index ef6f29d42..f39b76689 100644 --- a/sdk/v0.50/user/run-node/txs.mdx +++ b/sdk/v0.50/user/run-node/txs.mdx @@ -499,4 +499,4 @@ curl -X POST \ ## Using CosmJS (JavaScript & TypeScript) -CosmJS aims to build client libraries in JavaScript that can be embedded in web applications. Please see [Link](https://cosmos.github.io/cosmjs) for more information. As of January 2021, CosmJS documentation is still work in progress. +CosmJS is the official JavaScript/TypeScript client library for generating, signing, and broadcasting transactions on Cosmos SDK chains. See the dedicated [CosmJS guide](/cosmjs/getting-started) for full setup and usage examples. diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..9ee6584b9 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,6928 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@alcalzone/ansi-tokenize@^0.2.0": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.2.3.tgz#16b3728b96c845546191c28ce511766b52794e68" + integrity sha512-jsElTJ0sQ4wHRz+C45tfect76BwbTbgkgKByOzpCN9xG61N5V6u/glvg1CsNJhq2xJIFpKHSwG3D2wPPuEYOrQ== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@ark/schema@0.55.0": + version "0.55.0" + resolved "https://registry.yarnpkg.com/@ark/schema/-/schema-0.55.0.tgz#017abe2afe1a959086abcf5aae05acee5f14b3b2" + integrity sha512-IlSIc0FmLKTDGr4I/FzNHauMn0MADA6bCjT1wauu4k6MyxhC1R9gz0olNpIRvK7lGGDwtc/VO0RUDNvVQW5WFg== + dependencies: + "@ark/util" "0.55.0" + +"@ark/schema@0.56.0": + version "0.56.0" + resolved "https://registry.yarnpkg.com/@ark/schema/-/schema-0.56.0.tgz#62126c285e372fa7f0be5c7419dd24728b090ab2" + integrity sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA== + dependencies: + "@ark/util" "0.56.0" + +"@ark/util@0.55.0": + version "0.55.0" + resolved "https://registry.yarnpkg.com/@ark/util/-/util-0.55.0.tgz#b991da6998ba942e4cb81db2772ad23ea3586bde" + integrity sha512-aWFNK7aqSvqFtVsl1xmbTjGbg91uqtJV7Za76YGNEwIO4qLjMfyY8flmmbhooYMuqPCO2jyxu8hve943D+w3bA== + +"@ark/util@0.56.0": + version "0.56.0" + resolved "https://registry.yarnpkg.com/@ark/util/-/util-0.56.0.tgz#d110f1c55ea934f0fba930deada16254791d7fe3" + integrity sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA== + +"@asyncapi/parser@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@asyncapi/parser/-/parser-3.4.0.tgz#b5a5aca565125579eb76c092c21ef357bcedd805" + integrity sha512-Sxn74oHiZSU6+cVeZy62iPZMFMvKp4jupMFHelSICCMw1qELmUHPvuZSr+ZHDmNGgHcEpzJM5HN02kR7T4g+PQ== + dependencies: + "@asyncapi/specs" "^6.8.0" + "@openapi-contrib/openapi-schema-to-json-schema" "~3.2.0" + "@stoplight/json" "3.21.0" + "@stoplight/json-ref-readers" "^1.2.2" + "@stoplight/json-ref-resolver" "^3.1.5" + "@stoplight/spectral-core" "^1.18.3" + "@stoplight/spectral-functions" "^1.7.2" + "@stoplight/spectral-parsers" "^1.0.2" + "@stoplight/spectral-ref-resolver" "^1.0.3" + "@stoplight/types" "^13.12.0" + "@types/json-schema" "^7.0.11" + "@types/urijs" "^1.19.19" + ajv "^8.17.1" + ajv-errors "^3.0.0" + ajv-formats "^2.1.1" + avsc "^5.7.5" + js-yaml "^4.1.0" + jsonpath-plus "^10.0.0" + node-fetch "2.6.7" + +"@asyncapi/specs@^6.8.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@asyncapi/specs/-/specs-6.10.0.tgz#5f61bec36b95e7fa1c9fe2b866f4798458c6cc57" + integrity sha512-vB5oKLsdrLUORIZ5BXortZTlVyGWWMC1Nud/0LtgxQ3Yn2738HigAD6EVqScvpPsDUI/bcLVsYEXN4dtXQHVng== + dependencies: + "@types/json-schema" "^7.0.11" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.28.6.tgz#72499312ec58b1e2245ba4a4f550c132be4982f7" + integrity sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q== + dependencies: + "@babel/helper-validator-identifier" "^7.28.5" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@canvas/image-data@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@canvas/image-data/-/image-data-1.1.0.tgz#ead4e594515f144cc372892cacb4b24ec6d43629" + integrity sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA== + +"@emnapi/runtime@^1.2.0", "@emnapi/runtime@^1.7.0": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.8.1.tgz#550fa7e3c0d49c5fb175a116e8cd70614f9a22a5" + integrity sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg== + dependencies: + tslib "^2.4.0" + +"@img/colour@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/colour/-/colour-1.0.0.tgz#d2fabb223455a793bf3bf9c70de3d28526aa8311" + integrity sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw== + +"@img/sharp-darwin-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" + integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.4" + +"@img/sharp-darwin-arm64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz#6e0732dcade126b6670af7aa17060b926835ea86" + integrity sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.2.4" + +"@img/sharp-darwin-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" + integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.4" + +"@img/sharp-darwin-x64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz#19bc1dd6eba6d5a96283498b9c9f401180ee9c7b" + integrity sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.2.4" + +"@img/sharp-libvips-darwin-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" + integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== + +"@img/sharp-libvips-darwin-arm64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz#2894c0cb87d42276c3889942e8e2db517a492c43" + integrity sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g== + +"@img/sharp-libvips-darwin-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" + integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== + +"@img/sharp-libvips-darwin-x64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz#e63681f4539a94af9cd17246ed8881734386f8cc" + integrity sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg== + +"@img/sharp-libvips-linux-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" + integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== + +"@img/sharp-libvips-linux-arm64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz#b1b288b36864b3bce545ad91fa6dadcf1a4ad318" + integrity sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw== + +"@img/sharp-libvips-linux-arm@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" + integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== + +"@img/sharp-libvips-linux-arm@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz#b9260dd1ebe6f9e3bdbcbdcac9d2ac125f35852d" + integrity sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A== + +"@img/sharp-libvips-linux-ppc64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz#4b83ecf2a829057222b38848c7b022e7b4d07aa7" + integrity sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA== + +"@img/sharp-libvips-linux-riscv64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz#880b4678009e5a2080af192332b00b0aaf8a48de" + integrity sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA== + +"@img/sharp-libvips-linux-s390x@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" + integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== + +"@img/sharp-libvips-linux-s390x@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz#74f343c8e10fad821b38f75ced30488939dc59ec" + integrity sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ== + +"@img/sharp-libvips-linux-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" + integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== + +"@img/sharp-libvips-linux-x64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz#df4183e8bd8410f7d61b66859a35edeab0a531ce" + integrity sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" + integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== + +"@img/sharp-libvips-linuxmusl-arm64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz#c8d6b48211df67137541007ee8d1b7b1f8ca8e06" + integrity sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw== + +"@img/sharp-libvips-linuxmusl-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" + integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== + +"@img/sharp-libvips-linuxmusl-x64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz#be11c75bee5b080cbee31a153a8779448f919f75" + integrity sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg== + +"@img/sharp-linux-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" + integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.4" + +"@img/sharp-linux-arm64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz#7aa7764ef9c001f15e610546d42fce56911790cc" + integrity sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.2.4" + +"@img/sharp-linux-arm@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" + integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.5" + +"@img/sharp-linux-arm@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz#5fb0c3695dd12522d39c3ff7a6bc816461780a0d" + integrity sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.2.4" + +"@img/sharp-linux-ppc64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz#9c213a81520a20caf66978f3d4c07456ff2e0813" + integrity sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA== + optionalDependencies: + "@img/sharp-libvips-linux-ppc64" "1.2.4" + +"@img/sharp-linux-riscv64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz#cdd28182774eadbe04f62675a16aabbccb833f60" + integrity sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw== + optionalDependencies: + "@img/sharp-libvips-linux-riscv64" "1.2.4" + +"@img/sharp-linux-s390x@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" + integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.4" + +"@img/sharp-linux-s390x@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz#93eac601b9f329bb27917e0e19098c722d630df7" + integrity sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.2.4" + +"@img/sharp-linux-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" + integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.4" + +"@img/sharp-linux-x64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz#55abc7cd754ffca5002b6c2b719abdfc846819a8" + integrity sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.2.4" + +"@img/sharp-linuxmusl-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" + integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + +"@img/sharp-linuxmusl-arm64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz#d6515ee971bb62f73001a4829b9d865a11b77086" + integrity sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.2.4" + +"@img/sharp-linuxmusl-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" + integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + +"@img/sharp-linuxmusl-x64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz#d97978aec7c5212f999714f2f5b736457e12ee9f" + integrity sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.2.4" + +"@img/sharp-wasm32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" + integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== + dependencies: + "@emnapi/runtime" "^1.2.0" + +"@img/sharp-wasm32@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz#2f15803aa626f8c59dd7c9d0bbc766f1ab52cfa0" + integrity sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw== + dependencies: + "@emnapi/runtime" "^1.7.0" + +"@img/sharp-win32-arm64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz#3706e9e3ac35fddfc1c87f94e849f1b75307ce0a" + integrity sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g== + +"@img/sharp-win32-ia32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" + integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== + +"@img/sharp-win32-ia32@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz#0b71166599b049e032f085fb9263e02f4e4788de" + integrity sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg== + +"@img/sharp-win32-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" + integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== + +"@img/sharp-win32-x64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz#a81ffb00e69267cd0a1d626eaedb8a8430b2b2f8" + integrity sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw== + +"@inquirer/ansi@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.2.tgz#674a4c4d81ad460695cb2a1fc69d78cd187f337e" + integrity sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ== + +"@inquirer/checkbox@^4.3.0", "@inquirer/checkbox@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.3.2.tgz#e1483e6519d6ffef97281a54d2a5baa0d81b3f3b" + integrity sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA== + dependencies: + "@inquirer/ansi" "^1.0.2" + "@inquirer/core" "^10.3.2" + "@inquirer/figures" "^1.0.15" + "@inquirer/type" "^3.0.10" + yoctocolors-cjs "^2.1.3" + +"@inquirer/confirm@^5.1.19", "@inquirer/confirm@^5.1.21": + version "5.1.21" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.21.tgz#610c4acd7797d94890a6e2dde2c98eb1e891dd12" + integrity sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" + +"@inquirer/core@^10.1.2", "@inquirer/core@^10.3.2": + version "10.3.2" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.3.2.tgz#535979ff3ff4fe1e7cc4f83e2320504c743b7e20" + integrity sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A== + dependencies: + "@inquirer/ansi" "^1.0.2" + "@inquirer/figures" "^1.0.15" + "@inquirer/type" "^3.0.10" + cli-width "^4.1.0" + mute-stream "^2.0.0" + signal-exit "^4.1.0" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.3" + +"@inquirer/editor@^4.2.21", "@inquirer/editor@^4.2.23": + version "4.2.23" + resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.23.tgz#fe046a3bfdae931262de98c1052437d794322e0b" + integrity sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/external-editor" "^1.0.3" + "@inquirer/type" "^3.0.10" + +"@inquirer/expand@^4.0.21", "@inquirer/expand@^4.0.23": + version "4.0.23" + resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.23.tgz#a38b5f32226d75717c370bdfed792313b92bdc05" + integrity sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" + yoctocolors-cjs "^2.1.3" + +"@inquirer/external-editor@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@inquirer/external-editor/-/external-editor-1.0.3.tgz#c23988291ee676290fdab3fd306e64010a6d13b8" + integrity sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA== + dependencies: + chardet "^2.1.1" + iconv-lite "^0.7.0" + +"@inquirer/figures@^1.0.15": + version "1.0.15" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.15.tgz#dbb49ed80df11df74268023b496ac5d9acd22b3a" + integrity sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g== + +"@inquirer/input@^4.2.5", "@inquirer/input@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.3.1.tgz#778683b4c4c4d95d05d4b05c4a854964b73565b4" + integrity sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" + +"@inquirer/number@^3.0.21", "@inquirer/number@^3.0.23": + version "3.0.23" + resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.23.tgz#3fdec2540d642093fd7526818fd8d4bdc7335094" + integrity sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" + +"@inquirer/password@^4.0.21", "@inquirer/password@^4.0.23": + version "4.0.23" + resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.23.tgz#b9f5187c8c92fd7aa9eceb9d8f2ead0d7e7b000d" + integrity sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA== + dependencies: + "@inquirer/ansi" "^1.0.2" + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" + +"@inquirer/prompts@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.9.0.tgz#497718b2ac43b15cac636d8f7b501efd1574e1cd" + integrity sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A== + dependencies: + "@inquirer/checkbox" "^4.3.0" + "@inquirer/confirm" "^5.1.19" + "@inquirer/editor" "^4.2.21" + "@inquirer/expand" "^4.0.21" + "@inquirer/input" "^4.2.5" + "@inquirer/number" "^3.0.21" + "@inquirer/password" "^4.0.21" + "@inquirer/rawlist" "^4.1.9" + "@inquirer/search" "^3.2.0" + "@inquirer/select" "^4.4.0" + +"@inquirer/prompts@^7.2.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.10.1.tgz#e1436c0484cf04c22548c74e2cd239e989d5f847" + integrity sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg== + dependencies: + "@inquirer/checkbox" "^4.3.2" + "@inquirer/confirm" "^5.1.21" + "@inquirer/editor" "^4.2.23" + "@inquirer/expand" "^4.0.23" + "@inquirer/input" "^4.3.1" + "@inquirer/number" "^3.0.23" + "@inquirer/password" "^4.0.23" + "@inquirer/rawlist" "^4.1.11" + "@inquirer/search" "^3.2.2" + "@inquirer/select" "^4.4.2" + +"@inquirer/rawlist@^4.1.11", "@inquirer/rawlist@^4.1.9": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.1.11.tgz#313c8c3ffccb7d41e990c606465726b4a898a033" + integrity sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" + yoctocolors-cjs "^2.1.3" + +"@inquirer/search@^3.2.0", "@inquirer/search@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.2.2.tgz#4cc6fd574dcd434e4399badc37c742c3fd534ac8" + integrity sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/figures" "^1.0.15" + "@inquirer/type" "^3.0.10" + yoctocolors-cjs "^2.1.3" + +"@inquirer/select@^4.4.0", "@inquirer/select@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.4.2.tgz#2ac8fca960913f18f1d1b35323ed8fcd27d89323" + integrity sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w== + dependencies: + "@inquirer/ansi" "^1.0.2" + "@inquirer/core" "^10.3.2" + "@inquirer/figures" "^1.0.15" + "@inquirer/type" "^3.0.10" + yoctocolors-cjs "^2.1.3" + +"@inquirer/type@^3.0.10", "@inquirer/type@^3.0.2": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.10.tgz#11ed564ec78432a200ea2601a212d24af8150d50" + integrity sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA== + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jsep-plugin/assignment@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@jsep-plugin/assignment/-/assignment-1.3.0.tgz#fcfc5417a04933f7ceee786e8ab498aa3ce2b242" + integrity sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ== + +"@jsep-plugin/regex@^1.0.1", "@jsep-plugin/regex@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@jsep-plugin/regex/-/regex-1.0.4.tgz#cb2fc423220fa71c609323b9ba7f7d344a755fcc" + integrity sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg== + +"@jsep-plugin/ternary@^1.0.2": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@jsep-plugin/ternary/-/ternary-1.1.4.tgz#1ac778bee799137f116cc108f3bf58b9615c45c3" + integrity sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg== + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== + +"@mdx-js/mdx@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.1.1.tgz#c5ffd991a7536b149e17175eee57a1a2a511c6d1" + integrity sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdx" "^2.0.0" + acorn "^8.0.0" + collapse-white-space "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-util-scope "^1.0.0" + estree-walker "^3.0.0" + hast-util-to-jsx-runtime "^2.0.0" + markdown-extensions "^2.0.0" + recma-build-jsx "^1.0.0" + recma-jsx "^1.0.0" + recma-stringify "^1.0.0" + rehype-recma "^1.0.0" + remark-mdx "^3.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + source-map "^0.7.0" + unified "^11.0.0" + unist-util-position-from-estree "^2.0.0" + unist-util-stringify-position "^4.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +"@mdx-js/react@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-3.1.1.tgz#24bda7fffceb2fe256f954482123cda1be5f5fef" + integrity sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw== + dependencies: + "@types/mdx" "^2.0.0" + +"@mintlify/cli@4.0.890": + version "4.0.890" + resolved "https://registry.yarnpkg.com/@mintlify/cli/-/cli-4.0.890.tgz#edacc431273ae63a738444e583fe994f805586ee" + integrity sha512-Xb9ZS6Z6Noc5V+/u8eGFJGZXuTldWbU5HcrwVWQyIFMgcQ5140FMWhDMC4BCr2cEJyo6M2V+TJ9+QcdOgAq2BA== + dependencies: + "@inquirer/prompts" "7.9.0" + "@mintlify/common" "1.0.672" + "@mintlify/link-rot" "3.0.829" + "@mintlify/models" "0.0.257" + "@mintlify/prebuild" "1.0.807" + "@mintlify/previewing" "4.0.863" + "@mintlify/validation" "0.1.560" + adm-zip "0.5.16" + chalk "5.2.0" + color "4.2.3" + detect-port "1.5.1" + front-matter "4.0.2" + fs-extra "11.2.0" + ink "6.3.0" + inquirer "12.3.0" + js-yaml "4.1.0" + mdast-util-mdx-jsx "3.2.0" + react "19.2.3" + semver "7.7.2" + unist-util-visit "5.0.0" + yargs "17.7.1" + +"@mintlify/common@1.0.661": + version "1.0.661" + resolved "https://registry.yarnpkg.com/@mintlify/common/-/common-1.0.661.tgz#a09c70e1469a55e5956c9642b393b9250350c86d" + integrity sha512-/Hdiblzaomp+AWStQ4smhVMgesQhffzQjC9aYBnmLReNdh2Js+ccQFUaWL3TNIxwiS2esaZvsHSV/D+zyRS3hg== + dependencies: + "@asyncapi/parser" "3.4.0" + "@mintlify/mdx" "^3.0.4" + "@mintlify/models" "0.0.255" + "@mintlify/openapi-parser" "^0.0.8" + "@mintlify/validation" "0.1.555" + "@sindresorhus/slugify" "2.2.0" + "@types/mdast" "4.0.4" + acorn "8.11.2" + acorn-jsx "5.3.2" + color-blend "4.0.0" + estree-util-to-js "2.0.0" + estree-walker "3.0.3" + front-matter "4.0.2" + hast-util-from-html "2.0.3" + hast-util-to-html "9.0.4" + hast-util-to-text "4.0.2" + hex-rgb "5.0.0" + ignore "7.0.5" + js-yaml "4.1.0" + lodash "4.17.21" + mdast-util-from-markdown "2.0.2" + mdast-util-gfm "3.0.0" + mdast-util-mdx "3.0.0" + mdast-util-mdx-jsx "3.1.3" + micromark-extension-gfm "3.0.0" + micromark-extension-mdx-jsx "3.0.1" + micromark-extension-mdxjs "3.0.0" + openapi-types "12.1.3" + postcss "8.5.6" + rehype-stringify "10.0.1" + remark "15.0.1" + remark-frontmatter "5.0.0" + remark-gfm "4.0.0" + remark-math "6.0.0" + remark-mdx "3.1.0" + remark-parse "11.0.0" + remark-rehype "11.1.1" + remark-stringify "11.0.0" + tailwindcss "3.4.4" + unified "11.0.5" + unist-builder "4.0.0" + unist-util-map "4.0.0" + unist-util-remove "4.0.0" + unist-util-remove-position "5.0.0" + unist-util-visit "5.0.0" + unist-util-visit-parents "6.0.1" + vfile "6.0.3" + +"@mintlify/common@1.0.672": + version "1.0.672" + resolved "https://registry.yarnpkg.com/@mintlify/common/-/common-1.0.672.tgz#277a6731b0a37cb0dbd1fc283aed77a1cd05c1c7" + integrity sha512-IqG05ZyuyoKUctv84tO3bNczcUjXSUmhcYk9MWGaUWDYgdrFe+uIcTI8oT9UrV549Vh4JVZpYvmHIjjhHgMtXA== + dependencies: + "@asyncapi/parser" "3.4.0" + "@mintlify/mdx" "^3.0.4" + "@mintlify/models" "0.0.257" + "@mintlify/openapi-parser" "^0.0.8" + "@mintlify/validation" "0.1.560" + "@sindresorhus/slugify" "2.2.0" + "@types/mdast" "4.0.4" + acorn "8.11.2" + acorn-jsx "5.3.2" + color-blend "4.0.0" + estree-util-to-js "2.0.0" + estree-walker "3.0.3" + front-matter "4.0.2" + hast-util-from-html "2.0.3" + hast-util-to-html "9.0.4" + hast-util-to-text "4.0.2" + hex-rgb "5.0.0" + ignore "7.0.5" + js-yaml "4.1.0" + lodash "4.17.21" + mdast-util-from-markdown "2.0.2" + mdast-util-gfm "3.0.0" + mdast-util-mdx "3.0.0" + mdast-util-mdx-jsx "3.1.3" + micromark-extension-gfm "3.0.0" + micromark-extension-mdx-jsx "3.0.1" + micromark-extension-mdxjs "3.0.0" + openapi-types "12.1.3" + postcss "8.5.6" + rehype-stringify "10.0.1" + remark "15.0.1" + remark-frontmatter "5.0.0" + remark-gfm "4.0.0" + remark-math "6.0.0" + remark-mdx "3.1.0" + remark-parse "11.0.0" + remark-rehype "11.1.1" + remark-stringify "11.0.0" + tailwindcss "3.4.4" + unified "11.0.5" + unist-builder "4.0.0" + unist-util-map "4.0.0" + unist-util-remove "4.0.0" + unist-util-remove-position "5.0.0" + unist-util-visit "5.0.0" + unist-util-visit-parents "6.0.1" + vfile "6.0.3" + +"@mintlify/link-rot@3.0.829": + version "3.0.829" + resolved "https://registry.yarnpkg.com/@mintlify/link-rot/-/link-rot-3.0.829.tgz#226ca1ed5dd1c7ea7e6be277480578f6d2e62f6c" + integrity sha512-DvEw9i8SM9/Cu7x48Kn9ppCHTskyF8HrxZoMcwBmCMpTNauC75rXArerk6WwwVhupa67CdYV0v3f5AXUpAPrLg== + dependencies: + "@mintlify/common" "1.0.672" + "@mintlify/prebuild" "1.0.807" + "@mintlify/previewing" "4.0.863" + "@mintlify/scraping" "4.0.522" + "@mintlify/validation" "0.1.560" + fs-extra "11.1.0" + unist-util-visit "4.1.2" + +"@mintlify/mdx@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@mintlify/mdx/-/mdx-3.0.4.tgz#11fa9f4cac0bd24dcaea5d0a99a68d08db5c453a" + integrity sha512-tJhdpnM5ReJLNJ2fuDRIEr0zgVd6id7/oAIfs26V46QlygiLsc8qx4Rz3LWIX51rUXW/cfakjj0EATxIciIw+g== + dependencies: + "@shikijs/transformers" "^3.11.0" + "@shikijs/twoslash" "^3.12.2" + arktype "^2.1.26" + hast-util-to-string "^3.0.1" + mdast-util-from-markdown "^2.0.2" + mdast-util-gfm "^3.1.0" + mdast-util-mdx-jsx "^3.2.0" + mdast-util-to-hast "^13.2.0" + next-mdx-remote-client "^1.0.3" + rehype-katex "^7.0.1" + remark-gfm "^4.0.0" + remark-math "^6.0.0" + remark-smartypants "^3.0.2" + shiki "^3.11.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + +"@mintlify/models@0.0.255": + version "0.0.255" + resolved "https://registry.yarnpkg.com/@mintlify/models/-/models-0.0.255.tgz#34347052d742c81430d9ad3e0b1b9ddf9533c5e9" + integrity sha512-LIUkfA7l7ypHAAuOW74ZJws/NwNRqlDRD/U466jarXvvSlGhJec/6J4/I+IEcBvWDnc9anLFKmnGO04jPKgAsg== + dependencies: + axios "1.10.0" + openapi-types "12.1.3" + +"@mintlify/models@0.0.257": + version "0.0.257" + resolved "https://registry.yarnpkg.com/@mintlify/models/-/models-0.0.257.tgz#323cb34b0c80ffb903a8138d8e49910353306adc" + integrity sha512-0Ddk4fY8IAR/HvXshGla5zwbLKbo53p6wGD01Kch8u/86UP5GT8PbFJRQonAO3DaI/veJ27WXZtP2eAvk9zdzw== + dependencies: + axios "1.10.0" + openapi-types "12.1.3" + +"@mintlify/openapi-parser@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@mintlify/openapi-parser/-/openapi-parser-0.0.8.tgz#09cf5fab762956dddc91dddfb818f076fe1aea81" + integrity sha512-9MBRq9lS4l4HITYCrqCL7T61MOb20q9IdU7HWhqYMNMM1jGO1nHjXasFy61yZ8V6gMZyyKQARGVoZ0ZrYN48Og== + dependencies: + ajv "^8.17.1" + ajv-draft-04 "^1.0.0" + ajv-formats "^3.0.1" + jsonpointer "^5.0.1" + leven "^4.0.0" + yaml "^2.4.5" + +"@mintlify/prebuild@1.0.807": + version "1.0.807" + resolved "https://registry.yarnpkg.com/@mintlify/prebuild/-/prebuild-1.0.807.tgz#314a39179f26e8b10a2c9e9cd6b58938475a5a71" + integrity sha512-Njpfy2bwlcyw9LUjnXOoMCq1VmRF5A26rx+mIOvA3Ho4VBB3JIAC9xylBU/cqxPRg5L72l8AsDDLeRx0e7E1/Q== + dependencies: + "@mintlify/common" "1.0.672" + "@mintlify/openapi-parser" "^0.0.8" + "@mintlify/scraping" "4.0.533" + "@mintlify/validation" "0.1.560" + chalk "5.3.0" + favicons "7.2.0" + front-matter "4.0.2" + fs-extra "11.1.0" + js-yaml "4.1.0" + openapi-types "12.1.3" + sharp "0.33.5" + sharp-ico "0.1.5" + unist-util-visit "4.1.2" + uuid "11.1.0" + +"@mintlify/previewing@4.0.863": + version "4.0.863" + resolved "https://registry.yarnpkg.com/@mintlify/previewing/-/previewing-4.0.863.tgz#3c3319e552f0ab46a1f3bfd5e4fb09cecbbedbbf" + integrity sha512-WhZhiaP5WGn9iqcbzWgJhjHDyzVfjDxLdZaHlirYdVSii7iJX0mO5lJtUNqF9+C/m+B019DYKcenA8bjeaM00A== + dependencies: + "@mintlify/common" "1.0.672" + "@mintlify/prebuild" "1.0.807" + "@mintlify/validation" "0.1.560" + better-opn "3.0.2" + chalk "5.2.0" + chokidar "3.5.3" + express "4.18.2" + front-matter "4.0.2" + fs-extra "11.1.0" + got "13.0.0" + ink "6.3.0" + ink-spinner "5.0.0" + is-online "10.0.0" + js-yaml "4.1.0" + openapi-types "12.1.3" + react "19.2.3" + socket.io "4.7.2" + tar "6.1.15" + unist-util-visit "4.1.2" + yargs "17.7.1" + +"@mintlify/scraping@4.0.522": + version "4.0.522" + resolved "https://registry.yarnpkg.com/@mintlify/scraping/-/scraping-4.0.522.tgz#8a4a2ad68b73d83c3719258c48c21cd5d2649680" + integrity sha512-PL2k52WT5S5OAgnT2K13bP7J2El6XwiVvQlrLvxDYw5KMMV+y34YVJI8ZscKb4trjitWDgyK0UTq2KN6NQgn6g== + dependencies: + "@mintlify/common" "1.0.661" + "@mintlify/openapi-parser" "^0.0.8" + fs-extra "11.1.1" + hast-util-to-mdast "10.1.0" + js-yaml "4.1.0" + mdast-util-mdx-jsx "3.1.3" + neotraverse "0.6.18" + puppeteer "22.14.0" + rehype-parse "9.0.1" + remark-gfm "4.0.0" + remark-mdx "3.0.1" + remark-parse "11.0.0" + remark-stringify "11.0.0" + unified "11.0.5" + unist-util-visit "5.0.0" + yargs "17.7.1" + zod "3.21.4" + +"@mintlify/scraping@4.0.533": + version "4.0.533" + resolved "https://registry.yarnpkg.com/@mintlify/scraping/-/scraping-4.0.533.tgz#41773991db12666f1896e4d3dc6723aa4b8aae68" + integrity sha512-K/Gn7KR/MTcsopQ3nP2ApU3hhmyf/vlGXc0mnb1z7EpgOIgQDHF9wPG9sUQOxJFeF6RsPL3brZXfv7B/BG5OIw== + dependencies: + "@mintlify/common" "1.0.672" + "@mintlify/openapi-parser" "^0.0.8" + fs-extra "11.1.1" + hast-util-to-mdast "10.1.0" + js-yaml "4.1.0" + mdast-util-mdx-jsx "3.1.3" + neotraverse "0.6.18" + puppeteer "22.14.0" + rehype-parse "9.0.1" + remark-gfm "4.0.0" + remark-mdx "3.0.1" + remark-parse "11.0.0" + remark-stringify "11.0.0" + unified "11.0.5" + unist-util-visit "5.0.0" + yargs "17.7.1" + zod "3.21.4" + +"@mintlify/validation@0.1.555": + version "0.1.555" + resolved "https://registry.yarnpkg.com/@mintlify/validation/-/validation-0.1.555.tgz#f27d454f357d2814383c55c8dd9db937a807bc22" + integrity sha512-11QVUReL4N5u8wSCgZt4RN7PA0jYQoMEBZ5IrUp5pgb5ZJBOoGV/vPsQrxPPa1cxsUDAuToNhtGxRQtOav/w8w== + dependencies: + "@mintlify/mdx" "^3.0.4" + "@mintlify/models" "0.0.255" + arktype "2.1.27" + js-yaml "4.1.0" + lcm "0.0.3" + lodash "4.17.21" + object-hash "3.0.0" + openapi-types "12.1.3" + uuid "11.1.0" + zod "3.21.4" + zod-to-json-schema "3.20.4" + +"@mintlify/validation@0.1.560": + version "0.1.560" + resolved "https://registry.yarnpkg.com/@mintlify/validation/-/validation-0.1.560.tgz#fef133daf9491fd977e112ac08a322ba286b11dc" + integrity sha512-9GA+zmWuhuJexdiAGHx7Xo+fYOan4lnxLnmEh0LMX2vLSyo/D+UpW+IpXbHJv92rziIWMCRx68wK09WMxPEISw== + dependencies: + "@mintlify/mdx" "^3.0.4" + "@mintlify/models" "0.0.257" + arktype "2.1.27" + js-yaml "4.1.0" + lcm "0.0.3" + lodash "4.17.21" + object-hash "3.0.0" + openapi-types "12.1.3" + uuid "11.1.0" + zod "3.21.4" + zod-to-json-schema "3.20.4" + +"@next/env@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.3.4.tgz#5b41485596d5bfea0918db73f90b7a6db734da3f" + integrity sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ== + +"@next/swc-darwin-arm64@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.4.tgz#cb2849b8374eb6b52376d4e7abed2a21a2ff24d6" + integrity sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg== + +"@next/swc-darwin-x64@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.4.tgz#aa7fd968af7e53aa17d4f234cf7722b3899712cf" + integrity sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw== + +"@next/swc-linux-arm64-gnu@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.4.tgz#5da3d6d6055665d0c3a2dab0bc0471064bc9eece" + integrity sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g== + +"@next/swc-linux-arm64-musl@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.4.tgz#9043ccc397746c94c2452d301e8f95a33aec22e8" + integrity sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw== + +"@next/swc-linux-x64-gnu@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.4.tgz#49a33f904a51a8c665406ca7e5a748f480bf195d" + integrity sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg== + +"@next/swc-linux-x64-musl@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.4.tgz#8beaff35d8f11961ea80d12a10226581df4c5a74" + integrity sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A== + +"@next/swc-win32-arm64-msvc@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.4.tgz#149d9a35068ecda317af138814539929c9c269af" + integrity sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ== + +"@next/swc-win32-x64-msvc@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.4.tgz#a652327782d838c2b875eaf216187c51b8409775" + integrity sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@openapi-contrib/openapi-schema-to-json-schema@~3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@openapi-contrib/openapi-schema-to-json-schema/-/openapi-schema-to-json-schema-3.2.0.tgz#c4c92edd4478b5ecb3d99c29ecb355118259dccc" + integrity sha512-Gj6C0JwCr8arj0sYuslWXUBSP/KnUlEGnPW4qxlXvAl543oaNQgMgIgkQUA6vs5BCCvwTEiL8m/wdWzfl4UvSw== + dependencies: + fast-deep-equal "^3.1.3" + +"@puppeteer/browsers@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.3.0.tgz#791ea7d80450fea24eb19fb1d70c367ad4e08cae" + integrity sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA== + dependencies: + debug "^4.3.5" + extract-zip "^2.0.1" + progress "^2.0.3" + proxy-agent "^6.4.0" + semver "^7.6.3" + tar-fs "^3.0.6" + unbzip2-stream "^1.4.3" + yargs "^17.7.2" + +"@shikijs/core@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-3.21.0.tgz#9641d09865c43612b28e7931f9af68c8a62edd90" + integrity sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA== + dependencies: + "@shikijs/types" "3.21.0" + "@shikijs/vscode-textmate" "^10.0.2" + "@types/hast" "^3.0.4" + hast-util-to-html "^9.0.5" + +"@shikijs/engine-javascript@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-3.21.0.tgz#f04554fe87bed39d00ba4b140894b41cd207f5cb" + integrity sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ== + dependencies: + "@shikijs/types" "3.21.0" + "@shikijs/vscode-textmate" "^10.0.2" + oniguruma-to-es "^4.3.4" + +"@shikijs/engine-oniguruma@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.21.0.tgz#0e666454a03fd85d6c634d9dbe70a63f007a6323" + integrity sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ== + dependencies: + "@shikijs/types" "3.21.0" + "@shikijs/vscode-textmate" "^10.0.2" + +"@shikijs/langs@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-3.21.0.tgz#da33400a85c7cba75fc9f4a6b9feb69a6c39c800" + integrity sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA== + dependencies: + "@shikijs/types" "3.21.0" + +"@shikijs/themes@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-3.21.0.tgz#1955d642ea37d70d1137e6cf47da7dc9c34ff4c0" + integrity sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw== + dependencies: + "@shikijs/types" "3.21.0" + +"@shikijs/transformers@^3.11.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/transformers/-/transformers-3.21.0.tgz#23969f0757b56c42cca6f121e79ec3957710b09a" + integrity sha512-CZwvCWWIiRRiFk9/JKzdEooakAP8mQDtBOQ1TKiCaS2E1bYtyBCOkUzS8akO34/7ufICQ29oeSfkb3tT5KtrhA== + dependencies: + "@shikijs/core" "3.21.0" + "@shikijs/types" "3.21.0" + +"@shikijs/twoslash@^3.12.2": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/twoslash/-/twoslash-3.21.0.tgz#2088c259e144a7e46fdcce40078733ec164d941b" + integrity sha512-iH360udAYON2JwfIldoCiMZr9MljuQA5QRBivKLpEuEpmVCSwrR+0WTQ0eS1ptgGBdH9weFiIsA5wJDzsEzTYg== + dependencies: + "@shikijs/core" "3.21.0" + "@shikijs/types" "3.21.0" + twoslash "^0.3.6" + +"@shikijs/types@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-3.21.0.tgz#510d6ddbea65add27980a6ca36cc7bdabc7afe90" + integrity sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA== + dependencies: + "@shikijs/vscode-textmate" "^10.0.2" + "@types/hast" "^3.0.4" + +"@shikijs/vscode-textmate@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" + integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== + +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + +"@sindresorhus/slugify@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/slugify/-/slugify-2.2.0.tgz#42738974ff19a9a306d3523a8595152998cc758e" + integrity sha512-9Vybc/qX8Kj6pxJaapjkFbiUJPk7MAkCh/GFCxIBnnsuYCFPIXKvnLidG8xlepht3i24L5XemUmGtrJ3UWrl6w== + dependencies: + "@sindresorhus/transliterate" "^1.0.0" + escape-string-regexp "^5.0.0" + +"@sindresorhus/transliterate@^1.0.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz#2309fff65a868047e6d2dd70dec747c5b36a8327" + integrity sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ== + dependencies: + escape-string-regexp "^5.0.0" + +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== + +"@stoplight/better-ajv-errors@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz#d74a5c4da5d786c17188d7f4edec505f089885fa" + integrity sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA== + dependencies: + jsonpointer "^5.0.0" + leven "^3.1.0" + +"@stoplight/json-ref-readers@1.2.2", "@stoplight/json-ref-readers@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@stoplight/json-ref-readers/-/json-ref-readers-1.2.2.tgz#e5992bae597f228f988f362a4c0304c03a92008b" + integrity sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ== + dependencies: + node-fetch "^2.6.0" + tslib "^1.14.1" + +"@stoplight/json-ref-resolver@^3.1.5", "@stoplight/json-ref-resolver@~3.1.6": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.6.tgz#dcf8724472b7d54e8e8952510f39b8ee901dcf56" + integrity sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A== + dependencies: + "@stoplight/json" "^3.21.0" + "@stoplight/path" "^1.3.2" + "@stoplight/types" "^12.3.0 || ^13.0.0" + "@types/urijs" "^1.19.19" + dependency-graph "~0.11.0" + fast-memoize "^2.5.2" + immer "^9.0.6" + lodash "^4.17.21" + tslib "^2.6.0" + urijs "^1.19.11" + +"@stoplight/json@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@stoplight/json/-/json-3.21.0.tgz#c0dff9c478f3365d7946cb6e34c17cc2fa84250b" + integrity sha512-5O0apqJ/t4sIevXCO3SBN9AHCEKKR/Zb4gaj7wYe5863jme9g02Q0n/GhM7ZCALkL+vGPTe4ZzTETP8TFtsw3g== + dependencies: + "@stoplight/ordered-object-literal" "^1.0.3" + "@stoplight/path" "^1.3.2" + "@stoplight/types" "^13.6.0" + jsonc-parser "~2.2.1" + lodash "^4.17.21" + safe-stable-stringify "^1.1" + +"@stoplight/json@^3.17.0", "@stoplight/json@^3.17.1", "@stoplight/json@^3.20.1", "@stoplight/json@^3.21.0", "@stoplight/json@~3.21.0": + version "3.21.7" + resolved "https://registry.yarnpkg.com/@stoplight/json/-/json-3.21.7.tgz#102f5fd11921984c96672ce4307850daa1cbfc7b" + integrity sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A== + dependencies: + "@stoplight/ordered-object-literal" "^1.0.3" + "@stoplight/path" "^1.3.2" + "@stoplight/types" "^13.6.0" + jsonc-parser "~2.2.1" + lodash "^4.17.21" + safe-stable-stringify "^1.1" + +"@stoplight/ordered-object-literal@^1.0.3", "@stoplight/ordered-object-literal@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz#06689095a4f1a53e9d9a5f0055f707c387af966a" + integrity sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg== + +"@stoplight/path@1.3.2", "@stoplight/path@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@stoplight/path/-/path-1.3.2.tgz#96e591496b72fde0f0cdae01a61d64f065bd9ede" + integrity sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ== + +"@stoplight/spectral-core@^1.18.3", "@stoplight/spectral-core@^1.19.2", "@stoplight/spectral-core@^1.19.4": + version "1.20.0" + resolved "https://registry.yarnpkg.com/@stoplight/spectral-core/-/spectral-core-1.20.0.tgz#26572b66c2307c3562ed5c9c1c5891cf6f72778e" + integrity sha512-5hBP81nCC1zn1hJXL/uxPNRKNcB+/pEIHgCjPRpl/w/qy9yC9ver04tw1W0l/PMiv0UeB5dYgozXVQ4j5a6QQQ== + dependencies: + "@stoplight/better-ajv-errors" "1.0.3" + "@stoplight/json" "~3.21.0" + "@stoplight/path" "1.3.2" + "@stoplight/spectral-parsers" "^1.0.0" + "@stoplight/spectral-ref-resolver" "^1.0.4" + "@stoplight/spectral-runtime" "^1.1.2" + "@stoplight/types" "~13.6.0" + "@types/es-aggregate-error" "^1.0.2" + "@types/json-schema" "^7.0.11" + ajv "^8.17.1" + ajv-errors "~3.0.0" + ajv-formats "~2.1.1" + es-aggregate-error "^1.0.7" + jsonpath-plus "^10.3.0" + lodash "~4.17.21" + lodash.topath "^4.5.2" + minimatch "3.1.2" + nimma "0.2.3" + pony-cause "^1.1.1" + simple-eval "1.0.1" + tslib "^2.8.1" + +"@stoplight/spectral-formats@^1.8.1": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@stoplight/spectral-formats/-/spectral-formats-1.8.2.tgz#d5bbdb5d0802b118c9b8f8bbf72d6f34f4248b54" + integrity sha512-c06HB+rOKfe7tuxg0IdKDEA5XnjL2vrn/m/OVIIxtINtBzphZrOgtRn7epQ5bQF5SWp84Ue7UJWaGgDwVngMFw== + dependencies: + "@stoplight/json" "^3.17.0" + "@stoplight/spectral-core" "^1.19.2" + "@types/json-schema" "^7.0.7" + tslib "^2.8.1" + +"@stoplight/spectral-functions@^1.7.2": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@stoplight/spectral-functions/-/spectral-functions-1.10.1.tgz#3f7e6fb3185a295ae30c9165a8b1530f63e739aa" + integrity sha512-obu8ZfoHxELOapfGsCJixKZXZcffjg+lSoNuttpmUFuDzVLT3VmH8QkPXfOGOL5Pz80BR35ClNAToDkdnYIURg== + dependencies: + "@stoplight/better-ajv-errors" "1.0.3" + "@stoplight/json" "^3.17.1" + "@stoplight/spectral-core" "^1.19.4" + "@stoplight/spectral-formats" "^1.8.1" + "@stoplight/spectral-runtime" "^1.1.2" + ajv "^8.17.1" + ajv-draft-04 "~1.0.0" + ajv-errors "~3.0.0" + ajv-formats "~2.1.1" + lodash "~4.17.21" + tslib "^2.8.1" + +"@stoplight/spectral-parsers@^1.0.0", "@stoplight/spectral-parsers@^1.0.2": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@stoplight/spectral-parsers/-/spectral-parsers-1.0.5.tgz#2febd979b2917465759c97fe7375145f86574ff2" + integrity sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ== + dependencies: + "@stoplight/json" "~3.21.0" + "@stoplight/types" "^14.1.1" + "@stoplight/yaml" "~4.3.0" + tslib "^2.8.1" + +"@stoplight/spectral-ref-resolver@^1.0.3", "@stoplight/spectral-ref-resolver@^1.0.4": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.5.tgz#2462ae79bbb90b7fcc76b014118a0beeee5e64d5" + integrity sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA== + dependencies: + "@stoplight/json-ref-readers" "1.2.2" + "@stoplight/json-ref-resolver" "~3.1.6" + "@stoplight/spectral-runtime" "^1.1.2" + dependency-graph "0.11.0" + tslib "^2.8.1" + +"@stoplight/spectral-runtime@^1.1.2": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@stoplight/spectral-runtime/-/spectral-runtime-1.1.4.tgz#6e6f69169d352732b0a9b95e0cc151605c510042" + integrity sha512-YHbhX3dqW0do6DhiPSgSGQzr6yQLlWybhKwWx0cqxjMwxej3TqLv3BXMfIUYFKKUqIwH4Q2mV8rrMM8qD2N0rQ== + dependencies: + "@stoplight/json" "^3.20.1" + "@stoplight/path" "^1.3.2" + "@stoplight/types" "^13.6.0" + abort-controller "^3.0.0" + lodash "^4.17.21" + node-fetch "^2.7.0" + tslib "^2.8.1" + +"@stoplight/types@^12.3.0 || ^13.0.0", "@stoplight/types@^13.12.0", "@stoplight/types@^13.6.0": + version "13.20.0" + resolved "https://registry.yarnpkg.com/@stoplight/types/-/types-13.20.0.tgz#d42682f1e3a14a3c60bdf0df08bff4023518763d" + integrity sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA== + dependencies: + "@types/json-schema" "^7.0.4" + utility-types "^3.10.0" + +"@stoplight/types@^14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@stoplight/types/-/types-14.1.1.tgz#0dd5761aac25673a951955e984c724c138368b7a" + integrity sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g== + dependencies: + "@types/json-schema" "^7.0.4" + utility-types "^3.10.0" + +"@stoplight/types@~13.6.0": + version "13.6.0" + resolved "https://registry.yarnpkg.com/@stoplight/types/-/types-13.6.0.tgz#96c6aaae05858b36f589821cd52c95aa9b205ce7" + integrity sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ== + dependencies: + "@types/json-schema" "^7.0.4" + utility-types "^3.10.0" + +"@stoplight/yaml-ast-parser@0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.50.tgz#ed625a1d9ae63eb61980446e058fa745386ab61e" + integrity sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ== + +"@stoplight/yaml@~4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@stoplight/yaml/-/yaml-4.3.0.tgz#ca403157472509812ccec6f277185e7e65d7bd7d" + integrity sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w== + dependencies: + "@stoplight/ordered-object-literal" "^1.0.5" + "@stoplight/types" "^14.1.1" + "@stoplight/yaml-ast-parser" "0.0.50" + tslib "^2.2.0" + +"@swc/counter@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/helpers@0.5.15": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" + integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== + dependencies: + tslib "^2.8.0" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + +"@types/acorn@^4.0.0": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" + integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== + dependencies: + "@types/estree" "*" + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.19" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.19.tgz#d93ea2673fd8c9f697367f5eeefc2bbfa94f0342" + integrity sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg== + dependencies: + "@types/node" "*" + +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/es-aggregate-error@^1.0.2": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz#1472dfb0fb1cb4c3f2bd3b2a7b7e19f60a1d66c0" + integrity sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg== + dependencies: + "@types/node" "*" + +"@types/estree-jsx@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/hast@^3.0.0", "@types/hast@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + +"@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + +"@types/json-schema@^7.0.11", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.7": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/katex@^0.16.0": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.8.tgz#80bf3e0814d09a846412a0b0f140946b79c36c3e" + integrity sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg== + +"@types/mdast@4.0.4", "@types/mdast@^4.0.0", "@types/mdast@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== + dependencies: + "@types/unist" "*" + +"@types/mdx@^2.0.0": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.13.tgz#68f6877043d377092890ff5b298152b0a21671bd" + integrity sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== + +"@types/ms@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== + +"@types/nlcst@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/nlcst/-/nlcst-2.0.3.tgz#31cad346eaab48a9a8a58465d3d05e2530dda762" + integrity sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA== + dependencies: + "@types/unist" "*" + +"@types/node@*", "@types/node@>=10.0.0": + version "25.0.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.9.tgz#81ce3579ddf67cae812a9d49c8a0ab90c82e7782" + integrity sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw== + dependencies: + undici-types "~7.16.0" + +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@types/unist@^2.0.0": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== + +"@types/urijs@^1.19.19": + version "1.19.26" + resolved "https://registry.yarnpkg.com/@types/urijs/-/urijs-1.19.26.tgz#500fc9912e0ba01d635480970bdc9ba0f45d7bc6" + integrity sha512-wkXrVzX5yoqLnndOwFsieJA7oKM8cNkOKJtf/3vVGSUFkWDKZvFHpIl9Pvqb/T9UsawBBFMTTD8xu7sK5MWuvg== + +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + +"@typescript/vfs@^1.6.2": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@typescript/vfs/-/vfs-1.6.2.tgz#e66883c5a8dcc5d2794dfa05c8f9749d767219f8" + integrity sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g== + dependencies: + debug "^4.1.1" + +"@ungap/structured-clone@^1.0.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@~1.3.4, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@5.3.2, acorn-jsx@^5.0.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@8.11.2: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + +acorn@^8.0.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +address@^1.0.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +adm-zip@0.5.16: + version "0.5.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.16.tgz#0b5e4c779f07dedea5805cdccb1147071d94a909" + integrity sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ== + +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + +aggregate-error@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" + integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== + dependencies: + clean-stack "^4.0.0" + indent-string "^5.0.0" + +ajv-draft-04@^1.0.0, ajv-draft-04@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" + integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== + +ajv-errors@^3.0.0, ajv-errors@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-3.0.0.tgz#e54f299f3a3d30fe144161e5f0d8d51196c527bc" + integrity sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ== + +ajv-formats@^2.1.1, ajv-formats@~2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-formats@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== + dependencies: + ajv "^8.0.0" + +ajv@^8.0.0, ajv@^8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-escapes@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.2.0.tgz#31b25afa3edd3efc09d98c2fee831d460ff06b49" + integrity sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw== + dependencies: + environment "^1.0.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.0.0, ansi-styles@^6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arkregex@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/arkregex/-/arkregex-0.0.3.tgz#2e2bdce5223e737cc134e4b0c9f228111d8cca57" + integrity sha512-bU21QJOJEFJK+BPNgv+5bVXkvRxyAvgnon75D92newgHxkBJTgiFwQxusyViYyJkETsddPlHyspshDQcCzmkNg== + dependencies: + "@ark/util" "0.55.0" + +arkregex@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/arkregex/-/arkregex-0.0.5.tgz#0a2d5f6ae11de6b6200f2326f65960f85dac62fb" + integrity sha512-ncYjBdLlh5/QnVsAA8De16Tc9EqmYM7y/WU9j+236KcyYNUXogpz3sC4ATIZYzzLxwI+0sEOaQLEmLmRleaEXw== + dependencies: + "@ark/util" "0.56.0" + +arktype@2.1.27: + version "2.1.27" + resolved "https://registry.yarnpkg.com/arktype/-/arktype-2.1.27.tgz#882f5ef93d05d292a10db0ad31cd37fa46efe048" + integrity sha512-enctOHxI4SULBv/TDtCVi5M8oLd4J5SVlPUblXDzSsOYQNMzmVbUosGBnJuZDKmFlN5Ie0/QVEuTE+Z5X1UhsQ== + dependencies: + "@ark/schema" "0.55.0" + "@ark/util" "0.55.0" + arkregex "0.0.3" + +arktype@^2.1.26: + version "2.1.29" + resolved "https://registry.yarnpkg.com/arktype/-/arktype-2.1.29.tgz#23bee076c8851d14e792bde6cd328b578a5654d9" + integrity sha512-jyfKk4xIOzvYNayqnD8ZJQqOwcrTOUbIU4293yrzAjA3O1dWh61j71ArMQ6tS/u4pD7vabSPe7nG3RCyoXW6RQ== + dependencies: + "@ark/schema" "0.56.0" + "@ark/util" "0.56.0" + arkregex "0.0.5" + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-iterate@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/array-iterate/-/array-iterate-2.0.1.tgz#6efd43f8295b3fee06251d3d62ead4bd9805dd24" + integrity sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg== + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + +astring@^1.8.0, astring@^1.8.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.9.0.tgz#cc73e6062a7eb03e7d19c22d8b0b3451fd9bfeef" + integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== + +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +auto-bind@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-5.0.1.tgz#50d8e63ea5a1dddcb5e5e36451c1a8266ffbb2ae" + integrity sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +avsc@^5.7.5: + version "5.7.9" + resolved "https://registry.yarnpkg.com/avsc/-/avsc-5.7.9.tgz#8532cd47b2fbff95be4bc470c6780c258d86680a" + integrity sha512-yOA4wFeI7ET3v32Di/sUybQ+ttP20JHSW3mxLuNGeO0uD6PPcvLrIQXSvy/rhJOWU5JrYh7U4OHplWMmtAtjMg== + +axios@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.10.0.tgz#af320aee8632eaf2a400b6a1979fa75856f38d54" + integrity sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +b4a@^1.6.4: + version "1.7.3" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.7.3.tgz#24cf7ccda28f5465b66aec2bac69e32809bf112f" + integrity sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q== + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bare-events@^2.5.4, bare-events@^2.7.0: + version "2.8.2" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.8.2.tgz#7b3e10bd8e1fc80daf38bb516921678f566ab89f" + integrity sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ== + +bare-fs@^4.0.1: + version "4.5.2" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.5.2.tgz#d80ff8a9177e0db4818e7ba44b9302c0cf0788af" + integrity sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw== + dependencies: + bare-events "^2.5.4" + bare-path "^3.0.0" + bare-stream "^2.6.4" + bare-url "^2.2.2" + fast-fifo "^1.3.2" + +bare-os@^3.0.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.6.2.tgz#b3c4f5ad5e322c0fd0f3c29fc97d19009e2796e5" + integrity sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A== + +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== + dependencies: + bare-os "^3.0.1" + +bare-stream@^2.6.4: + version "2.7.0" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.7.0.tgz#5b9e7dd0a354d06e82d6460c426728536c35d789" + integrity sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A== + dependencies: + streamx "^2.21.0" + +bare-url@^2.2.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/bare-url/-/bare-url-2.3.2.tgz#4aef382efa662b2180a6fe4ca07a71b39bdf7ca3" + integrity sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw== + dependencies: + bare-path "^3.0.0" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +basic-ftp@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.1.0.tgz#00eb8128ce536aa697c45716c739bf38e8d890f5" + integrity sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw== + +better-opn@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-3.0.2.tgz#f96f35deaaf8f34144a4102651babcf00d1d8817" + integrity sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ== + dependencies: + open "^8.0.4" + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer@^5.2.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== + dependencies: + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001579: + version "1.0.30001765" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz#4a78d8a797fd4124ebaab2043df942eb091648ee" + integrity sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== + +chalk@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +chalk@^5.6.0: + version "5.6.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + +chardet@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-2.1.1.tgz#5c75593704a642f71ee53717df234031e65373c8" + integrity sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ== + +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chromium-bidi@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.6.2.tgz#91f9daa20984833b52221084480fbe0465b29c67" + integrity sha512-4WVBa6ijmUTVr9cZD4eicQD8Mdy/HCX3bzEIYYpmk0glqYLoWH+LqQEvV9RpDRzoQSbY1KJHloYXbDMXMbDPhg== + dependencies: + mitt "3.0.1" + urlpattern-polyfill "10.0.0" + zod "3.23.8" + +clean-stack@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" + integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== + dependencies: + escape-string-regexp "5.0.0" + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + +cli-spinners@^2.7.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +code-excerpt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-4.0.0.tgz#2de7d46e98514385cb01f7b3b741320115f4c95e" + integrity sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA== + dependencies: + convert-to-spaces "^2.0.1" + +collapse-white-space@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" + integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== + +color-blend@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/color-blend/-/color-blend-4.0.0.tgz#e9950e9fa5d6e552ff8bb107c39f7e83a0c1a3bb" + integrity sha512-fYODTHhI/NG+B5GnzvuL3kiFrK/UnkUezWFTgEPBTY5V+kpyfAn95Vn9sJeeCX6omrCOdxnqCL3CvH+6sXtIbw== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@4.2.3, color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-to-spaces@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b" + integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +data-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== + +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.0, debug@^4.1.1, debug@^4.3.4, debug@^4.3.5, debug@~4.4.1: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +debug@~4.3.1, debug@~4.3.2: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +decode-bmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/decode-bmp/-/decode-bmp-0.2.1.tgz#cec3e0197ec3b6c60f02220f50e8757030ff2427" + integrity sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA== + dependencies: + "@canvas/image-data" "^1.0.0" + to-data-view "^1.1.0" + +decode-ico@*: + version "0.4.1" + resolved "https://registry.yarnpkg.com/decode-ico/-/decode-ico-0.4.1.tgz#e0f7373081532c7b8495bd51fb225d354e14de25" + integrity sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA== + dependencies: + "@canvas/image-data" "^1.0.0" + decode-bmp "^0.2.0" + to-data-view "^1.1.0" + +decode-named-character-reference@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz#3e40603760874c2e5867691b599d73a7da25b53f" + integrity sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q== + dependencies: + character-entities "^2.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dependency-graph@0.11.0, dependency-graph@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== + +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^2.0.3, detect-libc@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + +detect-port@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + +devtools-protocol@0.0.1312386: + version "0.0.1312386" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz#5ab824d6f1669ec6c6eb0fba047e73601d969052" + integrity sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dns-packet@^5.2.4: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dns-socket@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/dns-socket/-/dns-socket-4.2.2.tgz#58b0186ec053ea0731feb06783c7eeac4b95b616" + integrity sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg== + dependencies: + dns-packet "^5.2.4" + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +emoji-regex@^10.3.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0: + version "1.4.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== + dependencies: + once "^1.4.0" + +engine.io-parser@~5.2.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== + +engine.io@~6.5.2: + version "6.5.5" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.5.tgz#430b80d8840caab91a50e9e23cb551455195fc93" + integrity sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.17.1" + +entities@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" + integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== + +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + +error-ex@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" + integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0: + version "1.24.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.1.tgz#f0c131ed5ea1bb2411134a8dd94def09c46c7899" + integrity sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" + +es-aggregate-error@^1.0.7: + version "1.0.14" + resolved "https://registry.yarnpkg.com/es-aggregate-error/-/es-aggregate-error-1.0.14.tgz#f1a24f833d25056c2ebc92a8c04449374f8f9f65" + integrity sha512-3YxX6rVb07B5TV11AV5wsL7nQCHXNwoHPsQC8S4AmBiqYhyNCJ5BRKXkXyDJvs8QzXN20NgRtxe3dEEQD9NLHA== + dependencies: + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.24.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + globalthis "^1.0.4" + has-property-descriptors "^1.0.2" + set-function-name "^2.0.2" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + +es-toolkit@^1.39.10: + version "1.44.0" + resolved "https://registry.yarnpkg.com/es-toolkit/-/es-toolkit-1.44.0.tgz#b363b436b6115c3cc9cc21954c1e08ecdaa51c8c" + integrity sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg== + +esast-util-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz#8d1cfb51ad534d2f159dc250e604f3478a79f1ad" + integrity sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + unist-util-position-from-estree "^2.0.0" + +esast-util-from-js@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz#5147bec34cc9da44accf52f87f239a40ac3e8225" + integrity sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw== + dependencies: + "@types/estree-jsx" "^1.0.0" + acorn "^8.0.0" + esast-util-from-estree "^2.0.0" + vfile-message "^4.0.0" + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-util-attach-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" + integrity sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz#b6d0bced1dcc4f06f25cf0ceda2b2dcaf98168f1" + integrity sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-walker "^3.0.0" + +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + +estree-util-scope@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/estree-util-scope/-/estree-util-scope-1.0.0.tgz#9cbdfc77f5cb51e3d9ed4ad9c4adbff22d43e585" + integrity sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + +estree-util-to-js@2.0.0, estree-util-to-js@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz#10a6fb924814e6abb62becf0d2bc4dea51d04f17" + integrity sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-visit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz#13a9a9f40ff50ed0c022f831ddf4b58d05446feb" + integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^3.0.0" + +estree-walker@3.0.3, estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events-universal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/events-universal/-/events-universal-1.0.1.tgz#b56a84fd611b6610e0a2d0f09f80fdf931e2dfe6" + integrity sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw== + dependencies: + bare-events "^2.7.0" + +express@4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-fifo@^1.2.0, fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + +fast-glob@^3.3.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-memoize@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" + integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== + +fast-uri@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" + integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== + +fastq@^1.6.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" + integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== + dependencies: + reusify "^1.0.4" + +fault@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" + integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== + dependencies: + format "^0.2.0" + +favicons@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/favicons/-/favicons-7.2.0.tgz#1f1662f1f69e5637c19275209003b7b822c24250" + integrity sha512-k/2rVBRIRzOeom3wI9jBPaSEvoTSQEW4iM0EveBmBBKFxO8mSyyRWtDlfC3VnEfu0avmjrMzy8/ZFPSe6F71Hw== + dependencies: + escape-html "^1.0.3" + sharp "^0.33.1" + xml2js "^0.6.1" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +follow-redirects@^1.15.6: + version "1.15.11" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== + +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + +form-data@^4.0.0: + version "4.0.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.12" + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +front-matter@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-4.0.2.tgz#b14e54dc745cfd7293484f3210d15ea4edd7f4d5" + integrity sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== + dependencies: + js-yaml "^3.13.1" + +fs-extra@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gcd@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/gcd/-/gcd-0.0.1.tgz#41e0bb60bcc9245635419860a22544b230ba2f75" + integrity sha512-VNx3UEGr+ILJTiMs1+xc5SX1cMgJCrXezKPa003APUWNqQqaF6n25W8VcR7nHN6yRWbvvUTwCpZCFJeWC2kXlw== + +generator-function@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" + integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz#9bc4caa131702b4b61729cb7e42735bc550c9ee6" + integrity sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +get-uri@^6.0.1: + version "6.0.5" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.5.tgz#714892aa4a871db671abc5395e5e9447bc306a16" + integrity sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.2" + debug "^4.3.4" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +got@13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/got/-/got-13.0.0.tgz#a2402862cef27a5d0d1b07c0fb25d12b58175422" + integrity sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + +got@^12.0.0, got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hast-util-embedded@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz#be4477780fbbe079cdba22982e357a0de4ba853e" + integrity sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-is-element "^3.0.0" + +hast-util-from-dom@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz#c3c92fbd8d4e1c1625edeb3a773952b9e4ad64a8" + integrity sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q== + dependencies: + "@types/hast" "^3.0.0" + hastscript "^9.0.0" + web-namespaces "^2.0.0" + +hast-util-from-html-isomorphic@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz#b31baee386a899a2472326a3c5692f29f86d1d3c" + integrity sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw== + dependencies: + "@types/hast" "^3.0.0" + hast-util-from-dom "^5.0.0" + hast-util-from-html "^2.0.0" + unist-util-remove-position "^5.0.0" + +hast-util-from-html@2.0.3, hast-util-from-html@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz#485c74785358beb80c4ba6346299311ac4c49c82" + integrity sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw== + dependencies: + "@types/hast" "^3.0.0" + devlop "^1.1.0" + hast-util-from-parse5 "^8.0.0" + parse5 "^7.0.0" + vfile "^6.0.0" + vfile-message "^4.0.0" + +hast-util-from-parse5@^8.0.0: + version "8.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz#830a35022fff28c3fea3697a98c2f4cc6b835a2e" + integrity sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^9.0.0" + property-information "^7.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" + +hast-util-has-property@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz#4e595e3cddb8ce530ea92f6fc4111a818d8e7f93" + integrity sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-is-body-ok-link@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz#ef63cb2f14f04ecf775139cd92bda5026380d8b4" + integrity sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-is-element@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz#6e31a6532c217e5b533848c7e52c9d9369ca0932" + integrity sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-minify-whitespace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz#7588fd1a53f48f1d30406b81959dffc3650daf55" + integrity sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-is-element "^3.0.0" + hast-util-whitespace "^3.0.0" + unist-util-is "^6.0.0" + +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz#fa284c0cd4a82a0dd6020de8300a7b1ebffa1690" + integrity sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-has-property "^3.0.0" + hast-util-is-body-ok-link "^3.0.0" + hast-util-is-element "^3.0.0" + +hast-util-to-estree@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz#e654c1c9374645135695cc0ab9f70b8fcaf733d7" + integrity sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-attach-comments "^3.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + style-to-js "^1.0.0" + unist-util-position "^5.0.0" + zwitch "^2.0.0" + +hast-util-to-html@9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz#d689c118c875aab1def692c58603e34335a0f5c5" + integrity sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-whitespace "^3.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + +hast-util-to-html@^9.0.0, hast-util-to-html@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz#ccc673a55bb8e85775b08ac28380f72d47167005" + integrity sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-whitespace "^3.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.6" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz#ff31897aae59f62232e21594eac7ef6b63333e98" + integrity sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + style-to-js "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-to-mdast@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/hast-util-to-mdast/-/hast-util-to-mdast-10.1.0.tgz#906c80fc263a9f09a33462317ffc6ad94f4ee3db" + integrity sha512-DsL/SvCK9V7+vfc6SLQ+vKIyBDXTk2KLSbfBYkH4zeF/uR1yBajHRhkzuaUSGOB1WJSTieJBdHwxlC+HLKvZZw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-phrasing "^3.0.0" + hast-util-to-html "^9.0.0" + hast-util-to-text "^4.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-hast "^13.0.0" + mdast-util-to-string "^4.0.0" + rehype-minify-whitespace "^6.0.0" + trim-trailing-lines "^2.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + +hast-util-to-string@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz#a4f15e682849326dd211c97129c94b0c3e76527c" + integrity sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-to-text@4.0.2, hast-util-to-text@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz#57b676931e71bf9cb852453678495b3080bfae3e" + integrity sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + hast-util-is-element "^3.0.0" + unist-util-find-after "^5.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-9.0.1.tgz#dbc84bef6051d40084342c229c451cd9dc567dff" + integrity sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + +hex-rgb@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/hex-rgb/-/hex-rgb-5.0.0.tgz#e2c9eb6a37498d66c5a350a221ed4c2c7d1a92d6" + integrity sha512-NQO+lgVUCtHxZ792FodgW0zflK+ozS9X9dwGp9XvvmPlH7pyxd588cn24TD3rmPm/N0AIRXF10Otah8yKqGw4w== + +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + +http-cache-semantics@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5" + integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + +https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + +ico-endec@*: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ico-endec/-/ico-endec-0.1.6.tgz#9b320cc3ed0a0c779f54e998a8db49002abd7c6e" + integrity sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" + integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + +immer@^9.0.6: + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + +import-fresh@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ink-spinner@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ink-spinner/-/ink-spinner-5.0.0.tgz#32ec318ef8ebb0ace8f595451f8e93280623429f" + integrity sha512-EYEasbEjkqLGyPOUc8hBJZNuC5GvXGMLu0w5gdTNskPc7Izc5vO3tdQEYnzvshucyGCBXc86ig0ujXPMWaQCdA== + dependencies: + cli-spinners "^2.7.0" + +ink@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/ink/-/ink-6.3.0.tgz#9be9c3f550bd4e356249653504f6d974a0cddd13" + integrity sha512-2CbJAa7XeziZYe6pDS5RVLirRY28iSGMQuEV8jRU5NQsONQNfcR/BZHHc9vkMg2lGYTHTM2pskxC1YmY28p6bQ== + dependencies: + "@alcalzone/ansi-tokenize" "^0.2.0" + ansi-escapes "^7.0.0" + ansi-styles "^6.2.1" + auto-bind "^5.0.1" + chalk "^5.6.0" + cli-boxes "^3.0.0" + cli-cursor "^4.0.0" + cli-truncate "^4.0.0" + code-excerpt "^4.0.0" + es-toolkit "^1.39.10" + indent-string "^5.0.0" + is-in-ci "^2.0.0" + patch-console "^2.0.0" + react-reconciler "^0.32.0" + signal-exit "^3.0.7" + slice-ansi "^7.1.0" + stack-utils "^2.0.6" + string-width "^7.2.0" + type-fest "^4.27.0" + widest-line "^5.0.0" + wrap-ansi "^9.0.0" + ws "^8.18.0" + yoga-layout "~3.2.1" + +inline-style-parser@0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.7.tgz#b1fc68bfc0313b8685745e4464e37f9376b9c909" + integrity sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA== + +inquirer@12.3.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-12.3.0.tgz#c5142f49362f1347aa49a18e652db460f14092e6" + integrity sha512-3NixUXq+hM8ezj2wc7wC37b32/rHq1MwNZDYdvx+d6jokOD+r+i8Q4Pkylh9tISYP114A128LCX8RKhopC5RfQ== + dependencies: + "@inquirer/core" "^10.1.2" + "@inquirer/prompts" "^7.2.1" + "@inquirer/type" "^3.0.2" + ansi-escapes "^4.3.2" + mute-stream "^2.0.0" + run-async "^3.0.0" + rxjs "^7.8.1" + +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + +ip-address@^10.0.1: + version "10.1.0" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.1.0.tgz#d8dcffb34d0e02eb241427444a6e23f5b0595aa4" + integrity sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q== + +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.4" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.4.tgz#1ee5553818511915685d33bb13d31bf854e5059d" + integrity sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA== + +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== + dependencies: + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.16.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz#046b2a6d4f6b156b2233d3207d4b5a9783999b98" + integrity sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ== + dependencies: + get-east-asian-width "^1.3.1" + +is-generator-function@^1.0.10: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" + integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== + dependencies: + call-bound "^1.0.4" + generator-function "^2.0.0" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + +is-in-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-in-ci/-/is-in-ci-2.0.0.tgz#e4b3471c555b47509a8311869c377c234967079f" + integrity sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w== + +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-online@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/is-online/-/is-online-10.0.0.tgz#5e02cee9f822fd9c19b060f0ecbdc798d37295a3" + integrity sha512-WCPdKwNDjXJJmUubf2VHLMDBkUZEtuOvpXUfUnUFbEnM6In9ByiScL4f4jKACz/fsb2qDkesFerW3snf/AYz3A== + dependencies: + got "^12.1.0" + p-any "^4.0.0" + p-timeout "^5.1.0" + public-ip "^5.0.0" + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + +is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +jiti@^1.21.0: + version "1.21.7" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.7.tgz#9dd81043424a3d28458b193d965f0d18a2300ba9" + integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +js-yaml@^3.13.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" + integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== + dependencies: + argparse "^2.0.1" + +jsep@^1.2.0, jsep@^1.3.6, jsep@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsep/-/jsep-1.4.0.tgz#19feccbfa51d8a79f72480b4b8e40ce2e17152f0" + integrity sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +jsonc-parser@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.2.1.tgz#db73cd59d78cce28723199466b2a03d1be1df2bc" + integrity sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w== + +jsonfile@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" + integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpath-plus@^10.0.0, jsonpath-plus@^10.3.0, "jsonpath-plus@^6.0.1 || ^10.1.0": + version "10.3.0" + resolved "https://registry.yarnpkg.com/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz#59e22e4fa2298c68dfcd70659bb47f0cad525238" + integrity sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA== + dependencies: + "@jsep-plugin/assignment" "^1.3.0" + "@jsep-plugin/regex" "^1.0.4" + jsep "^1.4.0" + +jsonpointer@^5.0.0, jsonpointer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +katex@^0.16.0: + version "0.16.27" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.27.tgz#4ecf6f620e0ca1c1a5de722e85fcdcec49086a48" + integrity sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw== + dependencies: + commander "^8.3.0" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +lcm@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/lcm/-/lcm-0.0.3.tgz#4a3b11ce0363e297010806080ffeca02f77f8280" + integrity sha512-TB+ZjoillV6B26Vspf9l2L/vKaRY/4ep3hahcyVkCGFgsTNRUQdc24bQeNFiZeoxH0vr5+7SfNRMQuPHv/1IrQ== + dependencies: + gcd "^0.0.1" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +leven@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-4.1.0.tgz#1e37150e1711d18bb14e380a5c779995235a710e" + integrity sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew== + +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lilconfig@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lodash.topath@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" + integrity sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg== + +lodash@4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lodash@^4.17.21, lodash@~4.17.21: + version "4.17.23" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" + integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +markdown-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" + integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== + +markdown-table@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" + integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +mdast-util-find-and-replace@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz#70a3174c894e14df722abf43bc250cbae44b11df" + integrity sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg== + dependencies: + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-from-markdown@2.0.2, mdast-util-from-markdown@^2.0.0, mdast-util-from-markdown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz#4850390ca7cf17413a9b9a0fbefcd1bc0eb4160a" + integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-frontmatter@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz#f5f929eb1eb36c8a7737475c7eb438261f964ee8" + integrity sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + escape-string-regexp "^5.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz#abd557630337bd30a6d5a4bd8252e1c2dc0875d5" + integrity sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" + +mdast-util-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz#7778e9d9ca3df7238cc2bd3fa2b1bf6a65b19403" + integrity sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@^3.0.0, mdast-util-gfm@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz#2cdf63b92c2a331406b0fb0db4c077c1b0331751" + integrity sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-math@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-math/-/mdast-util-math-3.0.0.tgz#8d79dd3baf8ab8ac781f62b8853768190b9a00b0" + integrity sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + longest-streak "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.1.0" + unist-util-remove-position "^5.0.0" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz#43f0abac9adc756e2086f63822a38c8d3c3a5096" + integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-jsx@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz#76b957b3da18ebcfd0de3a9b4451dcd6fdec2320" + integrity sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdx-jsx@3.2.0, mdast-util-mdx-jsx@^3.0.0, mdast-util-mdx-jsx@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz#fd04c67a2a7499efb905a8a5c578dddc9fdada0d" + integrity sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdx@3.0.0, mdast-util-mdx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz#792f9cf0361b46bee1fdf1ef36beac424a099c41" + integrity sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdxjs-esm@^2.0.0, mdast-util-mdxjs-esm@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" + integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0, mdast-util-to-hast@^13.2.0: + version "13.2.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz#d7ff84ca499a57e2c060ae67548ad950e689a053" + integrity sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +mdast-util-to-markdown@^2.0.0, mdast-util-to-markdown@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz#f910ffe60897f04bb4b7e7ee434486f76288361b" + integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromark-core-commonmark@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz#c691630e485021a68cf28dbc2b2ca27ebf678cd4" + integrity sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-frontmatter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz#651c52ffa5d7a8eeed687c513cd869885882d67a" + integrity sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg== + dependencies: + fault "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz#6286aee9686c4462c1e3552a9d505feddceeb935" + integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz#4dab56d4e398b9853f6fe4efac4fc9361f3e0750" + integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz#86106df8b3a692b5f6a92280d3879be6be46d923" + integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz#fac70bcbf51fe65f5f44033118d39be8a9b5940b" + integrity sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz#bcc34d805639829990ec175c3eea12bb5b781f2c" + integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm@3.0.0, micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-math@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz#c42ee3b1dd5a9a03584e83dd8f08e3de510212c1" + integrity sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg== + dependencies: + "@types/katex" "^0.16.0" + devlop "^1.0.0" + katex "^0.16.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-expression@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz#43d058d999532fb3041195a3c3c05c46fa84543b" + integrity sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-jsx@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz#5abb83da5ddc8e473a374453e6ea56fbd66b59ad" + integrity sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdx-jsx@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz#ffc98bdb649798902fa9fc5689f67f9c1c902044" + integrity sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdx-md@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz#1d252881ea35d74698423ab44917e1f5b197b92d" + integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-mdxjs-esm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz#de21b2b045fd2059bd00d36746081de38390d54a" + integrity sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdxjs@3.0.0, micromark-extension-mdxjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz#b5a2e0ed449288f3f6f6c544358159557549de18" + integrity sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^3.0.0" + micromark-extension-mdx-jsx "^3.0.0" + micromark-extension-mdx-md "^2.0.0" + micromark-extension-mdxjs-esm "^3.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-mdx-expression@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz#bb09988610589c07d1c1e4425285895041b3dfa9" + integrity sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz#6cb99582e5d271e84efca8e61a807994d7161eb2" + integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== + +micromark-util-events-to-acorn@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz#e7a8a6b55a47e5a06c720d5a1c4abae8c37c98f3" + integrity sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg== + dependencies: + "@types/estree" "^1.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-util-html-tag-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz#d8ade5ba0f3197a1cf6a2999fbbfe6357a1a19ee" + integrity sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== + +micromark-util-types@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e" + integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== + +micromark@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.2.tgz#91395a3e1884a198e62116e33c9c568e39936fdb" + integrity sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromatch@^4.0.5, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + +minimatch@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mint@^4.2.7: + version "4.2.286" + resolved "https://registry.yarnpkg.com/mint/-/mint-4.2.286.tgz#0f4d1d945a2c4198af25997ba7b62ef62078aa90" + integrity sha512-L4Kpz6Bbxtw5WzXuyJMKENdt9WDjB5+rz9cjoKvIqENFnGIy1+SonYsCDi1usbHD5H9YOdsoravBdFRx5+PPdg== + dependencies: + "@mintlify/cli" "4.0.890" + +mitt@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" + integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.11, nanoid@^3.3.6: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neotraverse@0.6.18: + version "0.6.18" + resolved "https://registry.yarnpkg.com/neotraverse/-/neotraverse-0.6.18.tgz#abcb33dda2e8e713cf6321b29405e822230cdb30" + integrity sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA== + +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + +next-mdx-remote-client@^1.0.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/next-mdx-remote-client/-/next-mdx-remote-client-1.1.4.tgz#215bf0d88cf6e91832daecf27fc845ff4a7a1ce2" + integrity sha512-psCMdO50tfoT1kAH7OGXZvhyRfiHVK6IqwjmWFV5gtLo4dnqjAgcjcLNeJ92iI26UNlKShxYrBs1GQ6UXxk97A== + dependencies: + "@babel/code-frame" "^7.27.1" + "@mdx-js/mdx" "^3.1.1" + "@mdx-js/react" "^3.1.1" + remark-mdx-remove-esm "^1.2.1" + serialize-error "^12.0.0" + vfile "^6.0.3" + vfile-matter "^5.0.1" + +next@15.3.4: + version "15.3.4" + resolved "https://registry.yarnpkg.com/next/-/next-15.3.4.tgz#7a4863be14c998f1ec1e6d8d4e9e1a1291c8cbe3" + integrity sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA== + dependencies: + "@next/env" "15.3.4" + "@swc/counter" "0.1.3" + "@swc/helpers" "0.5.15" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + postcss "8.4.31" + styled-jsx "5.1.6" + optionalDependencies: + "@next/swc-darwin-arm64" "15.3.4" + "@next/swc-darwin-x64" "15.3.4" + "@next/swc-linux-arm64-gnu" "15.3.4" + "@next/swc-linux-arm64-musl" "15.3.4" + "@next/swc-linux-x64-gnu" "15.3.4" + "@next/swc-linux-x64-musl" "15.3.4" + "@next/swc-win32-arm64-msvc" "15.3.4" + "@next/swc-win32-x64-msvc" "15.3.4" + sharp "^0.34.1" + +nimma@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/nimma/-/nimma-0.2.3.tgz#33cd6244ede857d9c8ac45b9d1aad07091559e45" + integrity sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA== + dependencies: + "@jsep-plugin/regex" "^1.0.1" + "@jsep-plugin/ternary" "^1.0.2" + astring "^1.8.1" + jsep "^1.2.0" + optionalDependencies: + jsonpath-plus "^6.0.1 || ^10.1.0" + lodash.topath "^4.5.2" + +nlcst-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz#05511e8461ebfb415952eb0b7e9a1a7d40471bd4" + integrity sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA== + dependencies: + "@types/nlcst" "^2.0.0" + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^2.6.0, node-fetch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.1.1.tgz#751a20c8520e5725404c06015fea21d7567f25ef" + integrity sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ== + +object-assign@^4, object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@3.0.0, object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +oniguruma-parser@^0.12.1: + version "0.12.1" + resolved "https://registry.yarnpkg.com/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz#82ba2208d7a2b69ee344b7efe0ae930c627dcc4a" + integrity sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w== + +oniguruma-to-es@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz#0b909d960faeb84511c979b1f2af64e9bc37ce34" + integrity sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA== + dependencies: + oniguruma-parser "^0.12.1" + regex "^6.0.1" + regex-recursion "^6.0.2" + +open@^8.0.4: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +openapi-types@12.1.3: + version "12.1.3" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +p-any@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-any/-/p-any-4.0.0.tgz#0e9c8b0fa3e58cc79e6a1c6c715aa9326b6a4447" + integrity sha512-S/B50s+pAVe0wmEZHmBs/9yJXeZ5KhHzOsgKzt0hRdgkoR3DxW9ts46fcsWi/r3VnzsnkKS7q4uimze+zjdryw== + dependencies: + p-cancelable "^3.0.0" + p-some "^6.0.0" + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + +p-some@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-some/-/p-some-6.0.0.tgz#4613a822038abe125e42152ea9f7705a7967526f" + integrity sha512-CJbQCKdfSX3fIh8/QKgS+9rjm7OBNUTmwWswAFQAhc8j1NR1dsEDETUEuVUtQHZpV+J03LqWBEwvu0g1Yn+TYg== + dependencies: + aggregate-error "^4.0.0" + p-cancelable "^3.0.0" + +p-timeout@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" + integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== + +pac-proxy-agent@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df" + integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.1.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.6" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.5" + +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== + dependencies: + degenerator "^5.0.0" + netmask "^2.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== + dependencies: + "@types/unist" "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-latin@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse-latin/-/parse-latin-7.0.0.tgz#8dfacac26fa603f76417f36233fc45602a323e1d" + integrity sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ== + dependencies: + "@types/nlcst" "^2.0.0" + "@types/unist" "^3.0.0" + nlcst-to-string "^4.0.0" + unist-util-modify-children "^4.0.0" + unist-util-visit-children "^3.0.0" + vfile "^6.0.0" + +parse5@^7.0.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" + integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== + dependencies: + entities "^6.0.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +patch-console@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/patch-console/-/patch-console-2.0.0.tgz#9023f4665840e66f40e9ce774f904a63167433bb" + integrity sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" + integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== + +pony-cause@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-1.1.1.tgz#f795524f83bebbf1878bd3587b45f69143cbf3f9" + integrity sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g== + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.1.0.tgz#003b63c6edde948766e40f3daf7e997ae43a5ce6" + integrity sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-nested@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== + dependencies: + postcss-selector-parser "^6.1.1" + +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@8.5.6, postcss@^8.4.23: + version "8.5.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +property-information@^6.0.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== + +property-information@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.1.0.tgz#b622e8646e02b580205415586b40804d3e8bfd5d" + integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-agent@^6.4.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + http-proxy-agent "^7.0.1" + https-proxy-agent "^7.0.6" + lru-cache "^7.14.1" + pac-proxy-agent "^7.1.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.5" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +public-ip@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/public-ip/-/public-ip-5.0.0.tgz#b392fcc88552c3b36933a286068948816515f92a" + integrity sha512-xaH3pZMni/R2BG7ZXXaWS9Wc9wFlhyDVJF47IJ+3ali0TGv+2PsckKxbmo+rnx3ZxiV2wblVhtdS3bohAP6GGw== + dependencies: + dns-socket "^4.2.2" + got "^12.0.0" + is-ip "^3.1.0" + +pump@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.3.tgz#151d979f1a29668dc0025ec589a455b53282268d" + integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +puppeteer-core@22.14.0: + version "22.14.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-22.14.0.tgz#5bb466adba725c966b0a86f0337a476d4c68ebec" + integrity sha512-rl4tOY5LcA3e374GAlsGGHc05HL3eGNf5rZ+uxkl6id9zVZKcwcp1Z+Nd6byb6WPiPeecT/dwz8f/iUm+AZQSw== + dependencies: + "@puppeteer/browsers" "2.3.0" + chromium-bidi "0.6.2" + debug "^4.3.5" + devtools-protocol "0.0.1312386" + ws "^8.18.0" + +puppeteer@22.14.0: + version "22.14.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-22.14.0.tgz#11697c929f5d9d7eac5a3438a0ff12dc65aedcbe" + integrity sha512-MGTR6/pM8zmWbTdazb6FKnwIihzsSEXBPH49mFFU96DNZpQOevCAZMnjBZGlZRGRzRK6aADCavR6SQtrbv5dQw== + dependencies: + "@puppeteer/browsers" "2.3.0" + cosmiconfig "^9.0.0" + devtools-protocol "0.0.1312386" + puppeteer-core "22.14.0" + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-reconciler@^0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.32.0.tgz#a08bcd8c454a4cd839164d6e05926e30a7a7fac2" + integrity sha512-2NPMOzgTlG0ZWdIf3qG+dcbLSoAc/uLfOwckc3ofy5sSK0pLJqnQLpUFxvGcN2rlXSjnVtGeeFLNimCQEj5gOQ== + dependencies: + scheduler "^0.26.0" + +react@19.2.3: + version "19.2.3" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.3.tgz#d83e5e8e7a258cf6b4fe28640515f99b87cd19b8" + integrity sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA== + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recma-build-jsx@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz#c02f29e047e103d2fab2054954e1761b8ea253c4" + integrity sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew== + dependencies: + "@types/estree" "^1.0.0" + estree-util-build-jsx "^3.0.0" + vfile "^6.0.0" + +recma-jsx@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/recma-jsx/-/recma-jsx-1.0.1.tgz#58e718f45e2102ed0bf2fa994f05b70d76801a1a" + integrity sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w== + dependencies: + acorn-jsx "^5.0.0" + estree-util-to-js "^2.0.0" + recma-parse "^1.0.0" + recma-stringify "^1.0.0" + unified "^11.0.0" + +recma-parse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-parse/-/recma-parse-1.0.0.tgz#c351e161bb0ab47d86b92a98a9d891f9b6814b52" + integrity sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ== + dependencies: + "@types/estree" "^1.0.0" + esast-util-from-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +recma-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-stringify/-/recma-stringify-1.0.0.tgz#54632030631e0c7546136ff9ef8fde8e7b44f130" + integrity sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g== + dependencies: + "@types/estree" "^1.0.0" + estree-util-to-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regex-recursion@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-6.0.2.tgz#a0b1977a74c87f073377b938dbedfab2ea582b33" + integrity sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg== + dependencies: + regex-utilities "^2.3.0" + +regex-utilities@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/regex-utilities/-/regex-utilities-2.3.0.tgz#87163512a15dce2908cf079c8960d5158ff43280" + integrity sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== + +regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/regex/-/regex-6.1.0.tgz#d7ce98f8ee32da7497c13f6601fca2bc4a6a7803" + integrity sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg== + dependencies: + regex-utilities "^2.3.0" + +regexp.prototype.flags@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" + +rehype-katex@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-7.0.1.tgz#832e6d7af2744a228981d1b0fe89483a9e7c93a1" + integrity sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA== + dependencies: + "@types/hast" "^3.0.0" + "@types/katex" "^0.16.0" + hast-util-from-html-isomorphic "^2.0.0" + hast-util-to-text "^4.0.0" + katex "^0.16.0" + unist-util-visit-parents "^6.0.0" + vfile "^6.0.0" + +rehype-minify-whitespace@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.2.tgz#7dd234ce0775656ce6b6b0aad0a6093de29b2278" + integrity sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw== + dependencies: + "@types/hast" "^3.0.0" + hast-util-minify-whitespace "^1.0.0" + +rehype-parse@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-9.0.1.tgz#9993bda129acc64c417a9d3654a7be38b2a94c20" + integrity sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag== + dependencies: + "@types/hast" "^3.0.0" + hast-util-from-html "^2.0.0" + unified "^11.0.0" + +rehype-recma@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rehype-recma/-/rehype-recma-1.0.0.tgz#d68ef6344d05916bd96e25400c6261775411aa76" + integrity sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + hast-util-to-estree "^3.0.0" + +rehype-stringify@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-10.0.1.tgz#2ec1ebc56c6aba07905d3b4470bdf0f684f30b75" + integrity sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-to-html "^9.0.0" + unified "^11.0.0" + +remark-frontmatter@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz#b68d61552a421ec412c76f4f66c344627dc187a2" + integrity sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-frontmatter "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + unified "^11.0.0" + +remark-gfm@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-gfm@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.1.tgz#33227b2a74397670d357bf05c098eaf8513f0d6b" + integrity sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-math@6.0.0, remark-math@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-6.0.0.tgz#0acdf74675f1c195fea6efffa78582f7ed7fc0d7" + integrity sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-math "^3.0.0" + micromark-extension-math "^3.0.0" + unified "^11.0.0" + +remark-mdx-remove-esm@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/remark-mdx-remove-esm/-/remark-mdx-remove-esm-1.2.2.tgz#6901b691892c89d50abe35ad2fdec6c26af48091" + integrity sha512-YSaUwqiuJuD6S9XTAD6zmO4JJJZJgsRAdsl2drZO8/ssAVv0HXAg4vkSgHZAP46ORh8ERPFQrC7JWlbkwBwu1A== + dependencies: + "@types/mdast" "^4.0.4" + mdast-util-mdxjs-esm "^2.0.1" + unist-util-remove "^4.0.0" + +remark-mdx@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.0.1.tgz#8f73dd635c1874e44426e243f72c0977cf60e212" + integrity sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-mdx@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.1.0.tgz#f979be729ecb35318fa48e2135c1169607a78343" + integrity sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-mdx@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.1.1.tgz#047f97038bc7ec387aebb4b0a4fe23779999d845" + integrity sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-parse@11.0.0, remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.1.tgz#f864dd2947889a11997c0a2667cd6b38f685bca7" + integrity sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-rehype@^11.0.0: + version "11.1.2" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.2.tgz#2addaadda80ca9bd9aa0da763e74d16327683b37" + integrity sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-smartypants@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/remark-smartypants/-/remark-smartypants-3.0.2.tgz#cbaf2b39624c78fcbd6efa224678c1d2e9bc1dfb" + integrity sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA== + dependencies: + retext "^9.0.0" + retext-smartypants "^6.0.0" + unified "^11.0.4" + unist-util-visit "^5.0.0" + +remark-stringify@11.0.0, remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" + +remark@15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/remark/-/remark-15.0.1.tgz#ac7e7563260513b66426bc47f850e7aa5862c37c" + integrity sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A== + dependencies: + "@types/mdast" "^4.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.7, resolve@^1.22.2: + version "1.22.11" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" + integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== + dependencies: + is-core-module "^2.16.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retext-latin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/retext-latin/-/retext-latin-4.0.0.tgz#d02498aa1fd39f1bf00e2ff59b1384c05d0c7ce3" + integrity sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA== + dependencies: + "@types/nlcst" "^2.0.0" + parse-latin "^7.0.0" + unified "^11.0.0" + +retext-smartypants@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/retext-smartypants/-/retext-smartypants-6.2.0.tgz#4e852c2974cf2cfa253eeec427c97efc43b5d158" + integrity sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ== + dependencies: + "@types/nlcst" "^2.0.0" + nlcst-to-string "^4.0.0" + unist-util-visit "^5.0.0" + +retext-stringify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/retext-stringify/-/retext-stringify-4.0.0.tgz#501d5440bd4d121e351c7c509f8507de9611e159" + integrity sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA== + dependencies: + "@types/nlcst" "^2.0.0" + nlcst-to-string "^4.0.0" + unified "^11.0.0" + +retext@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/retext/-/retext-9.0.0.tgz#ab5cd72836894167b0ca6ae70fdcfaa166267f7a" + integrity sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA== + dependencies: + "@types/nlcst" "^2.0.0" + retext-latin "^4.0.0" + retext-stringify "^4.0.0" + unified "^11.0.0" + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +run-async@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" + integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.8.1: + version "7.8.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +safe-stable-stringify@^1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz#c8a220ab525cd94e60ebf47ddc404d610dc5d84a" + integrity sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.4.tgz#f29c2bba80ce5b86f4343b4c2be9f2b96627cf8b" + integrity sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw== + +scheduler@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" + integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== + +semver@7.7.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + +semver@^7.6.3, semver@^7.7.3: + version "7.7.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-error@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-12.0.0.tgz#aed3d5abff192c855707513929bf8bf48d712194" + integrity sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw== + dependencies: + type-fest "^4.31.0" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sharp-ico@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/sharp-ico/-/sharp-ico-0.1.5.tgz#5d263558adfb00903313db9403e20dc66ffcfa5b" + integrity sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q== + dependencies: + decode-ico "*" + ico-endec "*" + sharp "*" + +sharp@*, sharp@^0.34.1: + version "0.34.5" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.34.5.tgz#b6f148e4b8c61f1797bde11a9d1cfebbae2c57b0" + integrity sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg== + dependencies: + "@img/colour" "^1.0.0" + detect-libc "^2.1.2" + semver "^7.7.3" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.34.5" + "@img/sharp-darwin-x64" "0.34.5" + "@img/sharp-libvips-darwin-arm64" "1.2.4" + "@img/sharp-libvips-darwin-x64" "1.2.4" + "@img/sharp-libvips-linux-arm" "1.2.4" + "@img/sharp-libvips-linux-arm64" "1.2.4" + "@img/sharp-libvips-linux-ppc64" "1.2.4" + "@img/sharp-libvips-linux-riscv64" "1.2.4" + "@img/sharp-libvips-linux-s390x" "1.2.4" + "@img/sharp-libvips-linux-x64" "1.2.4" + "@img/sharp-libvips-linuxmusl-arm64" "1.2.4" + "@img/sharp-libvips-linuxmusl-x64" "1.2.4" + "@img/sharp-linux-arm" "0.34.5" + "@img/sharp-linux-arm64" "0.34.5" + "@img/sharp-linux-ppc64" "0.34.5" + "@img/sharp-linux-riscv64" "0.34.5" + "@img/sharp-linux-s390x" "0.34.5" + "@img/sharp-linux-x64" "0.34.5" + "@img/sharp-linuxmusl-arm64" "0.34.5" + "@img/sharp-linuxmusl-x64" "0.34.5" + "@img/sharp-wasm32" "0.34.5" + "@img/sharp-win32-arm64" "0.34.5" + "@img/sharp-win32-ia32" "0.34.5" + "@img/sharp-win32-x64" "0.34.5" + +sharp@0.33.5, sharp@^0.33.1: + version "0.33.5" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" + integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== + dependencies: + color "^4.2.3" + detect-libc "^2.0.3" + semver "^7.6.3" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.33.5" + "@img/sharp-darwin-x64" "0.33.5" + "@img/sharp-libvips-darwin-arm64" "1.0.4" + "@img/sharp-libvips-darwin-x64" "1.0.4" + "@img/sharp-libvips-linux-arm" "1.0.5" + "@img/sharp-libvips-linux-arm64" "1.0.4" + "@img/sharp-libvips-linux-s390x" "1.0.4" + "@img/sharp-libvips-linux-x64" "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + "@img/sharp-linux-arm" "0.33.5" + "@img/sharp-linux-arm64" "0.33.5" + "@img/sharp-linux-s390x" "0.33.5" + "@img/sharp-linux-x64" "0.33.5" + "@img/sharp-linuxmusl-arm64" "0.33.5" + "@img/sharp-linuxmusl-x64" "0.33.5" + "@img/sharp-wasm32" "0.33.5" + "@img/sharp-win32-ia32" "0.33.5" + "@img/sharp-win32-x64" "0.33.5" + +shiki@^3.11.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-3.21.0.tgz#64686fe6bfc6b2b602d209eb6c8cdbc79d0eff22" + integrity sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w== + dependencies: + "@shikijs/core" "3.21.0" + "@shikijs/engine-javascript" "3.21.0" + "@shikijs/engine-oniguruma" "3.21.0" + "@shikijs/langs" "3.21.0" + "@shikijs/themes" "3.21.0" + "@shikijs/types" "3.21.0" + "@shikijs/vscode-textmate" "^10.0.2" + "@types/hast" "^3.0.4" + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.4, side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.2, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-eval@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-eval/-/simple-eval-1.0.1.tgz#f91fc2b1583b7f5b972cdc088b769880087120a5" + integrity sha512-LH7FpTAkeD+y5xQC4fzS+tFtaNlvt3Ib1zKzvhjv/Y+cioV4zIuw4IZr2yhRLu67CWL7FR9/6KXKnjRoZTvGGQ== + dependencies: + jsep "^1.3.6" + +simple-swizzle@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.4.tgz#a8d11a45a11600d6a1ecdff6363329e3648c3667" + integrity sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw== + dependencies: + is-arrayish "^0.3.1" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz#adf7be70aa6d72162d907cd0e6d5c11f507b5403" + integrity sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socket.io-adapter@~2.5.2: + version "2.5.6" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz#c697f609d36a676a46749782274607d8df52c1d8" + integrity sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ== + dependencies: + debug "~4.4.1" + ws "~8.18.3" + +socket.io-parser@~4.2.4: + version "4.2.5" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.5.tgz#3f41b8d369129a93268f2abecba94b5292850099" + integrity sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.4.1" + +socket.io@4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.2.tgz#22557d76c3f3ca48f82e73d68b7add36a22df002" + integrity sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + +socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.7" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea" + integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A== + dependencies: + ip-address "^10.0.1" + smart-buffer "^4.2.0" + +source-map-js@^1.0.2, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map@^0.7.0: + version "0.7.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" + integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stop-iteration-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +streamx@^2.15.0, streamx@^2.21.0: + version "2.23.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.23.0.tgz#7d0f3d00d4a6c5de5728aecd6422b4008d66fd0b" + integrity sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg== + dependencies: + events-universal "^1.0.0" + fast-fifo "^1.3.2" + text-decoder "^1.1.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^7.0.0, string-width@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" + integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== + dependencies: + ansi-regex "^6.0.1" + +style-to-js@^1.0.0: + version "1.1.21" + resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.21.tgz#2908941187f857e79e28e9cd78008b9a0b3e0e8d" + integrity sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ== + dependencies: + style-to-object "1.0.14" + +style-to-object@1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.14.tgz#1d22f0e7266bb8c6d8cae5caf4ec4f005e08f611" + integrity sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw== + dependencies: + inline-style-parser "0.2.7" + +styled-jsx@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" + integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== + dependencies: + client-only "0.0.1" + +sucrase@^3.32.0: + version "3.35.1" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.1.tgz#4619ea50393fe8bd0ae5071c26abd9b2e346bfe1" + integrity sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + tinyglobby "^0.2.11" + ts-interface-checker "^0.1.9" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tailwindcss@3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.4.tgz#351d932273e6abfa75ce7d226b5bf3a6cb257c05" + integrity sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.0" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +tar-fs@^3.0.6: + version "3.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.1.1.tgz#4f164e59fb60f103d472360731e8c6bb4a7fe9ef" + integrity sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" + +tar-stream@^3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + +tar@6.1.15: + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +text-decoder@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tinyglobby@^0.2.11: + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + +to-data-view@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-data-view/-/to-data-view-1.1.0.tgz#08d6492b0b8deb9b29bdf1f61c23eadfa8994d00" + integrity sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trim-trailing-lines@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz#9aac7e89b09cb35badf663de7133c6de164f86df" + integrity sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg== + +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.4.0, tslib@^2.6.0, tslib@^2.8.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +twoslash-protocol@0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/twoslash-protocol/-/twoslash-protocol-0.3.6.tgz#841b7c6217ddec8a475a4e088b64cb9f80ef0fe3" + integrity sha512-FHGsJ9Q+EsNr5bEbgG3hnbkvEBdW5STgPU824AHUjB4kw0Dn4p8tABT7Ncg1Ie6V0+mDg3Qpy41VafZXcQhWMA== + +twoslash@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/twoslash/-/twoslash-0.3.6.tgz#cf647bfe138adf8c617002e4cbb2d4893b8ff832" + integrity sha512-VuI5OKl+MaUO9UIW3rXKoPgHI3X40ZgB/j12VY6h98Ae1mCBihjPvhOPeJWlxCYcmSbmeZt5ZKkK0dsVtp+6pA== + dependencies: + "@typescript/vfs" "^1.6.2" + twoslash-protocol "0.3.6" + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^4.27.0, type-fest@^4.31.0: + version "4.41.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" + integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +unbzip2-stream@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +undici-types@~7.16.0: + version "7.16.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" + integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== + +unified@11.0.5, unified@^11.0.0, unified@^11.0.4: + version "11.0.5" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + +unist-builder@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-4.0.0.tgz#817b326c015a6f9f5e92bb55b8e8bc5e578fe243" + integrity sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-find-after@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz#3fccc1b086b56f34c8b798e1ff90b5c54468e896" + integrity sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-is@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-is@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz#d0a3f86f2dd0db7acd7d8c2478080b5c67f9c6a9" + integrity sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-map@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-map/-/unist-util-map-4.0.0.tgz#29ab31b16d2760b2a31c71b2169500f5b00dbaac" + integrity sha512-HJs1tpkSmRJUzj6fskQrS5oYhBYlmtcvy4SepdDEEsL04FjBrgF0Mgggvxc1/qGBGgW7hRh9+UBK1aqTEnBpIA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-modify-children@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz#981d6308e887b005d1f491811d3cbcc254b315e9" + integrity sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw== + dependencies: + "@types/unist" "^3.0.0" + array-iterate "^2.0.0" + +unist-util-position-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz#d94da4df596529d1faa3de506202f0c9a23f2200" + integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-remove-position@5.0.0, unist-util-remove-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" + integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== + dependencies: + "@types/unist" "^3.0.0" + unist-util-visit "^5.0.0" + +unist-util-remove@4.0.0, unist-util-remove@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-4.0.0.tgz#94b7d6bbd24e42d2f841e947ed087be5c82b222e" + integrity sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-children@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz#4bced199b71d7f3c397543ea6cc39e7a7f37dc7e" + integrity sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz#777df7fb98652ce16b4b7cd999d0a1a40efa3a02" + integrity sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + +unist-util-visit@5.0.0, unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +urijs@^1.19.11: + version "1.19.11" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" + integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== + +urlpattern-polyfill@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" + integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utility-types@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c" + integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" + integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-location@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.3.tgz#cb9eacd20f2b6426d19451e0eafa3d0a846225c3" + integrity sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== + dependencies: + "@types/unist" "^3.0.0" + vfile "^6.0.0" + +vfile-matter@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/vfile-matter/-/vfile-matter-5.0.1.tgz#3f701840dde13c68d72d5c5ebd9cf233dff84419" + integrity sha512-o6roP82AiX0XfkyTHyRCMXgHfltUNlXSEqCIS80f+mbAyiQBE2fxtDVMtseyytGx75sihiJFo/zR6r/4LTs2Cw== + dependencies: + vfile "^6.0.0" + yaml "^2.0.0" + +vfile-message@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.3.tgz#87b44dddd7b70f0641c2e3ed0864ba73e2ea8df4" + integrity sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@6.0.3, vfile@^6.0.0, vfile@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" + integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== + dependencies: + "@types/unist" "^3.0.0" + vfile-message "^4.0.0" + +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.19: + version "1.1.20" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" + integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +widest-line@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-5.0.0.tgz#b74826a1e480783345f0cd9061b49753c9da70d0" + integrity sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA== + dependencies: + string-width "^7.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98" + integrity sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.18.0: + version "8.19.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.19.0.tgz#ddc2bdfa5b9ad860204f5a72a4863a8895fd8c8b" + integrity sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg== + +ws@~8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +ws@~8.18.3: + version "8.18.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" + integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== + +xml2js@^0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" + integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^2.0.0, yaml@^2.3.4, yaml@^2.4.5: + version "2.8.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.2.tgz#5694f25eca0ce9c3e7a9d9e00ce0ddabbd9e35c5" + integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@17.7.1: + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yoctocolors-cjs@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz#7e4964ea8ec422b7a40ac917d3a344cfd2304baa" + integrity sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw== + +yoga-layout@~3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/yoga-layout/-/yoga-layout-3.2.1.tgz#d2d1ba06f0e81c2eb650c3e5ad8b0b4adde1e843" + integrity sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ== + +zod-to-json-schema@3.20.4: + version "3.20.4" + resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.20.4.tgz#155f687c5a059fdc0f1bb3ff32d6e9200036b6f4" + integrity sha512-Un9+kInJ2Zt63n6Z7mLqBifzzPcOyX+b+Exuzf7L1+xqck9Q2EPByyTRduV3kmSPaXaRer1JCsucubpgL1fipg== + +zod@3.21.4: + version "3.21.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" + integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== + +zod@3.23.8: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== + +zwitch@^2.0.0, zwitch@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From cce9fcc039bfd560b3d55da2baecfa255aa5b90a Mon Sep 17 00:00:00 2001 From: Nur Fikri Date: Sat, 7 Mar 2026 00:12:43 +0700 Subject: [PATCH 02/17] feat: improve getting-started --- cosmjs/getting-started.mdx | 143 +++++++++++++++++++++++++++++++------ 1 file changed, 120 insertions(+), 23 deletions(-) diff --git a/cosmjs/getting-started.mdx b/cosmjs/getting-started.mdx index 927d21086..ffb99b48d 100644 --- a/cosmjs/getting-started.mdx +++ b/cosmjs/getting-started.mdx @@ -1,68 +1,165 @@ --- title: Getting Started with CosmJS -description: The official JavaScript & TypeScript client library for Cosmos SDK blockchains +description: Install CosmJS, connect to a Cosmos SDK chain, query state, and send your first transaction --- -Get started with CosmJS in 60 seconds. +## Prerequisites -## 1. Install +- **Node.js** v16 or later +- **npm**, **yarn**, or **pnpm** +- A Cosmos SDK chain RPC endpoint (e.g. `https://rpc.cosmos.network` for the Cosmos Hub) -```bash + + + + +```bash npm npm install @cosmjs/stargate @cosmjs/proto-signing ``` +```bash yarn +yarn add @cosmjs/stargate @cosmjs/proto-signing +``` +```bash pnpm +pnpm add @cosmjs/stargate @cosmjs/proto-signing +``` + + + + -## 2. Connect to a Chain +Create a read-only client and verify the connection: ```typescript import { StargateClient } from "@cosmjs/stargate"; -const client = await StargateClient.connect("https://rpc.cosmos.network"); +const rpcEndpoint = "https://cosmos-rpc.polkachu.com"; +const client = await StargateClient.connect(rpcEndpoint); const chainId = await client.getChainId(); const height = await client.getHeight(); -console.info(`Connected to ${chainId} at height ${height}`); +console.log(`Connected to ${chainId} at height ${height}`); ``` -## 3. Query Data + +Find RPC endpoints for any Cosmos chain in the [chain registry](https://github.com/cosmos/chain-registry). + + + + + +Use the connected client to look up any account's balance: ```typescript -const balance = await client.getBalance("cosmos1...", "uatom"); -console.info(`Balance: ${balance.amount}${balance.denom}`); +const address = "cosmos1..."; +const balance = await client.getBalance(address, "uatom"); +console.log(`Balance: ${balance.amount} ${balance.denom}`); + +const account = await client.getAccount(address); +console.log("Account:", account); + +const allBalances = await client.getAllBalances(address); +console.log("All balances:", allBalances); ``` -## 4. Create a Signer + + + +To send transactions you need a signer. You can create one from a mnemonic for development, or connect a browser wallet like [Keplr](https://keplr.app) in production. + + + ```typescript import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; -const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic here ...", { - prefix: "cosmos", -}); +const wallet = await DirectSecp256k1HdWallet.fromMnemonic( + "your mnemonic words here ...", + { prefix: "cosmos" }, +); const [{ address }] = await wallet.getAccounts(); -console.info("Address:", address); +console.log("Signer address:", address); +``` + + +Never hard-code or commit mnemonics. Use environment variables or a secrets manager. + + + + + +```typescript +import { SigningStargateClient } from "@cosmjs/stargate"; + +const chainId = "cosmoshub-4"; +await window.keplr.enable(chainId); +const offlineSigner = window.keplr.getOfflineSigner(chainId); +const [{ address }] = await offlineSigner.getAccounts(); +console.log("Keplr address:", address); ``` -## 5. Send a Transaction + + + + + + +Connect a signing client and broadcast a token transfer: ```typescript import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; const signingClient = await SigningStargateClient.connectWithSigner( - "https://rpc.cosmos.network", - wallet, + rpcEndpoint, + wallet, // or offlineSigner from Keplr { gasPrice: GasPrice.fromString("0.025uatom") }, ); const result = await signingClient.sendTokens( address, "cosmos1recipientaddress...", - [{ denom: "uatom", amount: "1000000" }], + [{ denom: "uatom", amount: "1000000" }], // 1 ATOM = 1,000,000 uatom "auto", ); -console.info("Tx hash:", result.transactionHash); + +console.log("Tx hash:", result.transactionHash); +console.log("Gas used:", result.gasUsed); ``` ---- + +Setting gas to `"auto"` lets CosmJS simulate the transaction and estimate gas automatically. You can also pass an explicit fee object for fine-grained control. + + + + + +For transactions beyond simple token transfers, construct message objects directly: + +```typescript +import { MsgDelegate } from "cosmjs-types/cosmos/staking/v1beta1/tx"; + +const msg = { + typeUrl: "/cosmos.staking.v1beta1.MsgDelegate", + value: MsgDelegate.fromPartial({ + delegatorAddress: address, + validatorAddress: "cosmosvaloper1...", + amount: { denom: "uatom", amount: "1000000" }, + }), +}; + +const result = await signingClient.signAndBroadcast(address, [msg], "auto"); +console.log("Tx hash:", result.transactionHash); +``` + + + + +## Next steps -That's it. You've connected to a Cosmos chain, queried a balance, and sent -tokens — all in a few lines of TypeScript. + + + Browse the full API documentation for all CosmJS packages. + + + Source code, examples, and issue tracker. + + From 711a9c2bc79ae53510be2db827bccdc5f1b4f97c Mon Sep 17 00:00:00 2001 From: Nur Fikri Date: Tue, 10 Mar 2026 02:54:46 +0700 Subject: [PATCH 03/17] feat: enhance CosmJS documentation for version v0.38.x --- cosmjs/v0.38.x/concepts/account/account.mdx | 54 ++++++ .../concepts/account/bech32-addresses.mdx | 75 ++++++++ .../concepts/account/injected-wallets.mdx | 104 +++++++++++ .../concepts/account/local-wallets.mdx | 96 ++++++++++ .../concepts/account/offline-signers.mdx | 63 +++++++ .../concepts/clients/read-only-clients.mdx | 147 +++++++++++++++ .../concepts/clients/signing-clients.mdx | 152 +++++++++++++++ .../concepts/clients/stargate-vs-cosmwasm.mdx | 54 ++++++ cosmjs/v0.38.x/concepts/errors/overview.mdx | 4 + cosmjs/v0.38.x/concepts/evm/overview.mdx | 4 + .../concepts/fees-gas/dynamic-gas-pricing.mdx | 121 ++++++++++++ .../v0.38.x/concepts/fees-gas/fee-grants.mdx | 54 ++++++ .../concepts/fees-gas/gas-and-fees.mdx | 174 ++++++++++++++++++ .../v0.38.x/concepts/fees-gas/simulation.mdx | 49 +++++ .../messages-encoding/amino-encoding.mdx | 101 ++++++++++ .../messages-encoding/encode-objects.mdx | 70 +++++++ .../messages-encoding/encoding-decoding.mdx | 57 ++++++ .../messages-encoding/protobuf-encoding.mdx | 81 ++++++++ .../concepts/messages-encoding/registry.mdx | 113 ++++++++++++ .../transaction-structure.mdx | 84 +++++++++ .../concepts/transactions/advanced.mdx | 84 +++++++++ .../concepts/transactions/cosmwasm.mdx | 103 +++++++++++ .../concepts/transactions/custom-messages.mdx | 72 ++++++++ .../concepts/transactions/direct-vs-amino.mdx | 42 +++++ .../concepts/transactions/sign-broadcast.mdx | 107 +++++++++++ .../v0.38.x/concepts/transports/overview.mdx | 4 + cosmjs/{ => v0.38.x}/overview.mdx | 2 +- .../quick-start.mdx} | 2 +- docs.json | 76 +++++++- sdk/v0.50/user/run-node/interact-node.mdx | 2 +- sdk/v0.50/user/run-node/txs.mdx | 2 +- 31 files changed, 2144 insertions(+), 9 deletions(-) create mode 100644 cosmjs/v0.38.x/concepts/account/account.mdx create mode 100644 cosmjs/v0.38.x/concepts/account/bech32-addresses.mdx create mode 100644 cosmjs/v0.38.x/concepts/account/injected-wallets.mdx create mode 100644 cosmjs/v0.38.x/concepts/account/local-wallets.mdx create mode 100644 cosmjs/v0.38.x/concepts/account/offline-signers.mdx create mode 100644 cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx create mode 100644 cosmjs/v0.38.x/concepts/clients/signing-clients.mdx create mode 100644 cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm.mdx create mode 100644 cosmjs/v0.38.x/concepts/errors/overview.mdx create mode 100644 cosmjs/v0.38.x/concepts/evm/overview.mdx create mode 100644 cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx create mode 100644 cosmjs/v0.38.x/concepts/fees-gas/fee-grants.mdx create mode 100644 cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx create mode 100644 cosmjs/v0.38.x/concepts/fees-gas/simulation.mdx create mode 100644 cosmjs/v0.38.x/concepts/messages-encoding/amino-encoding.mdx create mode 100644 cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx create mode 100644 cosmjs/v0.38.x/concepts/messages-encoding/encoding-decoding.mdx create mode 100644 cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx create mode 100644 cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx create mode 100644 cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure.mdx create mode 100644 cosmjs/v0.38.x/concepts/transactions/advanced.mdx create mode 100644 cosmjs/v0.38.x/concepts/transactions/cosmwasm.mdx create mode 100644 cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx create mode 100644 cosmjs/v0.38.x/concepts/transactions/direct-vs-amino.mdx create mode 100644 cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx create mode 100644 cosmjs/v0.38.x/concepts/transports/overview.mdx rename cosmjs/{ => v0.38.x}/overview.mdx (96%) rename cosmjs/{getting-started.mdx => v0.38.x/quick-start.mdx} (99%) diff --git a/cosmjs/v0.38.x/concepts/account/account.mdx b/cosmjs/v0.38.x/concepts/account/account.mdx new file mode 100644 index 000000000..6b3ad9611 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/account/account.mdx @@ -0,0 +1,54 @@ +--- +title: Account +description: How Cosmos accounts work and how to query them with CosmJS +--- + +Every Cosmos chain stores an **account** for each address that has interacted +with the chain. An account tracks the information needed to authenticate +transactions: + +```typescript +interface Account { + readonly address: string; + readonly pubkey: Pubkey | null; + readonly accountNumber: number; + readonly sequence: number; +} +``` + +- **address** — A bech32-encoded string like `cosmos1abc...`. The prefix + (`cosmos`, `osmo`, `juno`, etc.) identifies the chain. +- **pubkey** — The public key associated with the account. This is `null` until + the account sends its first transaction. +- **accountNumber** — A unique integer assigned when the account is first + created on-chain. It never changes. +- **sequence** — A counter that increments with each transaction. Prevents + replay attacks. + +You can query any account with a read-only client: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.cosmos.network"); +const account = await client.getAccount("cosmos1..."); +// { address: "cosmos1...", pubkey: {...}, accountNumber: 47, sequence: 12 } +``` + +## AccountData vs Account + +CosmJS distinguishes between on-chain accounts and local key data. When you call +`getAccounts()` on a wallet, you get `AccountData` — the local view of the +keys the wallet manages: + +```typescript +interface AccountData { + readonly address: string; + readonly algo: Algo; // "secp256k1" | "ed25519" | "eth_secp256k1" | ... + readonly pubkey: Uint8Array; +} +``` + +This is the wallet telling you "I hold the private key for this address and can +sign with this algorithm." It does not include on-chain state like sequence or +account number — that comes from querying the chain. diff --git a/cosmjs/v0.38.x/concepts/account/bech32-addresses.mdx b/cosmjs/v0.38.x/concepts/account/bech32-addresses.mdx new file mode 100644 index 000000000..578a70bbd --- /dev/null +++ b/cosmjs/v0.38.x/concepts/account/bech32-addresses.mdx @@ -0,0 +1,75 @@ +--- +title: Bech32 Addresses +description: How Cosmos addresses are encoded and derived from public keys +--- + +Cosmos uses [Bech32](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki) +encoding for all addresses. A Bech32 address has two parts: a human-readable +prefix (HRP) that identifies the chain, and a data section containing the raw +address bytes with a checksum. + +``` +cosmos1qypqxpq9qcrsszg2pvxq6rs0zqg3yyc5lzv7xu + ^ ^ + | +-- data + checksum (base32 encoded) + +-- prefix (HRP) +``` + +## Common Prefixes + +| Chain | Address prefix | Validator prefix | +|-------|---------------|-----------------| +| Cosmos Hub | `cosmos` | `cosmosvaloper` | +| Osmosis | `osmo` | `osmovaloper` | +| Juno | `juno` | `junovaloper` | +| Neutron | `neutron` | `neutronvaloper` | +| CosmWasm testnet | `wasm` | `wasmvaloper` | + +## Encoding and Decoding + +`@cosmjs/encoding` provides three functions: + +```typescript +import { toBech32, fromBech32, normalizeBech32 } from "@cosmjs/encoding"; + +const address = toBech32("cosmos", rawAddressBytes); +// "cosmos1..." + +const { prefix, data } = fromBech32("cosmos1qypq..."); +// prefix: "cosmos", data: Uint8Array (20 bytes) + +const normalized = normalizeBech32("COSMOS1QYPQ..."); +// "cosmos1qypq..." (lowercased and validated) +``` + +`fromBech32` validates the checksum and throws on invalid input. +`normalizeBech32` round-trips through decode/encode, which is safer than calling +`toLowerCase()` directly. + +## How Addresses Are Derived from Public Keys + +The raw 20-byte address inside a Bech32 string is derived from the public key +through hashing. The algorithm depends on the key type: + +| Key type | Derivation | +|----------|-----------| +| **secp256k1** | `ripemd160(sha256(compressedPubkey))` | +| **ed25519** | `sha256(pubkey).slice(0, 20)` | +| **eth_secp256k1** | `keccak256(uncompressedPubkey[1:]).slice(-20)` | +| **multisig** | `sha256(aminoEncodedPubkey).slice(0, 20)` | + +The `@cosmjs/amino` package provides `pubkeyToAddress` for this: + +```typescript +import { pubkeyToAddress } from "@cosmjs/amino"; + +const address = pubkeyToAddress(pubkey, "cosmos"); +``` + +This means the same key pair produces different addresses on different chains — +only the Bech32 prefix changes, but the raw bytes are identical: + +```typescript +const cosmosAddr = toBech32("cosmos", rawAddress); // cosmos1abc... +const osmoAddr = toBech32("osmo", rawAddress); // osmo1abc... +``` diff --git a/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx b/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx new file mode 100644 index 000000000..96a7d2324 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx @@ -0,0 +1,104 @@ +--- +title: Injected Wallets +description: Integrate browser wallet extensions like Keplr, Leap, and Cosmostation with CosmJS +--- + +In browser environments, users typically sign transactions through a wallet +extension like [Keplr](https://www.keplr.app/), +[Leap](https://www.leapwallet.io/), or [Cosmostation](https://cosmostation.io/). +These extensions inject a global object (e.g. `window.keplr`) that can produce +an `OfflineSigner` for any supported chain. + +## Basic Integration + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const chainId = "cosmoshub-4"; + +// 1. Ask the extension to enable access for this chain +await window.keplr.enable(chainId); + +// 2. Get an OfflineSigner from the extension +const signer = window.keplr.getOfflineSigner(chainId); + +// 3. Use it exactly like a local wallet +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.cosmos.network", + signer, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const [{ address }] = await signer.getAccounts(); +const result = await client.sendTokens( + address, + "cosmos1recipient...", + [{ denom: "uatom", amount: "1000000" }], + "auto", +); +``` + +The key insight: once you have an `OfflineSigner`, the rest of the code is +identical whether the keys come from a mnemonic, Keplr, Leap, or a Ledger +device. This is the power of the `OfflineSigner` abstraction. + +## Choosing the Signing Mode + +Keplr and similar wallets offer multiple signer variants: + +```typescript +// Amino only — broadest compatibility, required for Ledger via Keplr +const aminoSigner = window.keplr.getOfflineSignerOnlyAmino(chainId); + +// Direct (Protobuf) preferred, falls back to Amino +const autoSigner = window.keplr.getOfflineSigner(chainId); + +// Direct only — most compact encoding, but not all features supported +const directSigner = window.keplr.getOfflineSignerAuto(chainId); +``` + +For most applications, `getOfflineSigner` (the auto variant) is the right +choice. It lets the wallet pick the best signing mode it supports. + +## Detecting the Extension + +Wallet extensions need a moment to inject their global object. A common pattern: + +```typescript +function getKeplr(): Keplr | undefined { + if (typeof window === "undefined") return undefined; + return window.keplr; +} + +window.addEventListener("load", () => { + const keplr = getKeplr(); + if (!keplr) { + alert("Please install the Keplr extension"); + } +}); +``` + +## Suggesting a Chain + +If the user's wallet doesn't know about your chain yet, you can suggest it: + +```typescript +await window.keplr.experimentalSuggestChain({ + chainId: "my-testnet-1", + chainName: "My Testnet", + rpc: "https://rpc.my-testnet.example", + rest: "https://lcd.my-testnet.example", + bip44: { coinType: 118 }, + bech32Config: { + bech32PrefixAccAddr: "cosmos", + bech32PrefixAccPub: "cosmospub", + bech32PrefixValAddr: "cosmosvaloper", + bech32PrefixValPub: "cosmosvaloperpub", + bech32PrefixConsAddr: "cosmosvalcons", + bech32PrefixConsPub: "cosmosvalconspub", + }, + currencies: [{ coinDenom: "ATOM", coinMinimalDenom: "uatom", coinDecimals: 6 }], + feeCurrencies: [{ coinDenom: "ATOM", coinMinimalDenom: "uatom", coinDecimals: 6 }], + stakeCurrency: { coinDenom: "ATOM", coinMinimalDenom: "uatom", coinDecimals: 6 }, +}); +``` diff --git a/cosmjs/v0.38.x/concepts/account/local-wallets.mdx b/cosmjs/v0.38.x/concepts/account/local-wallets.mdx new file mode 100644 index 000000000..81a39fe7c --- /dev/null +++ b/cosmjs/v0.38.x/concepts/account/local-wallets.mdx @@ -0,0 +1,96 @@ +--- +title: Local Wallets +description: Create and manage HD wallets from mnemonic phrases with CosmJS +--- + +The most common signer for scripts, backends, and testing is an HD wallet +created from a BIP-39 mnemonic phrase. + +## Direct Signing (recommended) + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic( + "your twelve or twenty-four word mnemonic phrase ...", + { prefix: "cosmos" }, +); + +const [{ address }] = await wallet.getAccounts(); +``` + +## Amino Signing + +```typescript +import { Secp256k1HdWallet } from "@cosmjs/amino"; + +const wallet = await Secp256k1HdWallet.fromMnemonic( + "your twelve or twenty-four word mnemonic phrase ...", + { prefix: "cosmos" }, +); +``` + +Both implement `OfflineSigner` and can be passed directly to +`SigningStargateClient`: + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.cosmos.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const result = await client.sendTokens( + address, + "cosmos1recipient...", + [{ denom: "uatom", amount: "1000000" }], + "auto", +); +``` + +## Generating a New Wallet + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.generate(24, { + prefix: "cosmos", +}); + +const mnemonic = wallet.mnemonic; +``` + +Back up the mnemonic securely — it's the only way to recover the wallet. + +## Multiple Accounts and Custom HD Paths + +A single mnemonic can derive many accounts: + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { makeCosmoshubPath } from "@cosmjs/amino"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: "cosmos", + hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1), makeCosmoshubPath(2)], +}); + +const accounts = await wallet.getAccounts(); +// Three different addresses, all derived from the same mnemonic +``` + +## Encrypted Serialization + +Wallets can be serialized to an encrypted JSON string for storage: + +```typescript +const encrypted = await wallet.serialize("strong-password"); +// Store `encrypted` in a database or file + +const restored = await DirectSecp256k1HdWallet.deserialize( + encrypted, + "strong-password", +); +``` diff --git a/cosmjs/v0.38.x/concepts/account/offline-signers.mdx b/cosmjs/v0.38.x/concepts/account/offline-signers.mdx new file mode 100644 index 000000000..690a40d96 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/account/offline-signers.mdx @@ -0,0 +1,63 @@ +--- +title: Offline Signers +description: The OfflineSigner interface and the two Cosmos signing modes +--- + +An `OfflineSigner` is the interface CosmJS uses to abstract over _any_ source of +signatures. It doesn't matter whether the private key lives in memory, in a +browser extension, or on a hardware device — as long as it implements +`OfflineSigner`, it works with `SigningStargateClient`. + +```typescript +type OfflineSigner = OfflineAminoSigner | OfflineDirectSigner; +``` + +There are two flavors, matching the two Cosmos signing modes: + +## OfflineDirectSigner (Protobuf / Direct) + +The modern default. Signs raw Protobuf-encoded bytes. Preferred for new +applications. + +```typescript +interface OfflineDirectSigner { + readonly getAccounts: () => Promise; + readonly signDirect: ( + signerAddress: string, + signDoc: SignDoc, + ) => Promise; +} +``` + +## OfflineAminoSigner (Amino JSON) + +The legacy format. Signs a deterministic JSON representation. Required for +Ledger hardware wallets and some older chains. + +```typescript +interface OfflineAminoSigner { + readonly getAccounts: () => Promise; + readonly signAmino: ( + signerAddress: string, + signDoc: StdSignDoc, + ) => Promise; +} +``` + +The "offline" in the name means the signer itself never needs network access. It +only receives bytes and returns a signature. The client handles everything +else — querying account state, building the transaction, and broadcasting. + +## Signer Summary + +| Signer | Use Case | Package | +|--------|----------|---------| +| `DirectSecp256k1HdWallet` | Scripts, backends, tests | `@cosmjs/proto-signing` | +| `Secp256k1HdWallet` | Amino signing, legacy chains | `@cosmjs/amino` | +| `window.keplr.getOfflineSigner()` | Browser apps with Keplr | (provided by extension) | +| `LedgerSigner` | Hardware wallet signing | `@cosmjs/ledger-amino` | + +All of these produce an `OfflineSigner`. All of them work with +`SigningStargateClient.connectWithSigner`. The signing client doesn't know or +care where the signature comes from — it just needs something that implements +the interface. diff --git a/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx b/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx new file mode 100644 index 000000000..99a91893f --- /dev/null +++ b/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx @@ -0,0 +1,147 @@ +--- +title: Read-Only Clients +description: Querying Cosmos SDK and CosmWasm chains with StargateClient and CosmWasmClient +--- + +CosmJS provides two parallel client hierarchies — **Stargate** for standard +Cosmos SDK chains and **CosmWasm** for chains with smart contract support. Each +hierarchy has a read-only client for queries and a signing client for +transactions. + +``` +StargateClient (read-only) CosmWasmClient (read-only) + │ │ + ▼ ▼ +SigningStargateClient (signing) SigningCosmWasmClient (signing) +``` + +Read-only clients connect to a chain's RPC endpoint and expose query methods. +They never need a wallet or private key. + +## StargateClient + +The primary read-only client for Cosmos SDK chains. + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.cosmos.network"); +``` + +### Factory Methods + +| Method | Description | +|--------|-------------| +| `StargateClient.connect(endpoint, options?)` | Connect to an RPC endpoint (auto-detects CometBFT version) | +| `StargateClient.create(cometClient, options?)` | Create from an existing CometBFT client | + +### Query Methods + +| Method | Returns | Description | +|--------|---------|-------------| +| `getChainId()` | `string` | Chain identifier | +| `getHeight()` | `number` | Latest block height | +| `getBlock(height?)` | `Block` | Block at height (latest if omitted) | +| `getAccount(address)` | `Account \| null` | Account info (number, sequence, pubkey) | +| `getSequence(address)` | `SequenceResponse` | Account number and sequence | +| `getBalance(address, denom)` | `Coin` | Balance for a single denomination | +| `getAllBalances(address)` | `Coin[]` | All balances for an address | +| `getBalanceStaked(address)` | `Coin \| null` | Total staked balance | +| `getDelegation(delegator, validator)` | `Coin \| null` | Delegation to a specific validator | +| `getTx(hash)` | `IndexedTx \| null` | Transaction by hash | +| `searchTx(query)` | `IndexedTx[]` | Search transactions by events | + +```typescript +const balance = await client.getBalance("cosmos1...", "uatom"); +const block = await client.getBlock(); +const account = await client.getAccount("cosmos1..."); +``` + +### Options + +```typescript +interface StargateClientOptions { + readonly accountParser?: AccountParser; +} +``` + +## CosmWasmClient + +The read-only client for CosmWasm-enabled chains. Provides the same core query +methods as `StargateClient` plus smart contract queries. + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await CosmWasmClient.connect("https://rpc.osmosis.zone"); +``` + +### CosmWasm-Specific Query Methods + +| Method | Returns | Description | +|--------|---------|-------------| +| `getCodes()` | `Code[]` | All uploaded code entries | +| `getCodeDetails(codeId)` | `CodeDetails` | Code metadata and wasm bytecode | +| `getContracts(codeId)` | `string[]` | Contract addresses instantiated from a code ID | +| `getContractsByCreator(creator)` | `string[]` | Contracts created by an address | +| `getContract(address)` | `Contract` | Contract metadata (code ID, label, creator, admin) | +| `getContractCodeHistory(address)` | `ContractCodeHistoryEntry[]` | Migration history | +| `queryContractRaw(address, key)` | `Uint8Array \| null` | Raw key-value store lookup | +| `queryContractSmart(address, queryMsg)` | `JsonObject` | Execute a read-only smart query | + +```typescript +const contract = await client.getContract("osmo1contractaddress..."); + +const tokenInfo = await client.queryContractSmart("osmo1contractaddress...", { + token_info: {}, +}); +``` + +## Query Extensions + +Both clients use a `QueryClient` internally that can be extended with module +query support. `StargateClient` wires up Auth, Bank, Staking, and Tx extensions +by default. `CosmWasmClient` wires up Auth, Bank, Wasm, and Tx. + +For advanced use, you can create a `QueryClient` directly with any combination +of extensions: + +```typescript +import { connectComet } from "@cosmjs/tendermint-rpc"; +import { + QueryClient, + setupBankExtension, + setupStakingExtension, + setupGovExtension, + setupDistributionExtension, +} from "@cosmjs/stargate"; + +const cometClient = await connectComet("https://rpc.cosmos.network"); +const queryClient = QueryClient.withExtensions( + cometClient, + setupBankExtension, + setupStakingExtension, + setupGovExtension, + setupDistributionExtension, +); + +const validators = await queryClient.staking.validators("BOND_STATUS_BONDED"); +const rewards = await queryClient.distribution.delegationTotalRewards("cosmos1..."); +``` + +### Available Extensions + +| Extension | Namespace | Provides | +|-----------|-----------|----------| +| `setupAuthExtension` | `auth` | Account lookup | +| `setupBankExtension` | `bank` | Balances, supply, denom metadata | +| `setupStakingExtension` | `staking` | Delegations, validators, pool, params | +| `setupDistributionExtension` | `distribution` | Rewards, commission, community pool | +| `setupGovExtension` | `gov` | Proposals, votes, deposits, tally | +| `setupIbcExtension` | `ibc` | Channels, clients, connections, transfers | +| `setupMintExtension` | `mint` | Inflation, annual provisions, params | +| `setupSlashingExtension` | `slashing` | Signing info, params | +| `setupAuthzExtension` | `authz` | Grants | +| `setupFeegrantExtension` | `feegrant` | Fee allowances | +| `setupTxExtension` | `tx` | Transaction lookup, simulation | +| `setupWasmExtension` | `wasm` | Smart contract queries (from `@cosmjs/cosmwasm`) | diff --git a/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx new file mode 100644 index 000000000..7b94d9003 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx @@ -0,0 +1,152 @@ +--- +title: Signing Clients +description: Building, signing, and broadcasting transactions with SigningStargateClient and SigningCosmWasmClient +--- + +Signing clients extend their read-only counterparts with the ability to build, +sign, and broadcast transactions. They require a **signer** (wallet) and are +created via static factory methods. + +## Signers + +A signer is any object that holds keys and can produce signatures. CosmJS +supports two signing modes: + +| Interface | Signing Mode | Wallet Implementation | +|-----------|-------------|----------------------| +| `OfflineDirectSigner` | Protobuf (Direct) — recommended | `DirectSecp256k1HdWallet`, `DirectSecp256k1Wallet` | +| `OfflineAminoSigner` | Amino JSON — required for Ledger | `Secp256k1HdWallet`, Ledger signers | + +Both implement `getAccounts()` to list available accounts. The signing client +auto-detects which mode to use based on whether the signer has a `signDirect` +method. + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "cosmos", +}); +``` + +## SigningStargateClient + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.cosmos.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); +``` + +### Factory Methods + +| Method | Description | +|--------|-------------| +| `connectWithSigner(endpoint, signer, options?)` | Connect to RPC and create signing client | +| `createWithSigner(cometClient, signer, options?)` | Create from existing CometBFT client | +| `offline(signer, options?)` | Offline client (sign without RPC) | + +### Transaction Methods + +| Method | Description | +|--------|-------------| +| `signAndBroadcast(address, messages, fee, memo?)` | Sign, broadcast, and wait for inclusion | +| `signAndBroadcastSync(address, messages, fee, memo?)` | Sign and broadcast, return tx hash immediately | +| `sign(address, messages, fee, memo, signerData?)` | Sign without broadcasting (returns `TxRaw`) | +| `simulate(address, messages, memo?)` | Estimate gas for a transaction | + +### Convenience Methods + +| Method | Message Type | +|--------|-------------| +| `sendTokens(sender, recipient, amount, fee, memo?)` | `MsgSend` | +| `delegateTokens(delegator, validator, amount, fee, memo?)` | `MsgDelegate` | +| `undelegateTokens(delegator, validator, amount, fee, memo?)` | `MsgUndelegate` | +| `withdrawRewards(delegator, validator, fee, memo?)` | `MsgWithdrawDelegatorReward` | + +### Fees + +The `fee` parameter accepts three forms: + +```typescript +// Explicit fee +const fee: StdFee = { amount: [{ denom: "uatom", amount: "5000" }], gas: "200000" }; +await client.signAndBroadcast(address, messages, fee); + +// Auto-calculate from simulation (requires gasPrice in options) +await client.signAndBroadcast(address, messages, "auto"); + +// Auto with gas multiplier (1.4 = 40% buffer over simulated gas) +await client.signAndBroadcast(address, messages, 1.4); +``` + +### Options + +```typescript +interface SigningStargateClientOptions extends StargateClientOptions { + readonly registry?: Registry; + readonly aminoTypes?: AminoTypes; + readonly broadcastTimeoutMs?: number; + readonly broadcastPollIntervalMs?: number; + readonly gasPrice?: GasPrice | DynamicGasPriceConfig; +} +``` + +- **registry** — protobuf type registry for encoding messages (defaults cover + all standard Cosmos SDK message types) +- **aminoTypes** — converters between protobuf and Amino for Amino signers +- **gasPrice** — required when using `"auto"` fees; supports static pricing or + dynamic fee market pricing via `DynamicGasPriceConfig` + +## SigningCosmWasmClient + +Extends `CosmWasmClient` with signing and smart contract transaction methods. + +```typescript +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await SigningCosmWasmClient.connectWithSigner( + "https://rpc.osmosis.zone", + wallet, + { gasPrice: GasPrice.fromString("0.025uosmo") }, +); +``` + +### CosmWasm-Specific Transaction Methods + +| Method | Description | +|--------|-------------| +| `upload(sender, wasmCode, fee, memo?)` | Upload wasm bytecode | +| `instantiate(sender, codeId, msg, label, fee, options?)` | Instantiate a contract | +| `instantiate2(sender, codeId, salt, msg, label, fee, options?)` | Instantiate with predictable address | +| `execute(sender, contract, msg, fee, memo?, funds?)` | Execute a contract message | +| `executeMultiple(sender, instructions, fee, memo?)` | Execute multiple contract messages in one tx | +| `migrate(sender, contract, codeId, msg, fee, memo?)` | Migrate a contract to new code | +| `updateAdmin(sender, contract, newAdmin, fee, memo?)` | Change contract admin | +| `clearAdmin(sender, contract, fee, memo?)` | Remove contract admin | + +`SigningCosmWasmClient` also includes all the convenience methods from +`SigningStargateClient` (`sendTokens`, `delegateTokens`, etc.) as well as +`signAndBroadcast`, `sign`, and `simulate`. + +```typescript +const uploadResult = await client.upload(address, wasmBytecode, "auto"); + +const { contractAddress } = await client.instantiate( + address, + uploadResult.codeId, + { count: 0 }, + "my-counter", + "auto", +); + +const execResult = await client.execute( + address, + contractAddress, + { increment: {} }, + "auto", +); +``` diff --git a/cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm.mdx b/cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm.mdx new file mode 100644 index 000000000..f5a88cfc0 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm.mdx @@ -0,0 +1,54 @@ +--- +title: Stargate vs CosmWasm +description: Comparing the two CosmJS client families and when to use each +--- + +The two client families are **parallel implementations**, not a parent-child +relationship. They share the same patterns and reuse types from `@cosmjs/stargate`, +but `CosmWasmClient` does not extend `StargateClient`. + +| | Stargate | CosmWasm | +|---|----------|----------| +| **Read-only client** | `StargateClient` | `CosmWasmClient` | +| **Signing client** | `SigningStargateClient` | `SigningCosmWasmClient` | +| **Package** | `@cosmjs/stargate` | `@cosmjs/cosmwasm` | +| **Query extensions** | Auth, Bank, Staking, Tx | Auth, Bank, Wasm, Tx | +| **Staking queries** | Yes (`getBalanceStaked`, `getDelegation`) | No | +| **Smart contract queries** | No | Yes (`queryContractSmart`, `getContract`, etc.) | +| **Smart contract transactions** | No | Yes (`upload`, `instantiate`, `execute`, `migrate`) | +| **Default registry** | Standard Cosmos SDK types | Cosmos SDK + CosmWasm types | +| **Default amino types** | Standard converters | Standard + CosmWasm converters | + +## Which Should I Use? + +- **Standard Cosmos SDK chain** (Cosmos Hub, etc.) — use `@cosmjs/stargate` +- **CosmWasm-enabled chain** (Osmosis, Neutron, etc.) — use `@cosmjs/cosmwasm` + +`SigningCosmWasmClient` is a superset in terms of transaction types: it can +send tokens, delegate, and do everything `SigningStargateClient` can, plus +interact with smart contracts. If your chain supports CosmWasm and you need +contract interaction, use the CosmWasm client for everything. + +## Custom Messages + +Both signing clients support custom message types through the `Registry`: + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes, SigningStargateClient } from "@cosmjs/stargate"; + +const registry = new Registry(defaultRegistryTypes); +registry.register("/my.custom.v1.MsgDoSomething", MsgDoSomething); + +const client = await SigningStargateClient.connectWithSigner(endpoint, wallet, { + registry, + gasPrice: GasPrice.fromString("0.025uatom"), +}); + +await client.signAndBroadcast(address, [ + { + typeUrl: "/my.custom.v1.MsgDoSomething", + value: MsgDoSomething.fromPartial({ sender: address, data: "hello" }), + }, +], "auto"); +``` diff --git a/cosmjs/v0.38.x/concepts/errors/overview.mdx b/cosmjs/v0.38.x/concepts/errors/overview.mdx new file mode 100644 index 000000000..310643080 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/overview.mdx @@ -0,0 +1,4 @@ +--- +title: Errors +description: Error handling patterns in CosmJS +--- diff --git a/cosmjs/v0.38.x/concepts/evm/overview.mdx b/cosmjs/v0.38.x/concepts/evm/overview.mdx new file mode 100644 index 000000000..795af262a --- /dev/null +++ b/cosmjs/v0.38.x/concepts/evm/overview.mdx @@ -0,0 +1,4 @@ +--- +title: EVM +description: Using CosmJS with EVM-compatible Cosmos chains +--- diff --git a/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx b/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx new file mode 100644 index 000000000..04f863319 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx @@ -0,0 +1,121 @@ +--- +title: Dynamic Gas Pricing +description: Querying on-chain fee markets and the chain registry for gas prices +--- + +Some chains implement dynamic gas pricing through fee market modules. Instead of +hardcoding a gas price, CosmJS can query the current base fee from the chain and +adjust automatically. + +This is supported for: + +- **Osmosis** — EIP-1559 style fee market (`/osmosis.txfees.v1beta1.Query/GetEipBaseFee`) +- **Skip feemarket** — used by Cosmos Hub and other chains (`/feemarket.feemarket.v1.Query/GasPrices`) + +## Configuration + +Pass a `DynamicGasPriceConfig` instead of a static `GasPrice`: + +```typescript +import { + SigningStargateClient, + GasPrice, + DynamicGasPriceConfig, +} from "@cosmjs/stargate"; + +const dynamicConfig: DynamicGasPriceConfig = { + denom: "uatom", + minGasPrice: GasPrice.fromString("0.005uatom"), + maxGasPrice: GasPrice.fromString("0.1uatom"), + multiplier: 1.3, +}; + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.cosmos.network", + wallet, + { gasPrice: dynamicConfig }, +); + +const result = await client.signAndBroadcast(address, messages, "auto"); +``` + +## How It Works + +When `"auto"` fee is used with a `DynamicGasPriceConfig`: + +1. The chain's feemarket module is queried for the current base gas price +2. The `multiplier` is applied (default 1.3x) to stay above the minimum +3. The result is clamped between `minGasPrice` and `maxGasPrice` +4. If the query fails, `minGasPrice` is used as a fallback + +## DynamicGasPriceConfig Fields + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `denom` | `string` | Yes | Token denomination to query the gas price for | +| `minGasPrice` | `GasPrice` | Yes | Floor price (also used as fallback if the query fails) | +| `maxGasPrice` | `GasPrice` | No | Ceiling price. If not set, no maximum is enforced | +| `multiplier` | `number` | No | Multiplier on the queried price. Defaults to 1.3 | + +## Checking Support + +You can verify whether a chain supports dynamic gas pricing before configuring +it: + +```typescript +import { checkDynamicGasPriceSupport } from "@cosmjs/stargate"; + +const supported = await checkDynamicGasPriceSupport( + queryClient, + "uatom", + "cosmoshub-4", +); +``` + +## Getting Gas Prices from the Chain Registry + +CosmJS does not integrate with the +[Cosmos Chain Registry](https://github.com/cosmos/chain-registry) directly, but +you can use it as a source for gas prices. The registry publishes recommended gas +prices for each chain in its `chain.json` files. + +### Fetching from the Chain Registry + +```typescript +import { GasPrice } from "@cosmjs/stargate"; + +const registryUrl = + "https://raw.githubusercontent.com/cosmos/chain-registry/master/cosmoshub/chain.json"; +const response = await fetch(registryUrl); +const chainInfo = await response.json(); + +const feeToken = chainInfo.fees.fee_tokens.find( + (t: any) => t.denom === "uatom", +); + +const gasPrice = GasPrice.fromString( + `${feeToken.average_gas_price}${feeToken.denom}`, +); +``` + +The chain registry typically provides three gas price tiers per token: + +| Field | Description | +|-------|-------------| +| `low_gas_price` | Minimum price — may be rejected during congestion | +| `average_gas_price` | Recommended default | +| `high_gas_price` | For priority during high traffic | + +Using `average_gas_price` is a reasonable default. Use `high_gas_price` for +time-sensitive transactions. + +### Libraries That Wrap the Registry + +Several community libraries provide typed access to the chain registry: + +- [`chain-registry`](https://www.npmjs.com/package/chain-registry) — typed + chain registry data as an npm package +- [`@chain-registry/client`](https://www.npmjs.com/package/@chain-registry/client) — + client with fetching and caching + +These are external packages, not part of CosmJS. diff --git a/cosmjs/v0.38.x/concepts/fees-gas/fee-grants.mdx b/cosmjs/v0.38.x/concepts/fees-gas/fee-grants.mdx new file mode 100644 index 000000000..ff1bd28de --- /dev/null +++ b/cosmjs/v0.38.x/concepts/fees-gas/fee-grants.mdx @@ -0,0 +1,54 @@ +--- +title: Fee Grants +description: Using the fee grant module to let one account pay fees for another +--- + +Cosmos SDK's fee grant module allows one account (the **granter**) to pay +transaction fees on behalf of another account (the **grantee**). This is useful +for onboarding users who don't yet hold tokens. + +## Sending a Transaction with a Fee Grant + +Set the `granter` field on the `StdFee` object: + +```typescript +import { coins } from "@cosmjs/proto-signing"; + +const fee = { + amount: coins(5000, "uatom"), + gas: "200000", + granter: "cosmos1granter...", +}; + +const result = await client.signAndBroadcast(granteeAddress, messages, fee); +``` + +The granter must have previously granted a fee allowance to the grantee on-chain +(using `MsgGrantAllowance`). + +## Querying Fee Allowances + +Use the feegrant query extension to check existing grants: + +```typescript +import { + QueryClient, + setupFeegrantExtension, +} from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.cosmos.network"); +const queryClient = QueryClient.withExtensions( + cometClient, + setupFeegrantExtension, +); + +const allowance = await queryClient.feegrant.allowance( + "cosmos1granter...", + "cosmos1grantee...", +); + +const allAllowances = await queryClient.feegrant.allowances( + "cosmos1grantee...", +); +``` diff --git a/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx b/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx new file mode 100644 index 000000000..42f93d5b5 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx @@ -0,0 +1,174 @@ +--- +title: Gas & Fees +description: How gas and fees work in Cosmos SDK transactions and how CosmJS represents them +--- + +Every Cosmos SDK transaction requires a **fee** to compensate validators for +executing it. This guide explains how gas and fees work, how CosmJS calculates +them, and how to configure gas pricing. + +## Gas vs Fees + +These two terms are related but distinct: + +- **Gas** is a unit of computational work. Every operation in a transaction + (reading state, writing state, signature verification, etc.) costs a certain + amount of gas. The total gas consumed by a transaction is its **gas used**. +- **Gas limit** is the maximum gas a transaction is allowed to consume. If + execution exceeds this limit, the transaction fails (and the fee is still + charged). +- **Gas price** is the price per unit of gas, denominated in a token (e.g. + `0.025uatom`). It determines how much you pay per unit of work. +- **Fee** is the total cost: `gas limit × gas price`. It is what the signer + actually pays. + +In CosmJS, a fee is represented as `StdFee`: + +```typescript +interface StdFee { + readonly amount: readonly Coin[]; + readonly gas: string; + readonly granter?: string; + readonly payer?: string; +} +``` + +The `gas` field is the gas limit (as a string), and `amount` is the total fee in +coins. A fee of 200,000 gas at 0.025 uatom/gas costs 5,000 uatom: + +```typescript +{ + amount: [{ denom: "uatom", amount: "5000" }], + gas: "200000", +} +``` + +## Setting Gas Price + +`GasPrice` represents the cost per unit of gas. Set it once when creating the +signing client and use `"auto"` fees everywhere: + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "cosmos", +}); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.cosmos.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); +``` + +You can also construct a `GasPrice` from its parts: + +```typescript +import { Decimal } from "@cosmjs/math"; +import { GasPrice } from "@cosmjs/stargate"; + +const gasPrice = new GasPrice(Decimal.fromUserInput("0.025", 18), "uatom"); +``` + +`GasPrice.fromString` parses a `` string and validates the denom +against Cosmos SDK rules (3–128 characters, alphanumeric with `/`, `:`, `.`, +`_`, `-` allowed). + +## Three Ways to Specify Fees + +Every transaction method (`signAndBroadcast`, `sendTokens`, `delegateTokens`, +etc.) accepts a `fee` parameter in one of three forms: + +### 1. `"auto"` — Simulate and Calculate + +The simplest option. CosmJS simulates the transaction to estimate gas, applies a +safety multiplier (default 1.4x), and calculates the fee from the configured gas +price: + +```typescript +const result = await client.signAndBroadcast(address, messages, "auto"); +``` + +This requires `gasPrice` to be set in the client options. If it is not set, an +error is thrown. + +### 2. A Number — Custom Gas Multiplier + +Pass a number to override the default 1.4x safety buffer. The simulation still +runs, but your multiplier is used instead: + +```typescript +const result = await client.signAndBroadcast(address, messages, 1.2); + +const result = await client.signAndBroadcast(address, messages, 2.0); +``` + +### 3. `StdFee` — Explicit Fee + +For full control, pass a `StdFee` object directly. No simulation runs: + +```typescript +import { calculateFee, GasPrice } from "@cosmjs/stargate"; + +const fee = calculateFee(200_000, GasPrice.fromString("0.025uatom")); + +const result = await client.signAndBroadcast(address, messages, fee); +``` + +## Calculating Fees Manually + +`calculateFee` multiplies a gas limit by a gas price and returns a `StdFee`: + +```typescript +import { calculateFee, GasPrice } from "@cosmjs/stargate"; + +const fee = calculateFee(200_000, GasPrice.fromString("0.025uatom")); +// { amount: [{ denom: "uatom", amount: "5000" }], gas: "200000" } +``` + +`calculateFee` also accepts a gas price string directly: + +```typescript +const fee = calculateFee(200_000, "0.025uatom"); +``` + +The multiplication uses `Decimal` arithmetic internally, so it handles gas +prices that would overflow JavaScript's safe integer range (e.g. chains with +18-decimal tokens): + +```typescript +const fee = calculateFee(500_000, GasPrice.fromString("5000000000000tiny")); +// { amount: [{ denom: "tiny", amount: "2500000000000000000" }], gas: "500000" } +``` + +## Common Gas Limits + +These are rough estimates for common transactions. Actual gas varies by chain +version, state, and message complexity: + +| Transaction | Typical Gas | +|-------------|-------------| +| `MsgSend` (token transfer) | 80,000 – 120,000 | +| `MsgDelegate` | 200,000 – 300,000 | +| `MsgUndelegate` | 200,000 – 300,000 | +| `MsgWithdrawDelegatorReward` | 150,000 – 250,000 | +| `MsgVote` | 80,000 – 120,000 | +| IBC `MsgTransfer` | 150,000 – 250,000 | +| CosmWasm `MsgExecuteContract` | 200,000 – 1,000,000+ | +| CosmWasm `MsgStoreCode` | 1,000,000 – 5,000,000+ | + +Use `"auto"` unless you have a specific reason to set gas manually. The +simulation-based approach adapts to the actual cost of your transaction. + +## Choosing the Right Approach + +| Situation | Recommendation | +|-----------|---------------| +| Standard app with known chain | Set `gasPrice` in client options, use `"auto"` everywhere | +| Multi-chain app | Fetch gas prices from the chain registry at startup | +| Chain with fee market (Osmosis, Cosmos Hub) | Use `DynamicGasPriceConfig` | +| Fee-sensitive application | Simulate first, apply a conservative multiplier (1.5–2.0x) | +| Offline or air-gapped signing | Calculate fees manually with `calculateFee` | +| Sponsored transactions | Use fee grants with the `granter` field | diff --git a/cosmjs/v0.38.x/concepts/fees-gas/simulation.mdx b/cosmjs/v0.38.x/concepts/fees-gas/simulation.mdx new file mode 100644 index 000000000..7d8db1f0f --- /dev/null +++ b/cosmjs/v0.38.x/concepts/fees-gas/simulation.mdx @@ -0,0 +1,49 @@ +--- +title: Transaction Simulation +description: Estimating gas consumption before broadcasting transactions +--- + +Simulation executes the transaction against the current chain state without +broadcasting it. The chain returns how much gas the transaction would consume. + +## Using `simulate` Directly + +```typescript +const gasEstimate = await client.simulate(address, messages, "optional memo"); +``` + +`simulate` returns the gas used as a `number`. You can then add a buffer and +compute the fee: + +```typescript +import { calculateFee, GasPrice } from "@cosmjs/stargate"; + +const gasEstimate = await client.simulate(address, messages, memo); +const gasLimit = Math.ceil(gasEstimate * 1.5); +const fee = calculateFee(gasLimit, GasPrice.fromString("0.025uatom")); + +const result = await client.signAndBroadcast(address, messages, fee, memo); +``` + +## How `"auto"` Uses Simulation + +When you pass `"auto"` or a number, the client calls `simulate` internally: + +1. The transaction is built with an empty signature and sent to the chain's + `Simulate` endpoint +2. The chain executes it in a read-only context and returns `gasUsed` +3. The client multiplies by the gas multiplier (default 1.4x for static prices, + or the value you passed) +4. `calculateFee` converts the gas limit to a `StdFee` using the configured gas + price + +The 1.4x default was chosen because Cosmos SDK 0.47+ sometimes uses +significantly more gas than simulation predicts. Earlier versions used 1.3x. + +## Caveats + +- Simulation is an **estimate**. Actual gas can differ if chain state changes + between simulation and execution. +- The multiplier buffer protects against this, but extremely volatile state + (e.g. many concurrent transactions) may still cause out-of-gas errors. +- Simulation requires an RPC connection. Offline clients cannot simulate. diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/amino-encoding.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/amino-encoding.mdx new file mode 100644 index 000000000..142c84d0c --- /dev/null +++ b/cosmjs/v0.38.x/concepts/messages-encoding/amino-encoding.mdx @@ -0,0 +1,101 @@ +--- +title: Amino (JSON) Encoding +description: Legacy JSON-based signing format used by Ledger wallets and older chains +--- + +Amino is the legacy signing format where the sign document is deterministic +JSON rather than Protobuf binary. It is still required for Ledger hardware +wallets and some older chains. + +## AminoMsg vs EncodeObject + +| | AminoMsg | EncodeObject | +|-|----------|--------------| +| **Package** | `@cosmjs/amino` | `@cosmjs/proto-signing` | +| **Identifier** | `type` (e.g. `"cosmos-sdk/MsgSend"`) | `typeUrl` (e.g. `"/cosmos.bank.v1beta1.MsgSend"`) | +| **Value format** | JSON with snake_case fields | Protobuf message with camelCase fields | +| **Serialization** | Sorted JSON → UTF-8 | Protobuf binary | + +An Amino message looks like: + +```typescript +interface AminoMsg { + readonly type: string; + readonly value: Record; +} + +const aminoMsg: AminoMsg = { + type: "cosmos-sdk/MsgSend", + value: { + from_address: "cosmos1sender...", + to_address: "cosmos1recipient...", + amount: [{ denom: "uatom", amount: "1000000" }], + }, +}; +``` + +## StdSignDoc + +The Amino sign document is a JSON object with sorted keys: + +```typescript +interface StdSignDoc { + readonly chain_id: string; + readonly account_number: string; + readonly sequence: string; + readonly fee: StdFee; + readonly msgs: readonly AminoMsg[]; + readonly memo: string; + readonly timeout_height?: string; +} +``` + +Signing flow: + +1. Build `StdSignDoc` with `makeSignDoc()` +2. Sort all keys deterministically with `sortedJsonStringify()` +3. Escape `&`, `<`, `>` characters +4. Convert to UTF-8 bytes +5. Hash with SHA-256 and sign + +## AminoTypes: Converting Between Formats + +`AminoTypes` (from `@cosmjs/stargate`) bridges the two worlds. It converts +`EncodeObject` ↔ `AminoMsg` using registered converters: + +```typescript +import { AminoTypes, createDefaultAminoConverters } from "@cosmjs/stargate"; + +const aminoTypes = new AminoTypes(createDefaultAminoConverters()); + +const aminoMsg = aminoTypes.toAmino(encodeObject); +const encodeObject = aminoTypes.fromAmino(aminoMsg); +``` + +Each converter defines the mapping between Protobuf and Amino representations: + +```typescript +{ + "/cosmos.bank.v1beta1.MsgSend": { + aminoType: "cosmos-sdk/MsgSend", + toAmino: ({ fromAddress, toAddress, amount }) => ({ + from_address: fromAddress, // camelCase → snake_case + to_address: toAddress, + amount: [...amount], + }), + fromAmino: ({ from_address, to_address, amount }) => ({ + fromAddress: from_address, // snake_case → camelCase + toAddress: to_address, + amount: [...amount], + }), + }, +} +``` + +When the signing client detects an Amino signer, it: + +1. Converts each `EncodeObject` to `AminoMsg` via `aminoTypes.toAmino()` +2. Builds a `StdSignDoc` and signs it +3. Converts the signed messages back via `aminoTypes.fromAmino()` +4. Encodes the final transaction as Protobuf (even Amino-signed transactions + are broadcast as Protobuf `TxRaw`) diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx new file mode 100644 index 000000000..f04367b29 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx @@ -0,0 +1,70 @@ +--- +title: EncodeObject +description: The JavaScript representation of Cosmos SDK messages in CosmJS +--- + +In CosmJS, the JavaScript representation of a type-URL-tagged message is an +`EncodeObject`: + +```typescript +interface EncodeObject { + readonly typeUrl: string; + readonly value: any; +} +``` + +You construct one by pairing a type URL with a partial Protobuf message: + +```typescript +import { MsgSend } from "cosmjs-types/cosmos/bank/v1beta1/tx"; +import { coins } from "@cosmjs/proto-signing"; + +const msg: EncodeObject = { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: MsgSend.fromPartial({ + fromAddress: "cosmos1sender...", + toAddress: "cosmos1recipient...", + amount: coins(1_000_000, "uatom"), + }), +}; +``` + +## Typed Encode Objects + +CosmJS also provides **typed encode objects** for common messages. These narrow +the `typeUrl` to a string literal and constrain `value` to the correct Protobuf +type, giving you compile-time safety: + +```typescript +import { MsgSendEncodeObject } from "@cosmjs/stargate"; + +const msg: MsgSendEncodeObject = { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: MsgSend.fromPartial({ ... }), +}; +``` + +### Available in `@cosmjs/stargate` + +| Type | typeUrl | +|------|---------| +| `MsgSendEncodeObject` | `/cosmos.bank.v1beta1.MsgSend` | +| `MsgDelegateEncodeObject` | `/cosmos.staking.v1beta1.MsgDelegate` | +| `MsgUndelegateEncodeObject` | `/cosmos.staking.v1beta1.MsgUndelegate` | +| `MsgBeginRedelegateEncodeObject` | `/cosmos.staking.v1beta1.MsgBeginRedelegate` | +| `MsgWithdrawDelegatorRewardEncodeObject` | `/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward` | +| `MsgDepositEncodeObject` | `/cosmos.gov.v1beta1.MsgDeposit` | +| `MsgSubmitProposalEncodeObject` | `/cosmos.gov.v1beta1.MsgSubmitProposal` | +| `MsgVoteEncodeObject` | `/cosmos.gov.v1beta1.MsgVote` | +| `MsgTransferEncodeObject` | `/ibc.applications.transfer.v1.MsgTransfer` | + +### Available in `@cosmjs/cosmwasm` + +| Type | typeUrl | +|------|---------| +| `MsgStoreCodeEncodeObject` | `/cosmwasm.wasm.v1.MsgStoreCode` | +| `MsgInstantiateContractEncodeObject` | `/cosmwasm.wasm.v1.MsgInstantiateContract` | +| `MsgExecuteContractEncodeObject` | `/cosmwasm.wasm.v1.MsgExecuteContract` | +| `MsgMigrateContractEncodeObject` | `/cosmwasm.wasm.v1.MsgMigrateContract` | +| `MsgClearAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgClearAdmin` | +| `MsgUpdateAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgUpdateAdmin` | diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/encoding-decoding.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/encoding-decoding.mdx new file mode 100644 index 000000000..6ff3363cb --- /dev/null +++ b/cosmjs/v0.38.x/concepts/messages-encoding/encoding-decoding.mdx @@ -0,0 +1,57 @@ +--- +title: Encoding & Decoding +description: Binary encoding helpers and decoding transactions in CosmJS +--- + +## Encoding Utilities + +`@cosmjs/encoding` provides conversions between common formats: + +| Function | Input | Output | Use case | +|----------|-------|--------|----------| +| `toHex` / `fromHex` | `Uint8Array` ↔ `string` | Hex strings | Transaction hashes, debug output | +| `toBase64` / `fromBase64` | `Uint8Array` ↔ `string` | Base64 strings | Public keys, signatures in JSON | +| `toUtf8` / `fromUtf8` | `string` ↔ `Uint8Array` | UTF-8 bytes | Amino sign docs, contract messages | +| `toAscii` / `fromAscii` | `string` ↔ `Uint8Array` | ASCII bytes | Printable ASCII only (0x20–0x7E) | +| `toRfc3339` / `fromRfc3339` | `Date` ↔ `string` | ISO timestamps | Block times, governance deadlines | + +```typescript +import { toHex, fromHex, toBase64, fromBase64, toUtf8, fromUtf8 } from "@cosmjs/encoding"; + +toHex(new Uint8Array([0xde, 0xad])); // "dead" +fromHex("deadbeef"); // Uint8Array [222, 173, 190, 239] + +toBase64(new Uint8Array([1, 2, 3])); // "AQID" +fromBase64("AQID"); // Uint8Array [1, 2, 3] + +toUtf8("hello"); // Uint8Array [104, 101, 108, 108, 111] +fromUtf8(new Uint8Array([104, 101])); // "he" +``` + +## Decoding Transactions + +You can decode raw transaction bytes back into structured data: + +```typescript +import { decodeTxRaw } from "@cosmjs/proto-signing"; + +const decoded = decodeTxRaw(txBytes); + +// decoded.body.messages — Array (typeUrl + raw bytes) +// decoded.authInfo — fee and signer info +// decoded.signatures — raw signature bytes +``` + +To decode individual messages, use the registry: + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes } from "@cosmjs/stargate"; + +const registry = new Registry(defaultRegistryTypes); + +for (const anyMsg of decoded.body.messages) { + const msg = registry.decode({ typeUrl: anyMsg.typeUrl, value: anyMsg.value }); + console.info(anyMsg.typeUrl, msg); +} +``` diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx new file mode 100644 index 000000000..c3b19d567 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx @@ -0,0 +1,81 @@ +--- +title: Protobuf (Direct) Encoding +description: How Direct signing serializes transactions as Protocol Buffers binary +--- + +Direct signing serializes everything as Protocol Buffers binary. This is the +default and most compact format. + +## SignDoc + +The bytes that get signed are the Protobuf encoding of a `SignDoc`: + +```typescript +interface SignDoc { + bodyBytes: Uint8Array; // encoded TxBody + authInfoBytes: Uint8Array; // encoded AuthInfo + chainId: string; + accountNumber: number; +} +``` + +CosmJS provides helpers to construct these: + +```typescript +import { makeAuthInfoBytes, makeSignDoc, makeSignBytes } from "@cosmjs/proto-signing"; + +const bodyBytes = registry.encodeTxBody({ messages, memo }); + +const authInfoBytes = makeAuthInfoBytes( + [{ pubkey: encodedPubkey, sequence }], + feeAmount, + gasLimit, + feeGranter, + feePayer, +); + +const signDoc = makeSignDoc(bodyBytes, authInfoBytes, chainId, accountNumber); +const bytesToSign = makeSignBytes(signDoc); +``` + +`makeSignBytes` produces the canonical byte representation by encoding the +`SignDoc` with `SignDoc.encode().finish()`. This is what gets hashed (SHA-256) +and signed. + +## AuthInfo + +`AuthInfo` contains signer metadata and fee information: + +```typescript +const authInfoBytes = makeAuthInfoBytes( + signers, // [{ pubkey, sequence }] + feeAmount, // Coin[] + gasLimit, // number + feeGranter, + feePayer, + signMode, // defaults to SIGN_MODE_DIRECT +); +``` + +Each signer entry includes: +- **pubkey** — the signer's public key, encoded as `Any` +- **sequence** — the account's current transaction counter +- **signMode** — `SIGN_MODE_DIRECT` for Protobuf signing + +## TxRaw + +After signing, the final transaction is a `TxRaw`: + +```typescript +import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; + +const txRaw = TxRaw.fromPartial({ + bodyBytes, + authInfoBytes, + signatures: [signature], +}); + +const txBytes = TxRaw.encode(txRaw).finish(); +``` + +These `txBytes` are what gets broadcast to the chain. diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx new file mode 100644 index 000000000..87d44c32c --- /dev/null +++ b/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx @@ -0,0 +1,113 @@ +--- +title: The Registry +description: How CosmJS maps type URLs to Protobuf codecs for encoding and decoding messages +--- + +The `Registry` class (from `@cosmjs/proto-signing`) is the central type map that +knows how to encode and decode Protobuf messages by type URL. When you call +`signAndBroadcast`, the client uses its registry to serialize each +`EncodeObject` into binary Protobuf wrapped in `Any`. + +## How It Works + +``` + EncodeObject google.protobuf.Any + +--------------------+ +------------------------+ + | typeUrl: string | Registry | typeUrl: string | + | value: object | ----------> | value: Uint8Array | + +--------------------+ .encode() +------------------------+ + (Protobuf bytes) +``` + +Internally, the Registry keeps a `Map` where each key is +a type URL and each value is a Protobuf codec. A codec is any object with +`encode` and `decode` methods — the exact shape depends on the code generator +used: + +| Generator | Instance method | Notes | +|-----------|----------------|-------| +| **ts-proto** (v1/v2) | `fromPartial` + `encode` + `decode` | Used by `cosmjs-types` | +| **Telescope** | `fromPartial` + `encode` + `decode` | Same interface as ts-proto | +| **protobufjs** | `create` + `encode` + `decode` | Slightly different API | + +All three are supported through the `GeneratedType` union: + +```typescript +type GeneratedType = + | TsProtoGeneratedType + | TsProto2GeneratedType + | TelescopeGeneratedType + | PbjsGeneratedType; +``` + +## Default Types + +When you create a `SigningStargateClient` without a custom registry, it uses +`defaultRegistryTypes` — a list of all standard Cosmos SDK message types: + +```typescript +import { defaultRegistryTypes } from "@cosmjs/stargate"; +import { Registry } from "@cosmjs/proto-signing"; + +const registry = new Registry(defaultRegistryTypes); +``` + +This includes messages from bank, staking, distribution, governance, authz, +feegrant, group, IBC, and vesting modules. + +## Registering Custom Types + +If your chain has custom modules, register their generated types on top of the +defaults: + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes } from "@cosmjs/stargate"; +import { MsgCreatePost } from "./generated/blog/tx"; + +const registry = new Registry(defaultRegistryTypes); +registry.register("/blog.v1.MsgCreatePost", MsgCreatePost); +``` + +Then pass the registry to the client: + +```typescript +const client = await SigningStargateClient.connectWithSigner(endpoint, wallet, { + registry, +}); +``` + +## Registry API + +| Method | Description | +|--------|-------------| +| `register(typeUrl, type)` | Add or overwrite a type URL mapping | +| `lookupType(typeUrl)` | Get the codec for a type URL (or `undefined`) | +| `encode(encodeObject)` | Encode an `EncodeObject` to Protobuf bytes | +| `encodeAsAny(encodeObject)` | Encode and wrap in `google.protobuf.Any` | +| `encodeTxBody(txBodyFields)` | Encode a full `TxBody` (wraps each message in `Any`) | +| `decode(decodeObject)` | Decode Protobuf bytes using the type URL | +| `decodeTxBody(bytes)` | Decode a `TxBody` and recursively decode its messages | + +## Encoding Flow + +When you call `signAndBroadcast`, this is what happens to your messages: + +``` + EncodeObject[] + | + v registry.encodeAsAny(msg) for each + Any[] (typeUrl + Protobuf bytes) + | + v TxBody.fromPartial({ messages, memo }) + TxBody + | + v TxBody.encode(txBody).finish() + bodyBytes (Uint8Array) + | + v combined with authInfoBytes into SignDoc + SignDoc + | + v SignDoc.encode().finish() + signBytes (Uint8Array) --> SHA-256 --> signature +``` diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure.mdx new file mode 100644 index 000000000..d93de1d31 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure.mdx @@ -0,0 +1,84 @@ +--- +title: Transaction Structure +description: How Cosmos transactions are structured and how message type URLs work +--- + +A Cosmos transaction is a Protobuf-encoded envelope containing three parts: + +``` ++--------------------------------------------------+ +| TxRaw | ++-----------------+------------------+--------------+ +| bodyBytes | authInfoBytes | signatures | +| (TxBody) | (AuthInfo) | (bytes[]) | ++--------+--------+---------+--------+--------------+ + | | + v v ++----------------+ +-------------------------------+ +| TxBody | | AuthInfo | ++----------------+ +-------------------------------+ +| messages[] | | signerInfos[] | +| memo | | - publicKey (Any) | +| timeoutHeight | | - modeInfo (SignMode) | +| | | - sequence | +| | | fee | +| | | - amount (Coin[]) | +| | | - gasLimit | +| | | - payer | +| | | - granter | ++----------------+ +-------------------------------+ +``` + +Each message inside `TxBody.messages` is wrapped in a `google.protobuf.Any` — +a two-field wrapper that pairs a **type URL** string with raw Protobuf **bytes**. +This is how the chain knows which message handler to route to. + +## Message Type URLs + +Every Cosmos SDK message has a unique identifier called a **type URL**. It +follows the Protobuf `Any` convention: a leading `/` followed by the fully +qualified Protobuf type name. + +``` +/cosmos.bank.v1beta1.MsgSend + ^ ^ + | +-- message name + +-- package path (module.version) +``` + +Type URLs serve as the bridge between your JavaScript code and the on-chain +message router. When a validator receives a transaction, it reads the type URL +from each `Any`-wrapped message to determine which module should handle it. + +### Common Type URLs + +| Module | Type URL | Description | +|--------|----------|-------------| +| **Bank** | `/cosmos.bank.v1beta1.MsgSend` | Transfer tokens | +| | `/cosmos.bank.v1beta1.MsgMultiSend` | Transfer to multiple recipients | +| **Staking** | `/cosmos.staking.v1beta1.MsgDelegate` | Delegate to a validator | +| | `/cosmos.staking.v1beta1.MsgUndelegate` | Begin unbonding | +| | `/cosmos.staking.v1beta1.MsgBeginRedelegate` | Move delegation between validators | +| | `/cosmos.staking.v1beta1.MsgCreateValidator` | Register a new validator | +| | `/cosmos.staking.v1beta1.MsgEditValidator` | Edit validator details | +| | `/cosmos.staking.v1beta1.MsgCancelUnbondingDelegation` | Cancel pending unbonding | +| **Distribution** | `/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward` | Claim staking rewards | +| | `/cosmos.distribution.v1beta1.MsgSetWithdrawAddress` | Set reward withdrawal address | +| | `/cosmos.distribution.v1beta1.MsgFundCommunityPool` | Fund the community pool | +| | `/cosmos.distribution.v1beta1.MsgWithdrawValidatorCommission` | Withdraw validator commission | +| **Governance** | `/cosmos.gov.v1.MsgSubmitProposal` | Submit a governance proposal (v1) | +| | `/cosmos.gov.v1.MsgVote` | Vote on a proposal (v1) | +| | `/cosmos.gov.v1.MsgDeposit` | Deposit on a proposal (v1) | +| | `/cosmos.gov.v1beta1.MsgSubmitProposal` | Submit a proposal (legacy) | +| | `/cosmos.gov.v1beta1.MsgVote` | Vote on a proposal (legacy) | +| **Authz** | `/cosmos.authz.v1beta1.MsgGrant` | Grant authorization | +| | `/cosmos.authz.v1beta1.MsgExec` | Execute on behalf of granter | +| | `/cosmos.authz.v1beta1.MsgRevoke` | Revoke authorization | +| **Fee Grant** | `/cosmos.feegrant.v1beta1.MsgGrantAllowance` | Grant fee allowance | +| | `/cosmos.feegrant.v1beta1.MsgRevokeAllowance` | Revoke fee allowance | +| **Vesting** | `/cosmos.vesting.v1beta1.MsgCreateVestingAccount` | Create a vesting account | +| **IBC** | `/ibc.applications.transfer.v1.MsgTransfer` | Cross-chain token transfer | +| **CosmWasm** | `/cosmwasm.wasm.v1.MsgStoreCode` | Upload contract code | +| | `/cosmwasm.wasm.v1.MsgInstantiateContract` | Create a contract instance | +| | `/cosmwasm.wasm.v1.MsgExecuteContract` | Call a contract | +| | `/cosmwasm.wasm.v1.MsgMigrateContract` | Migrate a contract to new code | diff --git a/cosmjs/v0.38.x/concepts/transactions/advanced.mdx b/cosmjs/v0.38.x/concepts/transactions/advanced.mdx new file mode 100644 index 000000000..03c2f1db4 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transactions/advanced.mdx @@ -0,0 +1,84 @@ +--- +title: Advanced Patterns +description: Offline signing, IBC transfers, and other advanced transaction patterns +--- + +## Offline Signing + +You can sign transactions without an RPC connection. This is useful for +air-gapped signing or pre-signing transactions: + +```typescript +const client = await SigningStargateClient.offline(wallet); + +const txRaw = await client.sign( + signerAddress, + messages, + fee, + "memo", + { + accountNumber: 42, + sequence: 7, + chainId: "cosmoshub-4", + }, +); +``` + +When signing offline, you must provide `explicitSignerData` since the client +cannot query the chain for account number, sequence, and chain ID. + +## Inspecting a Signed Transaction + +You can decode a signed transaction to inspect its contents: + +```typescript +import { decodeTxRaw } from "@cosmjs/proto-signing"; + +const txRaw = await client.sign(address, messages, fee, "memo"); +const txBytes = TxRaw.encode(txRaw).finish(); +const decoded = decodeTxRaw(txBytes); + +// decoded.body.messages — the encoded messages +// decoded.authInfo — fee and signer info +// decoded.signatures — the raw signatures +``` + +## IBC Transfer + +Send tokens across chains using IBC: + +```typescript +import { MsgTransfer } from "cosmjs-types/ibc/applications/transfer/v1/tx"; +import { Height } from "cosmjs-types/ibc/core/client/v1/client"; + +const msg = { + typeUrl: "/ibc.applications.transfer.v1.MsgTransfer", + value: MsgTransfer.fromPartial({ + sourcePort: "transfer", + sourceChannel: "channel-0", + token: { denom: "uatom", amount: "1000000" }, + sender: senderAddress, + receiver: "osmo1recipient...", + timeoutHeight: Height.fromPartial({ + revisionNumber: BigInt(1), + revisionHeight: BigInt(currentHeight + 100), + }), + }), +}; + +const result = await client.signAndBroadcast(senderAddress, [msg], "auto"); +``` + +## Checking Transaction Results + +```typescript +import { isDeliverTxFailure, isDeliverTxSuccess } from "@cosmjs/stargate"; + +const result = await client.signAndBroadcast(address, messages, "auto"); + +if (isDeliverTxSuccess(result)) { + console.info("Success:", result.transactionHash); +} else if (isDeliverTxFailure(result)) { + console.error("Failed with code", result.code, ":", result.rawLog); +} +``` diff --git a/cosmjs/v0.38.x/concepts/transactions/cosmwasm.mdx b/cosmjs/v0.38.x/concepts/transactions/cosmwasm.mdx new file mode 100644 index 000000000..f05fc5ad0 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transactions/cosmwasm.mdx @@ -0,0 +1,103 @@ +--- +title: CosmWasm Transactions +description: Signing and broadcasting CosmWasm smart contract transactions +--- + +For chains with smart contract support, use `SigningCosmWasmClient`. It extends +the same signing patterns with CosmWasm-specific methods. + +```typescript +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { GasPrice } from "@cosmjs/stargate"; +import { readFileSync } from "fs"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "wasm", +}); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningCosmWasmClient.connectWithSigner( + "https://rpc.my-wasm-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025ucosm") }, +); +``` + +## Upload a Contract + +```typescript +const wasmCode = readFileSync("./contract.wasm"); + +const uploadResult = await client.upload(address, wasmCode, "auto"); +// uploadResult.codeId — use this to instantiate +``` + +## Instantiate a Contract + +```typescript +const instantiateResult = await client.instantiate( + address, + uploadResult.codeId, + { count: 0 }, + "My Counter Contract", + "auto", + { admin: address }, +); +// instantiateResult.contractAddress — the new contract's address +``` + +## Execute a Contract + +```typescript +const executeResult = await client.execute( + address, + contractAddress, + { increment: {} }, + "auto", + "incrementing counter", + [{ denom: "ucosm", amount: "1000" }], +); +``` + +## Execute Multiple Contracts Atomically + +```typescript +const executeResult = await client.executeMultiple( + address, + [ + { + contractAddress: counterAddress, + msg: { increment: {} }, + }, + { + contractAddress: registryAddress, + msg: { register: { name: "alice" } }, + funds: [{ denom: "ucosm", amount: "5000" }], + }, + ], + "auto", +); +``` + +## Migrate a Contract + +```typescript +const migrateResult = await client.migrate( + address, + contractAddress, + newCodeId, + { new_field: "value" }, + "auto", +); +``` + +## Quick Reference + +| Task | Method | +|------|--------| +| Upload WASM | `client.upload(sender, code, fee)` | +| Instantiate | `client.instantiate(sender, codeId, msg, label, fee)` | +| Execute contract | `client.execute(sender, contract, msg, fee)` | +| Execute multiple | `client.executeMultiple(sender, instructions, fee)` | +| Migrate contract | `client.migrate(sender, contract, codeId, msg, fee)` | diff --git a/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx b/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx new file mode 100644 index 000000000..10572ba29 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx @@ -0,0 +1,72 @@ +--- +title: Custom Message Types +description: Registering custom Protobuf and Amino message types in CosmJS +--- + +CosmJS registers all standard Cosmos SDK message types by default. If your chain +has custom modules with their own message types, you need to register them. + +## Registering Custom Types + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes, SigningStargateClient } from "@cosmjs/stargate"; +import { MsgCreatePost } from "./generated/blog/tx"; + +const registry = new Registry(defaultRegistryTypes); +registry.register("/blog.v1.MsgCreatePost", MsgCreatePost); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { registry, gasPrice: GasPrice.fromString("0.025utoken") }, +); + +const msg = { + typeUrl: "/blog.v1.MsgCreatePost", + value: MsgCreatePost.fromPartial({ + author: address, + title: "Hello from CosmJS", + body: "This is a custom message type.", + }), +}; + +const result = await client.signAndBroadcast(address, [msg], "auto"); +``` + +## Amino Support for Custom Types + +If your custom messages also need Amino signing (e.g. for Ledger support), you +need to register Amino converters alongside the Protobuf registry: + +```typescript +import { AminoTypes } from "@cosmjs/stargate"; +import { + createDefaultAminoConverters, + SigningStargateClient, +} from "@cosmjs/stargate"; +import { Registry } from "@cosmjs/proto-signing"; + +const aminoTypes = new AminoTypes({ + ...createDefaultAminoConverters(), + "/blog.v1.MsgCreatePost": { + aminoType: "blog/MsgCreatePost", + toAmino: (value) => ({ + author: value.author, + title: value.title, + body: value.body, + }), + fromAmino: (value) => ({ + author: value.author, + title: value.title, + body: value.body, + }), + }, +}); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { registry, aminoTypes, gasPrice: GasPrice.fromString("0.025utoken") }, +); +``` diff --git a/cosmjs/v0.38.x/concepts/transactions/direct-vs-amino.mdx b/cosmjs/v0.38.x/concepts/transactions/direct-vs-amino.mdx new file mode 100644 index 000000000..6d95220a5 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transactions/direct-vs-amino.mdx @@ -0,0 +1,42 @@ +--- +title: Direct vs Amino Signing +description: The two Cosmos signing modes and how CosmJS chooses between them +--- + +Cosmos supports two signing modes. `SigningStargateClient` automatically picks +the right one based on the signer you provide. + +## Direct (Protobuf) + +The modern default. The transaction is serialized as Protobuf bytes, hashed with +SHA-256, and signed. This is the most compact encoding and supports all message +types. + +- Wallet: `DirectSecp256k1HdWallet` from `@cosmjs/proto-signing` +- Interface: `OfflineDirectSigner` (has `signDirect` method) +- Sign mode: `SIGN_MODE_DIRECT` + +## Amino (JSON) + +The legacy format. The transaction is serialized as deterministic JSON (sorted +keys, escaped special characters), hashed with SHA-256, and signed. Required for +Ledger hardware wallets and some older chains. + +- Wallet: `Secp256k1HdWallet` from `@cosmjs/amino` +- Interface: `OfflineAminoSigner` (has `signAmino` method) +- Sign mode: `SIGN_MODE_LEGACY_AMINO_JSON` + +## Automatic Detection + +You don't need to choose manually. Pass any `OfflineSigner` to +`connectWithSigner` and the client determines the mode at signing time: + +```typescript +import { isOfflineDirectSigner } from "@cosmjs/proto-signing"; + +// The client checks internally: +// isOfflineDirectSigner(signer) ? signDirect(...) : signAmino(...) +``` + +If your signer implements both `signDirect` and `signAmino`, Direct signing +takes precedence. diff --git a/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx b/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx new file mode 100644 index 000000000..dac4db193 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx @@ -0,0 +1,107 @@ +--- +title: Signing & Broadcasting +description: How to sign and broadcast transactions with CosmJS +--- + +A Cosmos transaction goes through several steps before it reaches the chain: + +1. **Build messages** — describe what the transaction should do +2. **Determine fees** — calculate how much gas to pay +3. **Sign** — produce a cryptographic signature over the transaction bytes +4. **Broadcast** — send the signed transaction to a node +5. **Confirm** — wait for the transaction to be included in a block + +CosmJS handles all of this through `SigningStargateClient`. You provide the +messages and fee; the client handles serialization, signing, and broadcasting. + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "cosmos", +}); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.cosmos.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); +``` + +## signAndBroadcast + +The most common method. Signs the transaction, broadcasts it, and waits for +inclusion in a block: + +```typescript +const result = await client.signAndBroadcast( + signerAddress, + messages, + fee, + "optional memo", +); + +// result.transactionHash — the tx hash +// result.code — 0 means success, non-zero means failure +// result.gasUsed — actual gas consumed +// result.gasWanted — gas limit from the fee +// result.events — transaction events +``` + +## signAndBroadcastSync + +Signs and broadcasts but returns immediately with just the transaction hash, +without waiting for block inclusion. Useful when you don't need to wait: + +```typescript +const txHash = await client.signAndBroadcastSync( + signerAddress, + messages, + fee, + "optional memo", +); +``` + +## sign + +Signs without broadcasting. Returns the raw signed transaction bytes (`TxRaw`) +that you can broadcast later or inspect: + +```typescript +import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; + +const txRaw = await client.sign( + signerAddress, + messages, + fee, + "optional memo", +); + +const txBytes = TxRaw.encode(txRaw).finish(); +const result = await client.broadcastTx(txBytes); +``` + +## Convenience Methods + +`SigningStargateClient` provides high-level methods for the most common +transactions. These construct the message internally and call +`signAndBroadcast`: + +| Method | Description | +|--------|-------------| +| `sendTokens(sender, recipient, amount, fee, memo?)` | Transfer tokens | +| `delegateTokens(delegator, validator, amount, fee, memo?)` | Delegate to a validator | +| `undelegateTokens(delegator, validator, amount, fee, memo?)` | Undelegate from a validator | +| `withdrawRewards(delegator, validator, fee, memo?)` | Withdraw staking rewards | + +```typescript +const result = await client.sendTokens( + senderAddress, + recipientAddress, + [{ denom: "uatom", amount: "1000000" }], + "auto", + "optional memo", +); +``` diff --git a/cosmjs/v0.38.x/concepts/transports/overview.mdx b/cosmjs/v0.38.x/concepts/transports/overview.mdx new file mode 100644 index 000000000..6b4285ed1 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transports/overview.mdx @@ -0,0 +1,4 @@ +--- +title: Transports +description: Understanding transport layers and RPC connections in CosmJS +--- diff --git a/cosmjs/overview.mdx b/cosmjs/v0.38.x/overview.mdx similarity index 96% rename from cosmjs/overview.mdx rename to cosmjs/v0.38.x/overview.mdx index 601d59e13..e7d681539 100644 --- a/cosmjs/overview.mdx +++ b/cosmjs/v0.38.x/overview.mdx @@ -32,7 +32,7 @@ CosmJS is published as a set of scoped npm packages. Use the ones that match you ## Getting Started - + Install CosmJS, connect to a node, query state, and send your first transaction. diff --git a/cosmjs/getting-started.mdx b/cosmjs/v0.38.x/quick-start.mdx similarity index 99% rename from cosmjs/getting-started.mdx rename to cosmjs/v0.38.x/quick-start.mdx index ffb99b48d..d7d8acd0c 100644 --- a/cosmjs/getting-started.mdx +++ b/cosmjs/v0.38.x/quick-start.mdx @@ -1,5 +1,5 @@ --- -title: Getting Started with CosmJS +title: Quick Start description: Install CosmJS, connect to a Cosmos SDK chain, query state, and send your first transaction --- diff --git a/docs.json b/docs.json index 0e78292a4..b9632610e 100644 --- a/docs.json +++ b/docs.json @@ -7002,12 +7002,78 @@ { "dropdown": "CosmJS", "icon": "js", - "groups": [ + "versions": [ { - "group": "CosmJS", - "pages": [ - "cosmjs/overview", - "cosmjs/getting-started" + "version": "v0.38.x", + "tabs": [ + { + "tab": "CosmJS", + "groups": [ + { + "group": "CosmJS", + "pages": [ + "cosmjs/v0.38.x/overview", + "cosmjs/v0.38.x/quick-start" + ] + }, + { + "group": "Concepts", + "pages": [ + { + "group": "Clients", + "pages": [ + "cosmjs/v0.38.x/concepts/clients/read-only-clients", + "cosmjs/v0.38.x/concepts/clients/signing-clients", + "cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm" + ] + }, + { + "group": "Accounts & Wallets", + "pages": [ + "cosmjs/v0.38.x/concepts/account/account", + "cosmjs/v0.38.x/concepts/account/offline-signers", + "cosmjs/v0.38.x/concepts/account/local-wallets", + "cosmjs/v0.38.x/concepts/account/injected-wallets", + "cosmjs/v0.38.x/concepts/account/bech32-addresses" + ] + }, + { + "group": "Messages & Encoding", + "pages": [ + "cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure", + "cosmjs/v0.38.x/concepts/messages-encoding/encode-objects", + "cosmjs/v0.38.x/concepts/messages-encoding/registry", + "cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding", + "cosmjs/v0.38.x/concepts/messages-encoding/amino-encoding", + "cosmjs/v0.38.x/concepts/messages-encoding/encoding-decoding" + ] + }, + { + "group": "Fees & Gas", + "pages": [ + "cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees", + "cosmjs/v0.38.x/concepts/fees-gas/simulation", + "cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing", + "cosmjs/v0.38.x/concepts/fees-gas/fee-grants" + ] + }, + { + "group": "Transactions", + "pages": [ + "cosmjs/v0.38.x/concepts/transactions/sign-broadcast", + "cosmjs/v0.38.x/concepts/transactions/direct-vs-amino", + "cosmjs/v0.38.x/concepts/transactions/custom-messages", + "cosmjs/v0.38.x/concepts/transactions/cosmwasm", + "cosmjs/v0.38.x/concepts/transactions/advanced" + ] + }, + "cosmjs/v0.38.x/concepts/transports/overview", + "cosmjs/v0.38.x/concepts/errors/overview", + "cosmjs/v0.38.x/concepts/evm/overview" + ] + } + ] + } ] } ] diff --git a/sdk/v0.50/user/run-node/interact-node.mdx b/sdk/v0.50/user/run-node/interact-node.mdx index d01bb8c70..63ace4688 100644 --- a/sdk/v0.50/user/run-node/interact-node.mdx +++ b/sdk/v0.50/user/run-node/interact-node.mdx @@ -256,7 +256,7 @@ func main() { ### CosmJS -CosmJS is the official JavaScript/TypeScript client library for Cosmos SDK chains. See the dedicated [CosmJS guide](/cosmjs/getting-started) for setup, querying, and transaction examples. +CosmJS is the official JavaScript/TypeScript client library for Cosmos SDK chains. See the dedicated [CosmJS guide](/cosmjs/v0.38.x/quick-start) for setup, querying, and transaction examples. ## Using the REST Endpoints diff --git a/sdk/v0.50/user/run-node/txs.mdx b/sdk/v0.50/user/run-node/txs.mdx index f39b76689..dfeddc61e 100644 --- a/sdk/v0.50/user/run-node/txs.mdx +++ b/sdk/v0.50/user/run-node/txs.mdx @@ -499,4 +499,4 @@ curl -X POST \ ## Using CosmJS (JavaScript & TypeScript) -CosmJS is the official JavaScript/TypeScript client library for generating, signing, and broadcasting transactions on Cosmos SDK chains. See the dedicated [CosmJS guide](/cosmjs/getting-started) for full setup and usage examples. +CosmJS is the official JavaScript/TypeScript client library for generating, signing, and broadcasting transactions on Cosmos SDK chains. See the dedicated [CosmJS guide](/cosmjs/v0.38.x/quick-start) for full setup and usage examples. From f445b882897a63a73190e41e92ba956e6b20189f Mon Sep 17 00:00:00 2001 From: Nur Fikri Date: Wed, 11 Mar 2026 00:54:32 +0700 Subject: [PATCH 04/17] feat: finished all concepts sections --- .../cosmos-evm/address-derivation.mdx | 33 +++++ .../concepts/cosmos-evm/full-example.mdx | 32 +++++ .../concepts/cosmos-evm/key-differences.mdx | 40 ++++++ .../v0.38.x/concepts/cosmos-evm/packages.mdx | 45 ++++++ .../v0.38.x/concepts/cosmos-evm/querying.mdx | 18 +++ .../concepts/cosmos-evm/signing-client.mdx | 31 ++++ .../v0.38.x/concepts/cosmos-evm/signing.mdx | 83 +++++++++++ .../v0.38.x/concepts/cosmos-evm/wallets.mdx | 58 ++++++++ cosmjs/v0.38.x/concepts/errors/encoding.mdx | 63 +++++++++ .../v0.38.x/concepts/errors/error-classes.mdx | 95 +++++++++++++ .../concepts/errors/error-handling.mdx | 64 +++++++++ .../concepts/errors/gas-estimation.mdx | 31 ++++ cosmjs/v0.38.x/concepts/errors/ledger.mdx | 14 ++ cosmjs/v0.38.x/concepts/errors/overview.mdx | 4 - cosmjs/v0.38.x/concepts/errors/queries.mdx | 37 +++++ .../concepts/errors/signing-wallet.mdx | 87 ++++++++++++ .../concepts/errors/transaction-execution.mdx | 59 ++++++++ cosmjs/v0.38.x/concepts/errors/transport.mdx | 97 +++++++++++++ cosmjs/v0.38.x/concepts/evm/overview.mdx | 4 - cosmjs/v0.38.x/concepts/transports/http.mdx | 132 ++++++++++++++++++ .../concepts/transports/json-rpc-streams.mdx | 38 +++++ .../v0.38.x/concepts/transports/overview.mdx | 4 - .../concepts/transports/rpc-client.mdx | 106 ++++++++++++++ .../v0.38.x/concepts/transports/timeouts.mdx | 50 +++++++ .../v0.38.x/concepts/transports/websocket.mdx | 131 +++++++++++++++++ docs.json | 42 +++++- 26 files changed, 1382 insertions(+), 16 deletions(-) create mode 100644 cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation.mdx create mode 100644 cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx create mode 100644 cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx create mode 100644 cosmjs/v0.38.x/concepts/cosmos-evm/packages.mdx create mode 100644 cosmjs/v0.38.x/concepts/cosmos-evm/querying.mdx create mode 100644 cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx create mode 100644 cosmjs/v0.38.x/concepts/cosmos-evm/signing.mdx create mode 100644 cosmjs/v0.38.x/concepts/cosmos-evm/wallets.mdx create mode 100644 cosmjs/v0.38.x/concepts/errors/encoding.mdx create mode 100644 cosmjs/v0.38.x/concepts/errors/error-classes.mdx create mode 100644 cosmjs/v0.38.x/concepts/errors/error-handling.mdx create mode 100644 cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx create mode 100644 cosmjs/v0.38.x/concepts/errors/ledger.mdx delete mode 100644 cosmjs/v0.38.x/concepts/errors/overview.mdx create mode 100644 cosmjs/v0.38.x/concepts/errors/queries.mdx create mode 100644 cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx create mode 100644 cosmjs/v0.38.x/concepts/errors/transaction-execution.mdx create mode 100644 cosmjs/v0.38.x/concepts/errors/transport.mdx delete mode 100644 cosmjs/v0.38.x/concepts/evm/overview.mdx create mode 100644 cosmjs/v0.38.x/concepts/transports/http.mdx create mode 100644 cosmjs/v0.38.x/concepts/transports/json-rpc-streams.mdx delete mode 100644 cosmjs/v0.38.x/concepts/transports/overview.mdx create mode 100644 cosmjs/v0.38.x/concepts/transports/rpc-client.mdx create mode 100644 cosmjs/v0.38.x/concepts/transports/timeouts.mdx create mode 100644 cosmjs/v0.38.x/concepts/transports/websocket.mdx diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation.mdx new file mode 100644 index 000000000..a5f15f224 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation.mdx @@ -0,0 +1,33 @@ +--- +title: Address Derivation +description: How EVM address derivation differs from standard Cosmos in CosmJS. +--- + +Standard Cosmos and EVM chains both start from a compressed secp256k1 public key +but diverge in how they compute the 20-byte raw address. + +**Standard Cosmos** (`rawSecp256k1PubkeyToRawAddress`): + +``` +compressed_pubkey (33 bytes) + → sha256(compressed_pubkey) + → ripemd160(hash) + → 20-byte raw address + → bech32 encode with prefix +``` + +**EVM** (`rawEthSecp256k1PubkeyToRawAddress`): + +``` +compressed_pubkey (33 bytes) + → decompress to uncompressed (65 bytes) + → strip the 0x04 prefix byte (64 bytes) + → keccak256(64 bytes) + → take last 20 bytes + → bech32 encode with prefix +``` + +The raw address derivation matches Ethereum's `address = keccak256(pubkey)[12:]` +convention. Despite producing Ethereum-compatible addresses, CosmJS wraps them in +Bech32 encoding (e.g. `cosmos1...`) — not the `0x`-prefixed hex format used by +Ethereum wallets. diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx new file mode 100644 index 000000000..b7ae24c43 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx @@ -0,0 +1,32 @@ +--- +title: Full Example +description: End-to-end example of using CosmJS with an EVM-compatible Cosmos chain. +--- + +```typescript +import { DirectEthSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { SigningStargateClient, GasPrice, calculateFee } from "@cosmjs/stargate"; + +const mnemonic = + "copper push brief egg scan entry inform record adjust fossil boss egg " + + "comic alien upon aspect dry avoid interest fury window hint race symptom"; + +const wallet = await DirectEthSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: "cosmos", +}); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningStargateClient.connectWithSigner( + "http://localhost:26661", + wallet, + { gasPrice: GasPrice.fromString("0.025atest") }, +); + +const recipient = "cosmos1recipient..."; +const amount = [{ denom: "atest", amount: "1000000000000000000" }]; + +const result = await client.sendTokens(address, recipient, amount, "auto"); +console.info("Transaction hash:", result.transactionHash); + +client.disconnect(); +``` diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx new file mode 100644 index 000000000..ef42f145e --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx @@ -0,0 +1,40 @@ +--- +title: Key Differences +description: How EVM-compatible Cosmos chains differ from standard Cosmos chains in CosmJS. +--- + +CosmJS supports EVM-compatible Cosmos chains such as those built with +[Cosmos EVM](https://github.com/cosmos/evm) (formerly Ethermint/Evmos). This +section covers how EVM chains differ from standard Cosmos chains and how to use +CosmJS with them. + +## Background + +Standard Cosmos chains use `secp256k1` keys with SHA-256 hashing for address +derivation and transaction signing. EVM-compatible Cosmos chains use the same +elliptic curve (secp256k1), but follow Ethereum conventions for hashing and +address derivation — specifically **Keccak-256** instead of SHA-256/RIPEMD-160. + +This means: + +- The same mnemonic produces **different addresses** on Cosmos vs EVM chains +- Transactions must be hashed with **Keccak-256** before signing +- Public keys use a different **type URL** in protobuf encoding +- The default **HD derivation path** uses coin type 60 (Ethereum) instead of 118 + (Cosmos) + +## Comparison + +| Aspect | Standard Cosmos | Cosmos EVM | +| ------------------- | ---------------------------------- | ------------------------------------------------ | +| HD path | `m/44'/118'/0'/0/0` | `m/44'/60'/0'/0/0` | +| Address derivation | `ripemd160(sha256(compressed))` | `keccak256(uncompressed[1:]).slice(-20)` | +| Sign doc hash | SHA-256 | Keccak-256 | +| Algo identifier | `"secp256k1"` | `"eth_secp256k1"` or `"ethsecp256k1"` | +| Amino pubkey type | `tendermint/PubKeySecp256k1` | `os/PubKeyEthSecp256k1` | +| Protobuf type URL | `/cosmos.crypto.secp256k1.PubKey` | `/cosmos.evm.crypto.v1.ethsecp256k1.PubKey` | +| Wallet class | `DirectSecp256k1HdWallet` | `DirectEthSecp256k1HdWallet` | +| Single-key wallet | `DirectSecp256k1Wallet` | `DirectEthSecp256k1Wallet` | +| Gas (send) | ~100,000 | ~120,000 | +| Denom decimals | Typically 6 | Typically 18 | +| Amino signing | Supported | Not supported (Direct signing only) | diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/packages.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/packages.mdx new file mode 100644 index 000000000..50d3c2d1d --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/packages.mdx @@ -0,0 +1,45 @@ +--- +title: Packages & Limitations +description: Relevant CosmJS exports for EVM support and known limitations. +--- + +## @cosmjs/amino + +| Export | Purpose | +| ------------------------------------ | ---------------------------------------------------- | +| `EthSecp256k1Pubkey` | Interface for EVM public keys in Amino format | +| `isEthSecp256k1Pubkey()` | Type guard for EVM public keys | +| `rawEthSecp256k1PubkeyToRawAddress()`| Derive raw address from compressed pubkey (Keccak) | +| `encodeEthSecp256k1Pubkey()` | Encode raw pubkey bytes to Amino format | +| `encodeEthSecp256k1Signature()` | Encode pubkey + signature to `StdSignature` | +| `isEthereumSecp256k1Account()` | Check if an account uses EVM keys | +| `getAminoPubkey()` | Auto-select correct pubkey encoding for an account | + +## @cosmjs/proto-signing + +| Export | Purpose | +| -------------------------------- | ---------------------------------------------- | +| `DirectEthSecp256k1HdWallet` | HD wallet with Keccak signing and EVM HD path | +| `DirectEthSecp256k1Wallet` | Single-key wallet with Keccak signing | + +## @cosmjs/crypto + +| Export | Purpose | +| ------------ | ---------------------------------------- | +| `keccak256` | Keccak-256 hash function | +| `Keccak256` | Streaming Keccak-256 hash class | + +## Limitations + +- **No Amino signing for EVM chains.** There is no `Secp256k1HdWallet` + equivalent for EVM keys. Use Direct signing (`DirectEthSecp256k1HdWallet`) + exclusively. +- **No `0x`-prefixed addresses.** CosmJS produces Bech32 addresses for all + chains, including EVM ones. If you need the hex Ethereum address, extract the + raw 20-byte address and hex-encode it yourself. +- **No EVM JSON-RPC.** CosmJS communicates over Tendermint/CometBFT RPC, not + Ethereum's JSON-RPC. For `eth_sendTransaction` or similar calls, use an + Ethereum library like ethers.js or viem alongside CosmJS. +- **No serialization/deserialization for EVM wallets.** Unlike + `DirectSecp256k1HdWallet`, the EVM wallet classes do not support `serialize()` + and `deserialize()` methods for encrypted storage. diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/querying.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/querying.mdx new file mode 100644 index 000000000..87e6b22e5 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/querying.mdx @@ -0,0 +1,18 @@ +--- +title: Querying +description: Read-only queries on EVM-compatible Cosmos chains with CosmJS. +--- + +Read-only queries work identically to standard chains. The account parser in +`StargateClient` automatically handles EVM public key types: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("http://localhost:26661"); + +const account = await client.getAccount("cosmos1..."); +// account.pubkey will have type "os/PubKeyEthSecp256k1" for EVM accounts + +const balance = await client.getBalance("cosmos1...", "atest"); +``` diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx new file mode 100644 index 000000000..bd4c26b03 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx @@ -0,0 +1,31 @@ +--- +title: Signing Client +description: Connecting SigningStargateClient with EVM wallets in CosmJS. +--- + +`SigningStargateClient` works with EVM wallets without any special configuration. +The client inspects the `algo` field from the wallet's `AccountData` and +automatically selects the correct pubkey encoding: + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { DirectEthSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectEthSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: "cosmos", +}); + +const client = await SigningStargateClient.connectWithSigner( + "http://localhost:26661", + wallet, + { gasPrice: GasPrice.fromString("0.025atest") }, +); + +const [{ address }] = await wallet.getAccounts(); +const result = await client.sendTokens( + address, + "cosmos1recipient...", + [{ denom: "atest", amount: "1000000000000000000" }], + "auto", +); +``` diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/signing.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/signing.mdx new file mode 100644 index 000000000..fb9e2e54e --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/signing.mdx @@ -0,0 +1,83 @@ +--- +title: Signing & Key Types +description: How EVM signing, public key types, and algo identifiers work in CosmJS. +--- + +## How Signing Works + +EVM wallets hash the serialized sign document with Keccak-256 before signing, +whereas standard wallets use SHA-256: + +``` +signBytes = SignDoc.encode(signDoc) + +# Standard +hashedMessage = sha256(signBytes) + +# EVM +hashedMessage = keccak256(signBytes) + +signature = secp256k1_sign(hashedMessage, privateKey) +``` + +The actual elliptic curve operation and signature format (64 bytes: `r || s`) are +identical — only the pre-signing hash function differs. + +## Public Key Types + +CosmJS represents public keys in two forms: Amino JSON and Protobuf. EVM chains +use distinct types in each format to signal that the key requires Keccak-based +address derivation. + +**Amino JSON:** + +```typescript +// Standard +{ type: "tendermint/PubKeySecp256k1", value: "" } + +// EVM +{ type: "os/PubKeyEthSecp256k1", value: "" } +``` + +**Protobuf (`Any`):** + +```typescript +// Standard +{ typeUrl: "/cosmos.crypto.secp256k1.PubKey", value: } + +// EVM +{ typeUrl: "/cosmos.evm.crypto.v1.ethsecp256k1.PubKey", value: } +``` + +The underlying key bytes are identical (33-byte compressed secp256k1). The +different type identifiers tell the chain how to derive the address from the key. + +## The Algo Identifier + +The `AccountData.algo` field distinguishes EVM accounts from standard ones. +Two naming conventions exist in the ecosystem: + +- `"eth_secp256k1"` — used by Keplr wallet, CosmJS wallets, and some chains +- `"ethsecp256k1"` — used by Evmos, Cronos, and other EVM-compatible chains + +CosmJS handles both through the `isEthereumSecp256k1Account()` utility: + +```typescript +import { isEthereumSecp256k1Account } from "@cosmjs/amino"; + +const [account] = await wallet.getAccounts(); +if (isEthereumSecp256k1Account(account)) { + // EVM-compatible account +} +``` + +The `getAminoPubkey()` function uses this check to select the correct encoding +automatically. This is what `SigningStargateClient` calls internally when +building transactions: + +```typescript +import { getAminoPubkey } from "@cosmjs/amino"; + +const pubkey = getAminoPubkey(account); +// Returns EthSecp256k1Pubkey or Secp256k1Pubkey based on account.algo +``` diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/wallets.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/wallets.mdx new file mode 100644 index 000000000..bf2692adb --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/wallets.mdx @@ -0,0 +1,58 @@ +--- +title: Wallets +description: Creating and generating EVM-compatible wallets with CosmJS. +--- + +## Creating a Wallet + +Use `DirectEthSecp256k1HdWallet` for EVM chains. It defaults to the Ethereum HD +path `m/44'/60'/0'/0/0` and uses Keccak-256 for address derivation and signing. + +```typescript +import { DirectEthSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectEthSecp256k1HdWallet.fromMnemonic( + "your mnemonic here ...", + { prefix: "cosmos" }, +); +const [{ address }] = await wallet.getAccounts(); +``` + +For a single private key (no mnemonic), use `DirectEthSecp256k1Wallet`: + +```typescript +import { DirectEthSecp256k1Wallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectEthSecp256k1Wallet.fromKey(privkeyBytes, "cosmos"); +``` + +Both wallets report `algo: "eth_secp256k1"` in their `AccountData`, which tells +the signing client to use EVM-compatible pubkey encoding. + +## Generating a New Wallet + +To generate a fresh mnemonic for an EVM chain: + +```typescript +import { DirectEthSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectEthSecp256k1HdWallet.generate(24, { + prefix: "cosmos", +}); +console.info("Mnemonic:", wallet.mnemonic); + +const [{ address }] = await wallet.getAccounts(); +console.info("Address:", address); +``` + +The default options derive from `m/44'/60'/0'/0/0`. You can customize the HD +path and prefix: + +```typescript +import { stringToPath } from "@cosmjs/crypto"; + +const wallet = await DirectEthSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: "evmos", + hdPaths: [stringToPath("m/44'/60'/0'/0/0")], +}); +``` diff --git a/cosmjs/v0.38.x/concepts/errors/encoding.mdx b/cosmjs/v0.38.x/concepts/errors/encoding.mdx new file mode 100644 index 000000000..f8cbacd05 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/encoding.mdx @@ -0,0 +1,63 @@ +--- +title: Encoding Errors +description: Protobuf registry, Bech32, hex, Base64, and public key encoding errors. +--- + +## Registry (Protobuf) + +Thrown when encoding or decoding a message whose type URL is not registered: + +``` +"Unregistered type url: /my.custom.MsgCustom" +``` + +Fix: register the type before use: + +```typescript +import { Registry, defaultRegistryTypes } from "@cosmjs/proto-signing"; + +const registry = new Registry(defaultRegistryTypes); +registry.register("/my.custom.MsgCustom", MsgCustom); +``` + +Also thrown for malformed `Any` values: + +``` +"Missing type_url in Any" +"Missing value in Any" +``` + +## Bech32 + +Thrown by `fromBech32` for invalid addresses: + +``` +"No bech32 separator found" // String has no '1' separator +"invalid checksum" // Corrupted or wrong address +"must be lowercase or uppercase" // Mixed case +"length X exceeds limit Y" // Address too long +``` + +## Hex + +``` +"hex string length must be a multiple of 2" +"hex string contains invalid characters" +``` + +## Base64 + +``` +"Invalid base64 string format" +``` + +## Pubkey Type + +Thrown when an unrecognized public key type is encountered during +encoding/decoding: + +``` +"Unsupported pubkey type" +"Pubkey type_url '...' not recognized as single public key type" +"Pubkey type URL '...' not recognized" +``` diff --git a/cosmjs/v0.38.x/concepts/errors/error-classes.mdx b/cosmjs/v0.38.x/concepts/errors/error-classes.mdx new file mode 100644 index 000000000..43ed018a4 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/error-classes.mdx @@ -0,0 +1,95 @@ +--- +title: Error Classes +description: Dedicated error classes for the broadcast and execution lifecycle in CosmJS. +--- + +CosmJS surfaces errors at every stage of a transaction's lifecycle — from +building and signing through broadcasting and on-chain execution. + +```mermaid +flowchart LR + A["Encoding / Building"] --> B["Signing"] --> C["Broadcast (Submit)"] --> D["CheckTx (Mempool)"] --> E["DeliverTx (Execute)"] +``` + +| Stage | Error source | +| --- | --- | +| Encoding / Building | Registry & encoding errors | +| Signing | Key & wallet errors | +| Broadcast (Submit) | Transport errors | +| CheckTx (Mempool) | `BroadcastTxError` | +| DeliverTx (Execute) | Execution errors | + +CosmJS defines two dedicated error classes for the broadcast/execution lifecycle. +All other errors are thrown as plain `Error` instances with descriptive messages. + +## `TimeoutError` + +Thrown when a transaction is successfully submitted to the node but is not +included in a block before the timeout expires (default: 60 seconds). The +transaction may still succeed later. + +```typescript +import { TimeoutError } from "@cosmjs/stargate"; + +class TimeoutError extends Error { + public readonly txId: string; +} +``` + +The `txId` property lets you query the transaction later: + +```typescript +try { + const result = await client.broadcastTx(txBytes); +} catch (error) { + if (error instanceof TimeoutError) { + // Transaction was submitted — check later + const tx = await client.getTx(error.txId); + } +} +``` + +You can increase the timeout when broadcasting: + +```typescript +const result = await client.broadcastTx(txBytes, 120_000); // 120 seconds +``` + +Or set it globally via client options: + +```typescript +const client = await SigningStargateClient.connectWithSigner(endpoint, signer, { + broadcastTimeoutMs: 120_000, + broadcastPollIntervalMs: 5_000, +}); +``` + +## `BroadcastTxError` + +Thrown when the node rejects a transaction during **CheckTx** — before the +transaction enters the mempool. This is a definitive rejection; the transaction +will not be included in a block. + +```typescript +import { BroadcastTxError } from "@cosmjs/stargate"; + +class BroadcastTxError extends Error { + public readonly code: number; + public readonly codespace: string; + public readonly log: string | undefined; +} +``` + +Common causes include invalid addresses, insufficient fees, badly formed +messages, and sequence mismatches: + +```typescript +try { + const result = await client.signAndBroadcast(address, messages, fee); +} catch (error) { + if (error instanceof BroadcastTxError) { + console.error(`Rejected (code ${error.code}, codespace: ${error.codespace})`); + console.error("Log:", error.log); + } +} +``` diff --git a/cosmjs/v0.38.x/concepts/errors/error-handling.mdx b/cosmjs/v0.38.x/concepts/errors/error-handling.mdx new file mode 100644 index 000000000..f014b7c4d --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/error-handling.mdx @@ -0,0 +1,64 @@ +--- +title: Error Handling Pattern +description: Recommended pattern for handling all transaction failure modes in CosmJS. +--- + +A robust transaction flow should handle all three failure modes — CheckTx +rejection, timeout, and execution failure: + +```typescript +import { + SigningStargateClient, + GasPrice, + TimeoutError, + BroadcastTxError, + isDeliverTxSuccess, +} from "@cosmjs/stargate"; + +async function sendTokens( + client: SigningStargateClient, + sender: string, + recipient: string, + amount: readonly Coin[], +): Promise { + try { + const result = await client.sendTokens(sender, recipient, amount, "auto"); + + if (isDeliverTxSuccess(result)) { + return result.transactionHash; + } + + // Execution failed (out of gas, insufficient funds, etc.) + throw new Error( + `Transaction ${result.transactionHash} failed with code ${result.code}: ${result.rawLog}`, + ); + } catch (error) { + if (error instanceof BroadcastTxError) { + // CheckTx rejection — do not retry without fixing the issue + throw error; + } + + if (error instanceof TimeoutError) { + // Transaction may still succeed — query later + console.warn("Transaction submitted but not yet confirmed:", error.txId); + throw error; + } + + throw error; + } +} +``` + +## Error Summary + +| Stage | Error type | Retryable? | Key fields | +| --- | --- | --- | --- | +| Encoding | `Error` | No | Fix input data | +| Signing | `Error` | No | Fix wallet/key setup | +| Transport (HTTP) | `Error` | Often | `cause.status`, `cause.body` | +| Transport (WebSocket) | `Error` | Reconnects automatically | — | +| CheckTx | `BroadcastTxError` | Rarely | `code`, `codespace`, `log` | +| Block inclusion | `TimeoutError` | Query later | `txId` | +| DeliverTx | `DeliverTxResponse` | Depends | `code`, `rawLog`, `events` | +| Query | `Error` | Depends | Error message | +| Simulation | `Error` | Fix input | Error message | diff --git a/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx b/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx new file mode 100644 index 000000000..5732b824d --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx @@ -0,0 +1,31 @@ +--- +title: Gas Estimation Errors +description: Errors from gas price configuration and transaction simulation. +--- + +## Missing Gas Price + +Thrown when using `"auto"` fee without setting a gas price: + +``` +"Gas price must be set in the client options when auto gas is used." +``` + +Fix: pass `gasPrice` when creating the signing client: + +```typescript +const client = await SigningStargateClient.connectWithSigner(endpoint, signer, { + gasPrice: GasPrice.fromString("0.025uatom"), +}); +``` + +## Simulation Failure + +`simulate` throws if the signer address is not found in the wallet: + +``` +"Failed to retrieve account from signer" +``` + +If the simulation itself fails (e.g. message validation errors), the underlying +gRPC error propagates. diff --git a/cosmjs/v0.38.x/concepts/errors/ledger.mdx b/cosmjs/v0.38.x/concepts/errors/ledger.mdx new file mode 100644 index 000000000..59ff64d80 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/ledger.mdx @@ -0,0 +1,14 @@ +--- +title: Ledger Errors +description: Errors from Ledger hardware wallet interactions via @cosmjs/ledger-amino. +--- + +The `@cosmjs/ledger-amino` package throws specific errors for device +interactions: + +| Error | Cause | +| --- | --- | +| `"Please open the Cosmos Ledger app on your Ledger device."` | Dashboard is open instead of Cosmos app | +| `"Please close ... and open the Cosmos Ledger app..."` | Wrong app is open | +| `"Outdated version: Please update ... Ledger App..."` | Ledger app needs a firmware update | +| `"DANGER: The ... Ledger app is in test mode..."` | Test mode enabled on mainnet | diff --git a/cosmjs/v0.38.x/concepts/errors/overview.mdx b/cosmjs/v0.38.x/concepts/errors/overview.mdx deleted file mode 100644 index 310643080..000000000 --- a/cosmjs/v0.38.x/concepts/errors/overview.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Errors -description: Error handling patterns in CosmJS ---- diff --git a/cosmjs/v0.38.x/concepts/errors/queries.mdx b/cosmjs/v0.38.x/concepts/errors/queries.mdx new file mode 100644 index 000000000..66eb1d322 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/queries.mdx @@ -0,0 +1,37 @@ +--- +title: Query Errors +description: Errors from account lookups, ABCI queries, and CosmWasm smart queries. +--- + +## Account / Resource Not Found + +Methods like `getAccount`, `getContract`, and `getDelegation` catch "not found" +gRPC errors internally and return `null` instead of throwing: + +```typescript +const account = await client.getAccount("cosmos1nonexistent..."); +// Returns null, does not throw +``` + +However, `getSequence` throws if the account does not exist because a sequence +number is always required for signing: + +``` +"Account 'cosmos1...' does not exist on chain. Send some tokens there before trying to query sequence." +``` + +## ABCI Query Failure + +Low-level query failures throw with the code and log from the node: + +``` +"Query failed with (6): unknown request" +``` + +## CosmWasm Query Errors + +``` +"No contract found at address \"cosmos1...\"" +"Could not UTF-8 decode smart query response from contract: ..." +"Could not JSON parse smart query response from contract: ..." +``` diff --git a/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx b/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx new file mode 100644 index 000000000..b2867ad44 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx @@ -0,0 +1,87 @@ +--- +title: Signing & Wallet Errors +description: Errors from key management, mnemonic handling, HD derivation, and signing operations. +--- + +## Address Not Found in Wallet + +Every wallet implementation throws this error when asked to sign for an address +it does not hold: + +``` +"Address cosmos1abc... not found in wallet" +``` + +This applies to `Secp256k1HdWallet`, `DirectSecp256k1HdWallet`, +`Secp256k1Wallet`, `DirectSecp256k1Wallet`, and the Ledger signer. + +Fix: only sign for addresses returned by `wallet.getAccounts()`. + +## Invalid Mnemonic + +Thrown by `EnglishMnemonic` (and by extension all `fromMnemonic` factory methods) +when the BIP-39 mnemonic is invalid — wrong word count, unknown words, or bad +checksum: + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +try { + const wallet = await DirectSecp256k1HdWallet.fromMnemonic("invalid words here"); +} catch (error) { + // Error from @scure/bip39: "invalid mnemonic" +} +``` + +## HD Derivation Path Errors + +Thrown by `Slip10` when the derivation path is malformed: + +| Error | Cause | +| --- | --- | +| `"Path string must start with 'm'"` | Missing `m` prefix | +| `"Syntax error while reading path component"` | Malformed path segment | +| `"Component value too high. Must not exceed 2**31-1."` | Index out of BIP-32 range | +| `"Normal keys are not allowed with ed25519"` | Ed25519 requires hardened indices | + +## Invalid Key Errors + +``` +"input data is not a valid secp256k1 private key" // Wrong length or invalid key bytes +"Invalid pubkey length" // Expected 33 (compressed) or 65 (uncompressed) +"Signature must be 64 bytes long." // r + s must be exactly 64 bytes +``` + +## Account Sequence Mismatch + +Not a CosmJS-specific error, but a common chain-level rejection. When the +sequence number in the signed transaction does not match the account's current +sequence on-chain, the node rejects it during CheckTx: + +``` +BroadcastTxError: Broadcasting transaction failed with code 32 (codespace: sdk). +Log: account sequence mismatch, expected 42, got 41 +``` + +Fix: re-query the account sequence before signing, or avoid concurrent +transactions from the same account. + +## Encryption / Decryption Errors + +Wallet serialization uses XChaCha20-Poly1305 encryption. Deserialization throws +when the password is wrong or the data is corrupted: + +```typescript +try { + const wallet = await DirectSecp256k1HdWallet.deserialize(serialized, "wrong-password"); +} catch (error) { + // Decryption failure from @noble/ciphers +} +``` + +The only supported algorithm is `xchacha20poly1305-ietf`. Using anything else +throws: + +``` +"Unsupported encryption algorithm: '...'" +``` diff --git a/cosmjs/v0.38.x/concepts/errors/transaction-execution.mdx b/cosmjs/v0.38.x/concepts/errors/transaction-execution.mdx new file mode 100644 index 000000000..e1036546c --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/transaction-execution.mdx @@ -0,0 +1,59 @@ +--- +title: Transaction Execution Errors +description: Handling transaction execution failures from DeliverTx responses. +--- + +When a transaction is included in a block but execution fails (e.g. out of gas, +insufficient funds, contract panic), `broadcastTx` does **not** throw. Instead +it returns a `DeliverTxResponse` with a non-zero `code`. + +## Checking Success or Failure + +```typescript +import { + isDeliverTxSuccess, + isDeliverTxFailure, + assertIsDeliverTxSuccess, +} from "@cosmjs/stargate"; + +const result = await client.signAndBroadcast(address, messages, fee); + +if (isDeliverTxSuccess(result)) { + console.info("Success:", result.transactionHash); +} else { + console.error(`Failed with code ${result.code}: ${result.rawLog}`); +} + +// Or throw on failure: +assertIsDeliverTxSuccess(result); +// Throws: "Error when broadcasting tx at height . Code: ; Raw log: " +``` + +## Common Execution Failures + +| Failure | Where it appears | Typical cause | +| --- | --- | --- | +| Out of gas | `result.rawLog` contains "out of gas" | Gas limit too low; increase fee or use `"auto"` | +| Insufficient funds | `result.rawLog` contains "insufficient funds" | Sender balance too low for amount + fee | +| Invalid message | `result.rawLog` describes the validation error | Wrong field values or missing required fields | +| Contract error | `result.rawLog` contains the contract error | CosmWasm contract returned an error | + +CosmJS does not define constants for Cosmos SDK error codes. The `code` and +`codespace` fields are passed through from the node. Inspect `rawLog` (SDK < +0.50) or `events` (SDK 0.50+) for human-readable details. + +## CosmWasm Convenience Methods + +Methods like `upload`, `instantiate`, `execute`, and `migrate` on +`SigningCosmWasmClient` throw a plain `Error` when `isDeliverTxFailure` is true, +instead of returning the `DeliverTxResponse`: + +```typescript +try { + const { contractAddress } = await client.instantiate( + sender, codeId, msg, label, "auto", + ); +} catch (error) { + // "Error when broadcasting tx at height . Code: ; Raw log: " +} +``` diff --git a/cosmjs/v0.38.x/concepts/errors/transport.mdx b/cosmjs/v0.38.x/concepts/errors/transport.mdx new file mode 100644 index 000000000..45b226869 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/transport.mdx @@ -0,0 +1,97 @@ +--- +title: Transport Errors +description: HTTP, WebSocket, and JSON-RPC errors between CosmJS and RPC nodes. +--- + +Transport errors occur between CosmJS and the RPC node. They depend on which +transport you use (HTTP or WebSocket). + +## HTTP Errors + +**Bad status (HTTP >= 400)** + +Thrown by the low-level HTTP layer when the node responds with a non-2xx status. +The `cause` property carries the status code and response body: + +```typescript +try { + const client = await StargateClient.connect("https://rpc.example.com"); +} catch (error) { + // "Bad status on response: 429" + const { status, body } = (error as Error).cause as { status: number; body: string }; +} +``` + +Common status codes: + +| Status | Meaning | Action | +| --- | --- | --- | +| 401 / 403 | Authentication required | Add auth headers via `HttpEndpoint` | +| 404 | Wrong URL or path | Verify the RPC endpoint URL | +| 429 | Rate limited | Back off and retry; use multiple endpoints | +| 502 / 503 / 504 | Server error / gateway timeout | Retry with exponential backoff | + +**Request timeout (AbortError)** + +When an HTTP client is configured with a timeout, requests that exceed it throw a +`DOMException` with `name === "AbortError"`: + +```typescript +import { HttpClient } from "@cosmjs/tendermint-rpc"; + +const httpClient = new HttpClient("https://rpc.example.com", 10_000); // 10s timeout +``` + +**Invalid URL** + +Thrown immediately if the endpoint URL is missing a protocol: + +``` +"Endpoint URL is missing a protocol. Expected 'https://' or 'http://'." +``` + +## WebSocket Errors + +**Connection timeout** + +Thrown when the WebSocket handshake does not complete within the timeout +(default: 10 seconds): + +``` +"Connection attempt timed out after 10000 ms" +``` + +**Socket closed** + +Thrown when sending on a closed or not-yet-open socket: + +``` +"Socket was closed, so no data can be sent anymore." +"Websocket is not open" +``` + +**Invalid URL** + +``` +"Base URL is missing a protocol. Expected 'ws://' or 'wss://'." +``` + +## JSON-RPC Errors + +When the node returns a JSON-RPC error response, CosmJS throws an `Error` whose +message is the serialized error object. Standard JSON-RPC error codes: + +| Code | Meaning | +| --- | --- | +| -32700 | Parse error | +| -32600 | Invalid request | +| -32601 | Method not found | +| -32602 | Invalid params | +| -32603 | Internal error | +| -32000 | Server error (custom) | + +## Reconnection + +`WebsocketClient` uses `ReconnectingSocket` internally with exponential backoff +(100ms to 5s). HTTP clients do **not** retry automatically — implement retries +in your application if needed. diff --git a/cosmjs/v0.38.x/concepts/evm/overview.mdx b/cosmjs/v0.38.x/concepts/evm/overview.mdx deleted file mode 100644 index 795af262a..000000000 --- a/cosmjs/v0.38.x/concepts/evm/overview.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: EVM -description: Using CosmJS with EVM-compatible Cosmos chains ---- diff --git a/cosmjs/v0.38.x/concepts/transports/http.mdx b/cosmjs/v0.38.x/concepts/transports/http.mdx new file mode 100644 index 000000000..49043ea40 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transports/http.mdx @@ -0,0 +1,132 @@ +--- +title: HTTP Transport +description: Using HttpClient and HttpBatchClient for RPC communication +--- + +## HttpClient + +`HttpClient` is the default transport for `http://` and `https://` endpoints. It +sends one JSON-RPC POST request per `execute()` call using the platform's +`fetch` API. + +### Basic Usage + +```typescript +import { HttpClient } from "@cosmjs/tendermint-rpc"; + +const client = new HttpClient("https://rpc.cosmos.network"); +``` + +### Custom Headers + +Pass an `HttpEndpoint` object to attach headers (e.g. API keys) to every +request: + +```typescript +import { HttpClient, HttpEndpoint } from "@cosmjs/tendermint-rpc"; + +const endpoint: HttpEndpoint = { + url: "https://rpc.cosmos.network", + headers: { + Authorization: "Bearer ", + }, +}; +const client = new HttpClient(endpoint); +``` + +### Timeout + +An optional second argument sets the request timeout in milliseconds. When set, +the underlying `fetch` call uses `AbortSignal.timeout()` to abort if the server +doesn't respond in time: + +```typescript +const client = new HttpClient("https://rpc.cosmos.network", 10_000); +``` + +If omitted, requests have no timeout (they rely on the runtime's default +behavior). + +### How It Works Internally + +1. `execute()` serializes the `JsonRpcRequest` to JSON. +2. A `POST` request is sent via `fetch` with `Content-Type: application/json` + and any custom headers. +3. HTTP status >= 400 throws an error with the status code and response body. +4. The JSON body is parsed with `parseJsonRpcResponse()` from `@cosmjs/json-rpc`. +5. JSON-RPC error responses throw with the error object. +6. `disconnect()` is a no-op — there is no persistent connection to close. + +### Limitations + +- **No subscriptions.** `HttpClient` implements `RpcClient` only, not + `RpcStreamingClient`. You cannot subscribe to events (new blocks, + transactions) over HTTP. +- **No retry logic.** Failed requests throw immediately. Implement retries in + your application if needed. + +## HttpBatchClient + +`HttpBatchClient` groups multiple `execute()` calls into a single +[JSON-RPC batch request](https://www.jsonrpc.org/specification#batch). This +reduces HTTP overhead when you need to make many queries in a short time. + +### Basic Usage + +```typescript +import { HttpBatchClient } from "@cosmjs/tendermint-rpc"; + +const client = new HttpBatchClient("https://rpc.cosmos.network"); +``` + +### Options + +```typescript +interface HttpBatchClientOptions { + dispatchInterval: number; // ms between automatic dispatches (default: 20) + batchSizeLimit: number; // max requests per batch (default: 20) + httpTimeout?: number; // request timeout in ms (default: none) +} +``` + +```typescript +const client = new HttpBatchClient("https://rpc.cosmos.network", { + batchSizeLimit: 10, + dispatchInterval: 50, + httpTimeout: 30_000, +}); +``` + +### How Batching Works + +When you call `execute()`, the request is queued internally. The queue is +flushed (sent as a single HTTP POST) when either condition is met: + +1. The queue reaches `batchSizeLimit` — dispatched immediately. +2. The `dispatchInterval` timer fires — dispatched on the next tick. + +Each request in the batch gets its own Promise. The batch response is an array +of JSON-RPC responses; each is matched to its original request by `id` and the +corresponding Promise is resolved or rejected. + +### When to Use It + +Batching is useful when your application makes many independent queries in rapid +succession — for example, fetching balances for a list of addresses or querying +multiple contract states. Instead of N separate HTTP round-trips, you get one. + +```typescript +import { Comet38Client, HttpBatchClient } from "@cosmjs/tendermint-rpc"; + +const batchClient = new HttpBatchClient("https://rpc.cosmos.network", { + batchSizeLimit: 10, + dispatchInterval: 50, +}); + +const cometClient = await Comet38Client.create(batchClient); +``` + +> **Note:** `connectComet()` and the high-level `StargateClient.connect()` don't +> use batching by default. To enable it, create the batch client manually and +> pass it to the CometBFT client's `create()` method, then pass that to +> `StargateClient.create()`. diff --git a/cosmjs/v0.38.x/concepts/transports/json-rpc-streams.mdx b/cosmjs/v0.38.x/concepts/transports/json-rpc-streams.mdx new file mode 100644 index 000000000..5458d8b41 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transports/json-rpc-streams.mdx @@ -0,0 +1,38 @@ +--- +title: JSON-RPC & Reactive Streams +description: Understanding the JSON-RPC protocol and stream utilities used by CosmJS transports +--- + +## JSON-RPC Protocol + +All transports use the [JSON-RPC 2.0](https://www.jsonrpc.org/specification) +protocol, implemented in `@cosmjs/json-rpc`. The package provides: + +- **Type definitions** — `JsonRpcRequest`, `JsonRpcSuccessResponse`, + `JsonRpcErrorResponse` +- **Parsing** — `parseJsonRpcResponse()` validates and type-guards responses +- **ID generation** — `makeJsonRpcId()` produces incrementing numeric IDs +- **Error codes** — standard JSON-RPC error codes (`parseError`, + `invalidRequest`, `methodNotFound`, etc.) + +You generally don't interact with this package directly — the RPC clients handle +serialization and parsing internally. + +## Reactive Streams + +The `@cosmjs/stream` package provides utilities built on +[xstream](https://github.com/staltz/xstream) for working with event streams: + +| Utility | Description | +|---------|-------------| +| `firstEvent(stream)` | Resolves with the first event from a stream | +| `toListPromise(stream, count)` | Collects `count` events into an array | +| `fromListPromise(promise)` | Creates a stream from a promise of an iterable | +| `concat(...streams)` | Concatenates streams with buffering | +| `dropDuplicates(keyFn)` | Deduplicates stream events by key | +| `ValueAndUpdates` | Synchronous current value + update stream (used for connection status) | +| `DefaultValueProducer` | Producer that holds a current value and emits updates | +| `Reducer` | Reduces a stream into accumulated state | + +These are primarily used internally by the WebSocket transport and subscription +system, but they're available if you need to compose or transform event streams. diff --git a/cosmjs/v0.38.x/concepts/transports/overview.mdx b/cosmjs/v0.38.x/concepts/transports/overview.mdx deleted file mode 100644 index 6b4285ed1..000000000 --- a/cosmjs/v0.38.x/concepts/transports/overview.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Transports -description: Understanding transport layers and RPC connections in CosmJS ---- diff --git a/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx b/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx new file mode 100644 index 000000000..212a81ecf --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx @@ -0,0 +1,106 @@ +--- +title: RPC Client Interface +description: Understanding the transport layer between CosmJS clients and blockchain nodes +--- + +CosmJS communicates with Cosmos SDK chains through +[Tendermint/CometBFT RPC](https://docs.cometbft.com/v1/spec/rpc/). The +transport layer sits between the high-level clients (`StargateClient`, +`CosmWasmClient`) and the blockchain node, handling request encoding, response +parsing, connection management, and event subscriptions. + +```mermaid +flowchart TB + A["StargateClient / CosmWasmClient"] --> B["CometBFT Client\n(Comet38Client, Comet1Client)"] + B --> C["HTTP"] + B --> D["WebSocket"] +``` + +All transports implement the same `RpcClient` interface from +`@cosmjs/tendermint-rpc`, so the upper layers are transport-agnostic. + +## RpcClient & RpcStreamingClient + +Every transport implements at least `RpcClient`: + +```typescript +interface RpcClient { + readonly execute: (request: JsonRpcRequest) => Promise; + readonly disconnect: () => void; +} +``` + +Transports that support event subscriptions additionally implement +`RpcStreamingClient`: + +```typescript +interface RpcStreamingClient extends RpcClient { + readonly listen: (request: JsonRpcRequest) => Stream; +} +``` + +You can check at runtime with `instanceOfRpcStreamingClient(client)`. + +## Automatic Transport Selection + +When you call `StargateClient.connect(endpoint)` or `connectComet(endpoint)`, +the transport is selected based on the URL protocol: + +| Endpoint | Transport | +|----------|-----------| +| `http://...` or `https://...` | `HttpClient` | +| `ws://...` or `wss://...` | `WebsocketClient` | +| `HttpEndpoint` object | `HttpClient` (always) | + +```typescript +// HTTP transport (default for most use cases) +const client = await StargateClient.connect("https://rpc.cosmos.network"); + +// WebSocket transport (needed for subscriptions) +const client = await StargateClient.connect("wss://rpc.cosmos.network"); +``` + +## Manual Transport Configuration + +The automatic `connect()` methods don't expose transport-level options like +timeouts or batching. For full control, construct the RPC client manually and +pass it through the `create()` factory: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { Comet38Client, HttpClient } from "@cosmjs/tendermint-rpc"; + +// HTTP with 15-second timeout +const rpcClient = new HttpClient("https://rpc.cosmos.network", 15_000); +const cometClient = await Comet38Client.create(rpcClient); +const client = StargateClient.create(cometClient); +``` + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { Comet38Client, HttpBatchClient } from "@cosmjs/tendermint-rpc"; + +// Batched HTTP with custom options +const rpcClient = new HttpBatchClient("https://rpc.cosmos.network", { + batchSizeLimit: 10, + dispatchInterval: 50, + httpTimeout: 15_000, +}); +const cometClient = await Comet38Client.create(rpcClient); +const client = StargateClient.create(cometClient); +``` + +> **Tip:** When using manual transport configuration, you need to know the +> CometBFT version of your target chain. Use `Comet38Client` for CometBFT 0.38, +> `Comet1Client` for CometBFT 1.x, or `Tendermint37Client` for Tendermint 0.37. +> If you're not sure, use `connectComet()` for auto-detection — though this +> only accepts an endpoint string or `HttpEndpoint`, not a pre-built RPC client. + +## Package Summary + +| Package | Role | +|---------|------| +| `@cosmjs/tendermint-rpc` | RPC client implementations (`HttpClient`, `HttpBatchClient`, `WebsocketClient`) and CometBFT client wrappers | +| `@cosmjs/json-rpc` | JSON-RPC 2.0 types, parsing, and ID generation | +| `@cosmjs/socket` | WebSocket wrapper with reconnection, queueing, and connection status | +| `@cosmjs/stream` | Reactive stream utilities (xstream-based) | diff --git a/cosmjs/v0.38.x/concepts/transports/timeouts.mdx b/cosmjs/v0.38.x/concepts/transports/timeouts.mdx new file mode 100644 index 000000000..ecb541106 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transports/timeouts.mdx @@ -0,0 +1,50 @@ +--- +title: Timeouts & Error Handling +description: Configuring timeouts, handling errors, and understanding retry behavior +--- + +## HTTP Timeouts + +| Client | Parameter | Default | Mechanism | +|--------|-----------|---------|-----------| +| `HttpClient` | `timeout` (constructor) | None | `AbortSignal.timeout()` on `fetch` | +| `HttpBatchClient` | `httpTimeout` (options) | None | `AbortSignal.timeout()` on `fetch` | + +When a timeout fires, the `fetch` call is aborted and throws an `AbortError`. + +## WebSocket Connection Timeout + +`SocketWrapper` has a 10-second connection timeout by default. If the WebSocket +handshake doesn't complete within this window, the socket is closed and the +connection promise rejects with a timeout error. + +## Broadcast Timeouts + +Separately from transport timeouts, `SigningStargateClient` and +`SigningCosmWasmClient` have broadcast-level timeouts that control how long the +client polls for transaction inclusion: + +```typescript +interface SigningStargateClientOptions { + readonly broadcastTimeoutMs?: number; // default: 60_000 (60s) + readonly broadcastPollIntervalMs?: number; // default: 3_000 (3s) +} +``` + +These are not transport timeouts — they control how long `signAndBroadcast()` +waits for the transaction to appear in a block after it has been submitted. + +## Error Handling + +| Scenario | Error | +|----------|-------| +| HTTP status >= 400 | `Error` with status code and response body | +| JSON-RPC error response | `Error` with serialized JSON-RPC error object | +| Request timeout (HTTP) | `AbortError` from `fetch` | +| Connection timeout (WS) | `Error("Connection attempt timed out after X ms")` | +| WebSocket unclean close | Error propagated through the event stream | + +## No Built-In Retry + +Neither `HttpClient` nor `HttpBatchClient` retry failed requests. If you need +retry logic, implement it in your application or wrap the RPC client. diff --git a/cosmjs/v0.38.x/concepts/transports/websocket.mdx b/cosmjs/v0.38.x/concepts/transports/websocket.mdx new file mode 100644 index 000000000..804bbc6fd --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transports/websocket.mdx @@ -0,0 +1,131 @@ +--- +title: WebSocket Transport +description: Using WebsocketClient for persistent connections and event subscriptions +--- + +`WebsocketClient` uses a persistent WebSocket connection for both request/response +queries and event subscriptions. It is the only transport that supports +`listen()`. + +## Basic Usage + +```typescript +import { WebsocketClient } from "@cosmjs/tendermint-rpc"; + +const client = new WebsocketClient("wss://rpc.cosmos.network"); +``` + +The client automatically appends `/websocket` to the URL (the standard CometBFT +WebSocket endpoint path). + +## Request/Response + +`execute()` sends a JSON-RPC request over the WebSocket and waits for a response +with a matching `id`. This means you can use `WebsocketClient` as a drop-in +replacement for `HttpClient` when you need a persistent connection: + +```typescript +import { Comet38Client, WebsocketClient } from "@cosmjs/tendermint-rpc"; + +const wsClient = new WebsocketClient("wss://rpc.cosmos.network"); +const cometClient = await Comet38Client.create(wsClient); +``` + +## Subscriptions + +The real power of WebSocket is event subscriptions. CometBFT supports +subscribing to events like new blocks and transactions via the `subscribe` +JSON-RPC method. + +`WebsocketClient.listen()` returns a reactive stream (xstream `Stream`) of +`SubscriptionEvent` objects: + +```typescript +interface SubscriptionEvent { + readonly query: string; + readonly data: { + readonly type: string; + readonly value: Record; + }; +} +``` + +### Subscribing via CometBFT Clients + +The CometBFT client classes provide typed subscription helpers: + +```typescript +import { Comet38Client, WebsocketClient } from "@cosmjs/tendermint-rpc"; + +const wsClient = new WebsocketClient("wss://rpc.cosmos.network"); +const cometClient = await Comet38Client.create(wsClient); + +const newBlocks = cometClient.subscribeNewBlock(); +const subscription = newBlocks.subscribe({ + next: (event) => { + console.info("New block:", event.header.height); + }, + error: (err) => console.error(err), + complete: () => console.info("Subscription ended"), +}); + +// Later: clean up +subscription.unsubscribe(); +cometClient.disconnect(); +``` + +Available subscription methods: + +| Method | Events | +|--------|--------| +| `subscribeNewBlock()` | Full block data on each new block | +| `subscribeNewBlockHeader()` | Block header only on each new block | +| `subscribeTx(query?)` | Transactions matching an optional query string | + +### Subscription Lifecycle + +1. `listen()` creates a producer that sends a `subscribe` JSON-RPC request. +2. CometBFT responds with a confirmation, then pushes events with the same + request ID. +3. Events are filtered and emitted on the returned stream. +4. When the stream has no more listeners (all `unsubscribe()`), a + corresponding `unsubscribe` request is sent to the server to free resources. +5. Streams are deduplicated by query string — subscribing to the same query + twice returns the same stream. + +## Reconnection + +`WebsocketClient` uses `ReconnectingSocket` under the hood, which provides +automatic reconnection with exponential backoff. The full socket stack is: + +``` +WebsocketClient + └── ReconnectingSocket ← auto-reconnect with backoff + └── QueueingStreamingSocket ← request queue + connection status + └── StreamingSocket ← events as xstream Stream + └── SocketWrapper ← isomorphic-ws wrapper +``` + +**Reconnection behavior:** + +| Aspect | Behavior | +|--------|----------| +| Initial backoff | 100 ms | +| Backoff growth | Doubles each attempt (100, 200, 400, 800…) | +| Maximum backoff | 5,000 ms (5 seconds) | +| Backoff reset | Resets to 100 ms on successful connection | +| Request queue | Requests made while disconnected are queued and sent on reconnect | +| Subscription recovery | A `reconnectedHandler` callback fires after reconnection | + +## Connection Status + +You can observe connection state changes through `QueueingStreamingSocket`: + +```typescript +enum ConnectionStatus { + Unconnected, // Initial state + Connecting, // Connection attempt in progress + Connected, // WebSocket is open + Disconnected, // Connection lost (reconnection will be attempted) +} +``` diff --git a/docs.json b/docs.json index b9632610e..cd06e5fb2 100644 --- a/docs.json +++ b/docs.json @@ -177,7 +177,7 @@ }, { "label": "Cosmos EVM", - "href": "/evm" + "href": "/evm/v0.5.0/documentation/overview" }, { "label": "IBC", @@ -7067,9 +7067,43 @@ "cosmjs/v0.38.x/concepts/transactions/advanced" ] }, - "cosmjs/v0.38.x/concepts/transports/overview", - "cosmjs/v0.38.x/concepts/errors/overview", - "cosmjs/v0.38.x/concepts/evm/overview" + { + "group": "Transports", + "pages": [ + "cosmjs/v0.38.x/concepts/transports/rpc-client", + "cosmjs/v0.38.x/concepts/transports/http", + "cosmjs/v0.38.x/concepts/transports/websocket", + "cosmjs/v0.38.x/concepts/transports/timeouts", + "cosmjs/v0.38.x/concepts/transports/json-rpc-streams" + ] + }, + { + "group": "Errors", + "pages": [ + "cosmjs/v0.38.x/concepts/errors/error-classes", + "cosmjs/v0.38.x/concepts/errors/transaction-execution", + "cosmjs/v0.38.x/concepts/errors/transport", + "cosmjs/v0.38.x/concepts/errors/signing-wallet", + "cosmjs/v0.38.x/concepts/errors/encoding", + "cosmjs/v0.38.x/concepts/errors/queries", + "cosmjs/v0.38.x/concepts/errors/gas-estimation", + "cosmjs/v0.38.x/concepts/errors/ledger", + "cosmjs/v0.38.x/concepts/errors/error-handling" + ] + }, + { + "group": "Cosmos EVM", + "pages": [ + "cosmjs/v0.38.x/concepts/cosmos-evm/key-differences", + "cosmjs/v0.38.x/concepts/cosmos-evm/wallets", + "cosmjs/v0.38.x/concepts/cosmos-evm/signing-client", + "cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation", + "cosmjs/v0.38.x/concepts/cosmos-evm/signing", + "cosmjs/v0.38.x/concepts/cosmos-evm/querying", + "cosmjs/v0.38.x/concepts/cosmos-evm/packages", + "cosmjs/v0.38.x/concepts/cosmos-evm/full-example" + ] + } ] } ] From b5cf4b1bed3b791a78ce08ca1016efffcef835b4 Mon Sep 17 00:00:00 2001 From: evanorti <87997759+evanorti@users.noreply.github.com> Date: Tue, 10 Mar 2026 16:28:06 -0400 Subject: [PATCH 05/17] Fix injected-wallets: correct getOfflineSignerAuto description and signer variant comments --- cosmjs/v0.38.x/concepts/account/injected-wallets.mdx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx b/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx index 96a7d2324..3cb452695 100644 --- a/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx +++ b/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx @@ -50,15 +50,17 @@ Keplr and similar wallets offer multiple signer variants: // Amino only — broadest compatibility, required for Ledger via Keplr const aminoSigner = window.keplr.getOfflineSignerOnlyAmino(chainId); -// Direct (Protobuf) preferred, falls back to Amino +// Auto (sync) — prefers Direct signing, falls back to Amino const autoSigner = window.keplr.getOfflineSigner(chainId); -// Direct only — most compact encoding, but not all features supported -const directSigner = window.keplr.getOfflineSignerAuto(chainId); +// Auto (async) — same auto-detection as getOfflineSigner, returns Promise +const asyncSigner = await window.keplr.getOfflineSignerAuto(chainId); ``` -For most applications, `getOfflineSigner` (the auto variant) is the right -choice. It lets the wallet pick the best signing mode it supports. +For most applications, `getOfflineSigner` is the right choice. It +synchronously returns a signer that prefers Direct signing and falls back to +Amino based on what the wallet supports. Use `getOfflineSignerAuto` when you +need the async variant (e.g. for wallets that require async initialization). ## Detecting the Extension From 11765faa730dba2bbd01cede5410479d00baed54 Mon Sep 17 00:00:00 2001 From: evanorti <87997759+evanorti@users.noreply.github.com> Date: Tue, 10 Mar 2026 16:35:43 -0400 Subject: [PATCH 06/17] Fix getOfflineSigner description: returns both Direct and Amino signers --- cosmjs/v0.38.x/concepts/account/injected-wallets.mdx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx b/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx index 3cb452695..5520d480d 100644 --- a/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx +++ b/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx @@ -50,17 +50,18 @@ Keplr and similar wallets offer multiple signer variants: // Amino only — broadest compatibility, required for Ledger via Keplr const aminoSigner = window.keplr.getOfflineSignerOnlyAmino(chainId); -// Auto (sync) — prefers Direct signing, falls back to Amino +// Sync — returns both Direct and Amino signers simultaneously const autoSigner = window.keplr.getOfflineSigner(chainId); -// Auto (async) — same auto-detection as getOfflineSigner, returns Promise +// Async — auto-selects Direct for mnemonic accounts, Amino for Ledger accounts const asyncSigner = await window.keplr.getOfflineSignerAuto(chainId); ``` For most applications, `getOfflineSigner` is the right choice. It -synchronously returns a signer that prefers Direct signing and falls back to -Amino based on what the wallet supports. Use `getOfflineSignerAuto` when you -need the async variant (e.g. for wallets that require async initialization). +synchronously returns a signer that implements both `OfflineDirectSigner` and +`OfflineAminoSigner`. Use `getOfflineSignerAuto` when you need async +auto-detection — it returns `Promise` and automatically selects +Amino for Ledger-based accounts. ## Detecting the Extension From a9a552d9c42f8bfd689c040fc2440263e2d8273f Mon Sep 17 00:00:00 2001 From: Nur Fikri Date: Wed, 11 Mar 2026 23:48:02 +0700 Subject: [PATCH 07/17] Update CosmJS v0.38.x documentation: correct package names, update Node.js version requirement, enhance error descriptions, and improve code formatting for clarity. --- .../concepts/account/bech32-addresses.mdx | 2 +- .../concepts/clients/read-only-clients.mdx | 18 +++++++++--------- .../concepts/clients/signing-clients.mdx | 6 +++--- .../concepts/cosmos-evm/address-derivation.mdx | 4 ++-- .../concepts/cosmos-evm/full-example.mdx | 2 ++ .../v0.38.x/concepts/cosmos-evm/packages.mdx | 2 ++ cosmjs/v0.38.x/concepts/cosmos-evm/signing.mdx | 2 +- cosmjs/v0.38.x/concepts/errors/encoding.mdx | 5 ++++- .../v0.38.x/concepts/errors/gas-estimation.mdx | 2 ++ cosmjs/v0.38.x/concepts/errors/queries.mdx | 2 ++ .../v0.38.x/concepts/errors/signing-wallet.mdx | 2 ++ .../messages-encoding/protobuf-encoding.mdx | 2 +- .../concepts/messages-encoding/registry.mdx | 4 ++-- .../transaction-structure.mdx | 4 ++-- cosmjs/v0.38.x/concepts/transports/http.mdx | 9 +++++---- .../concepts/transports/json-rpc-streams.mdx | 2 ++ .../v0.38.x/concepts/transports/rpc-client.mdx | 8 +++----- .../v0.38.x/concepts/transports/websocket.mdx | 2 +- cosmjs/v0.38.x/overview.mdx | 2 +- cosmjs/v0.38.x/quick-start.mdx | 4 +++- 20 files changed, 50 insertions(+), 34 deletions(-) diff --git a/cosmjs/v0.38.x/concepts/account/bech32-addresses.mdx b/cosmjs/v0.38.x/concepts/account/bech32-addresses.mdx index 578a70bbd..d96987868 100644 --- a/cosmjs/v0.38.x/concepts/account/bech32-addresses.mdx +++ b/cosmjs/v0.38.x/concepts/account/bech32-addresses.mdx @@ -8,7 +8,7 @@ encoding for all addresses. A Bech32 address has two parts: a human-readable prefix (HRP) that identifies the chain, and a data section containing the raw address bytes with a checksum. -``` +```text cosmos1qypqxpq9qcrsszg2pvxq6rs0zqg3yyc5lzv7xu ^ ^ | +-- data + checksum (base32 encoded) diff --git a/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx b/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx index 99a91893f..a13d179da 100644 --- a/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx +++ b/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx @@ -8,7 +8,7 @@ Cosmos SDK chains and **CosmWasm** for chains with smart contract support. Each hierarchy has a read-only client for queries and a signing client for transactions. -``` +```text StargateClient (read-only) CosmWasmClient (read-only) │ │ ▼ ▼ @@ -32,8 +32,8 @@ const client = await StargateClient.connect("https://rpc.cosmos.network"); | Method | Description | |--------|-------------| -| `StargateClient.connect(endpoint, options?)` | Connect to an RPC endpoint (auto-detects CometBFT version) | -| `StargateClient.create(cometClient, options?)` | Create from an existing CometBFT client | +| `StargateClient.connect(endpoint, options?)` | Connect to an RPC endpoint (async, auto-detects CometBFT version) | +| `StargateClient.create(cometClient, options?)` | Create from an existing CometBFT client (synchronous) | ### Query Methods @@ -45,11 +45,11 @@ const client = await StargateClient.connect("https://rpc.cosmos.network"); | `getAccount(address)` | `Account \| null` | Account info (number, sequence, pubkey) | | `getSequence(address)` | `SequenceResponse` | Account number and sequence | | `getBalance(address, denom)` | `Coin` | Balance for a single denomination | -| `getAllBalances(address)` | `Coin[]` | All balances for an address | +| `getAllBalances(address)` | `readonly Coin[]` | All balances for an address | | `getBalanceStaked(address)` | `Coin \| null` | Total staked balance | | `getDelegation(delegator, validator)` | `Coin \| null` | Delegation to a specific validator | | `getTx(hash)` | `IndexedTx \| null` | Transaction by hash | -| `searchTx(query)` | `IndexedTx[]` | Search transactions by events | +| `searchTx(query)` | `readonly IndexedTx[]` | Search transactions by events | ```typescript const balance = await client.getBalance("cosmos1...", "uatom"); @@ -80,12 +80,12 @@ const client = await CosmWasmClient.connect("https://rpc.osmosis.zone"); | Method | Returns | Description | |--------|---------|-------------| -| `getCodes()` | `Code[]` | All uploaded code entries | +| `getCodes()` | `readonly Code[]` | All uploaded code entries | | `getCodeDetails(codeId)` | `CodeDetails` | Code metadata and wasm bytecode | -| `getContracts(codeId)` | `string[]` | Contract addresses instantiated from a code ID | -| `getContractsByCreator(creator)` | `string[]` | Contracts created by an address | +| `getContracts(codeId)` | `readonly string[]` | Contract addresses instantiated from a code ID | +| `getContractsByCreator(creator)` | `readonly string[]` | Contracts created by an address | | `getContract(address)` | `Contract` | Contract metadata (code ID, label, creator, admin) | -| `getContractCodeHistory(address)` | `ContractCodeHistoryEntry[]` | Migration history | +| `getContractCodeHistory(address)` | `readonly ContractCodeHistoryEntry[]` | Migration history | | `queryContractRaw(address, key)` | `Uint8Array \| null` | Raw key-value store lookup | | `queryContractSmart(address, queryMsg)` | `JsonObject` | Execute a read-only smart query | diff --git a/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx index 7b94d9003..c2f5c2671 100644 --- a/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx +++ b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx @@ -53,9 +53,9 @@ const client = await SigningStargateClient.connectWithSigner( | Method | Description | |--------|-------------| -| `signAndBroadcast(address, messages, fee, memo?)` | Sign, broadcast, and wait for inclusion | -| `signAndBroadcastSync(address, messages, fee, memo?)` | Sign and broadcast, return tx hash immediately | -| `sign(address, messages, fee, memo, signerData?)` | Sign without broadcasting (returns `TxRaw`) | +| `signAndBroadcast(address, messages, fee, memo?, timeoutHeight?)` | Sign, broadcast, and wait for inclusion | +| `signAndBroadcastSync(address, messages, fee, memo?, timeoutHeight?)` | Sign and broadcast, return tx hash immediately | +| `sign(address, messages, fee, memo, signerData?, timeoutHeight?)` | Sign without broadcasting (returns `TxRaw`) | | `simulate(address, messages, memo?)` | Estimate gas for a transaction | ### Convenience Methods diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation.mdx index a5f15f224..7bedf7520 100644 --- a/cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation.mdx +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation.mdx @@ -8,7 +8,7 @@ but diverge in how they compute the 20-byte raw address. **Standard Cosmos** (`rawSecp256k1PubkeyToRawAddress`): -``` +```text compressed_pubkey (33 bytes) → sha256(compressed_pubkey) → ripemd160(hash) @@ -18,7 +18,7 @@ compressed_pubkey (33 bytes) **EVM** (`rawEthSecp256k1PubkeyToRawAddress`): -``` +```text compressed_pubkey (33 bytes) → decompress to uncompressed (65 bytes) → strip the 0x04 prefix byte (64 bytes) diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx index b7ae24c43..874fcd9cb 100644 --- a/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx @@ -3,6 +3,8 @@ title: Full Example description: End-to-end example of using CosmJS with an EVM-compatible Cosmos chain. --- +This end-to-end example creates an EVM-compatible wallet, connects to a Cosmos EVM chain, and sends a token transfer using CosmJS. + ```typescript import { DirectEthSecp256k1HdWallet } from "@cosmjs/proto-signing"; import { SigningStargateClient, GasPrice, calculateFee } from "@cosmjs/stargate"; diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/packages.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/packages.mdx index 50d3c2d1d..e83e27cc6 100644 --- a/cosmjs/v0.38.x/concepts/cosmos-evm/packages.mdx +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/packages.mdx @@ -3,6 +3,8 @@ title: Packages & Limitations description: Relevant CosmJS exports for EVM support and known limitations. --- +CosmJS EVM support is spread across three packages. Below are the relevant exports and the known limitations when working with EVM-compatible Cosmos chains. + ## @cosmjs/amino | Export | Purpose | diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/signing.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/signing.mdx index fb9e2e54e..cac5911b5 100644 --- a/cosmjs/v0.38.x/concepts/cosmos-evm/signing.mdx +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/signing.mdx @@ -8,7 +8,7 @@ description: How EVM signing, public key types, and algo identifiers work in Cos EVM wallets hash the serialized sign document with Keccak-256 before signing, whereas standard wallets use SHA-256: -``` +```text signBytes = SignDoc.encode(signDoc) # Standard diff --git a/cosmjs/v0.38.x/concepts/errors/encoding.mdx b/cosmjs/v0.38.x/concepts/errors/encoding.mdx index f8cbacd05..f9d340635 100644 --- a/cosmjs/v0.38.x/concepts/errors/encoding.mdx +++ b/cosmjs/v0.38.x/concepts/errors/encoding.mdx @@ -3,6 +3,8 @@ title: Encoding Errors description: Protobuf registry, Bech32, hex, Base64, and public key encoding errors. --- +These errors occur when encoding or decoding data — Protobuf messages, Bech32 addresses, hex strings, Base64, and public keys. Most are caused by missing type registrations or malformed input. + ## Registry (Protobuf) Thrown when encoding or decoding a message whose type URL is not registered: @@ -14,7 +16,8 @@ Thrown when encoding or decoding a message whose type URL is not registered: Fix: register the type before use: ```typescript -import { Registry, defaultRegistryTypes } from "@cosmjs/proto-signing"; +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes } from "@cosmjs/stargate"; const registry = new Registry(defaultRegistryTypes); registry.register("/my.custom.MsgCustom", MsgCustom); diff --git a/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx b/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx index 5732b824d..3239fa042 100644 --- a/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx +++ b/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx @@ -3,6 +3,8 @@ title: Gas Estimation Errors description: Errors from gas price configuration and transaction simulation. --- +These errors occur when gas pricing is misconfigured or when transaction simulation fails. They are most commonly encountered when using `"auto"` fee estimation. + ## Missing Gas Price Thrown when using `"auto"` fee without setting a gas price: diff --git a/cosmjs/v0.38.x/concepts/errors/queries.mdx b/cosmjs/v0.38.x/concepts/errors/queries.mdx index 66eb1d322..4890e0abc 100644 --- a/cosmjs/v0.38.x/concepts/errors/queries.mdx +++ b/cosmjs/v0.38.x/concepts/errors/queries.mdx @@ -3,6 +3,8 @@ title: Query Errors description: Errors from account lookups, ABCI queries, and CosmWasm smart queries. --- +These errors occur when querying accounts, contracts, or other on-chain resources. CosmJS handles many "not found" cases gracefully by returning `null`, but some queries throw when a value is required. + ## Account / Resource Not Found Methods like `getAccount`, `getContract`, and `getDelegation` catch "not found" diff --git a/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx b/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx index b2867ad44..ec6343c4b 100644 --- a/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx +++ b/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx @@ -3,6 +3,8 @@ title: Signing & Wallet Errors description: Errors from key management, mnemonic handling, HD derivation, and signing operations. --- +These errors occur during key management, mnemonic handling, HD derivation, wallet encryption, and signing operations. They help diagnose issues with wallet setup and transaction signing. + ## Address Not Found in Wallet Every wallet implementation throws this error when asked to sign for an address diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx index c3b19d567..23da91e1d 100644 --- a/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx +++ b/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx @@ -15,7 +15,7 @@ interface SignDoc { bodyBytes: Uint8Array; // encoded TxBody authInfoBytes: Uint8Array; // encoded AuthInfo chainId: string; - accountNumber: number; + accountNumber: bigint; } ``` diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx index 87d44c32c..4b9097883 100644 --- a/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx +++ b/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx @@ -10,7 +10,7 @@ knows how to encode and decode Protobuf messages by type URL. When you call ## How It Works -``` +```text EncodeObject google.protobuf.Any +--------------------+ +------------------------+ | typeUrl: string | Registry | typeUrl: string | @@ -93,7 +93,7 @@ const client = await SigningStargateClient.connectWithSigner(endpoint, wallet, { When you call `signAndBroadcast`, this is what happens to your messages: -``` +```text EncodeObject[] | v registry.encodeAsAny(msg) for each diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure.mdx index d93de1d31..367793654 100644 --- a/cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure.mdx +++ b/cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure.mdx @@ -5,7 +5,7 @@ description: How Cosmos transactions are structured and how message type URLs wo A Cosmos transaction is a Protobuf-encoded envelope containing three parts: -``` +```text +--------------------------------------------------+ | TxRaw | +-----------------+------------------+--------------+ @@ -39,7 +39,7 @@ Every Cosmos SDK message has a unique identifier called a **type URL**. It follows the Protobuf `Any` convention: a leading `/` followed by the fully qualified Protobuf type name. -``` +```text /cosmos.bank.v1beta1.MsgSend ^ ^ | +-- message name diff --git a/cosmjs/v0.38.x/concepts/transports/http.mdx b/cosmjs/v0.38.x/concepts/transports/http.mdx index 49043ea40..4335129e0 100644 --- a/cosmjs/v0.38.x/concepts/transports/http.mdx +++ b/cosmjs/v0.38.x/concepts/transports/http.mdx @@ -3,6 +3,8 @@ title: HTTP Transport description: Using HttpClient and HttpBatchClient for RPC communication --- +CosmJS provides two HTTP-based transports for communicating with CometBFT RPC nodes: `HttpClient` for single requests and `HttpBatchClient` for batching multiple queries into one round-trip. + ## HttpClient `HttpClient` is the default transport for `http://` and `https://` endpoints. It @@ -126,7 +128,6 @@ const batchClient = new HttpBatchClient("https://rpc.cosmos.network", { const cometClient = await Comet38Client.create(batchClient); ``` -> **Note:** `connectComet()` and the high-level `StargateClient.connect()` don't -> use batching by default. To enable it, create the batch client manually and -> pass it to the CometBFT client's `create()` method, then pass that to -> `StargateClient.create()`. + +`connectComet()` and the high-level `StargateClient.connect()` don't use batching by default. To enable it, create the batch client manually and pass it to the CometBFT client's `create()` method, then pass that to `StargateClient.create()`. + diff --git a/cosmjs/v0.38.x/concepts/transports/json-rpc-streams.mdx b/cosmjs/v0.38.x/concepts/transports/json-rpc-streams.mdx index 5458d8b41..ea750ffe0 100644 --- a/cosmjs/v0.38.x/concepts/transports/json-rpc-streams.mdx +++ b/cosmjs/v0.38.x/concepts/transports/json-rpc-streams.mdx @@ -3,6 +3,8 @@ title: JSON-RPC & Reactive Streams description: Understanding the JSON-RPC protocol and stream utilities used by CosmJS transports --- +CosmJS uses JSON-RPC 2.0 for all transport-level communication and xstream-based reactive streams for event subscriptions. These are low-level building blocks that most applications interact with indirectly through higher-level clients. + ## JSON-RPC Protocol All transports use the [JSON-RPC 2.0](https://www.jsonrpc.org/specification) diff --git a/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx b/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx index 212a81ecf..5aea81d30 100644 --- a/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx +++ b/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx @@ -90,11 +90,9 @@ const cometClient = await Comet38Client.create(rpcClient); const client = StargateClient.create(cometClient); ``` -> **Tip:** When using manual transport configuration, you need to know the -> CometBFT version of your target chain. Use `Comet38Client` for CometBFT 0.38, -> `Comet1Client` for CometBFT 1.x, or `Tendermint37Client` for Tendermint 0.37. -> If you're not sure, use `connectComet()` for auto-detection — though this -> only accepts an endpoint string or `HttpEndpoint`, not a pre-built RPC client. + +When using manual transport configuration, you need to know the CometBFT version of your target chain. Use `Comet38Client` for CometBFT 0.38, `Comet1Client` for CometBFT 1.x, or `Tendermint37Client` for Tendermint 0.37. If you're not sure, use `connectComet()` for auto-detection — though this only accepts an endpoint string or `HttpEndpoint`, not a pre-built RPC client. + ## Package Summary diff --git a/cosmjs/v0.38.x/concepts/transports/websocket.mdx b/cosmjs/v0.38.x/concepts/transports/websocket.mdx index 804bbc6fd..83f9e678c 100644 --- a/cosmjs/v0.38.x/concepts/transports/websocket.mdx +++ b/cosmjs/v0.38.x/concepts/transports/websocket.mdx @@ -98,7 +98,7 @@ Available subscription methods: `WebsocketClient` uses `ReconnectingSocket` under the hood, which provides automatic reconnection with exponential backoff. The full socket stack is: -``` +```text WebsocketClient └── ReconnectingSocket ← auto-reconnect with backoff └── QueueingStreamingSocket ← request queue + connection status diff --git a/cosmjs/v0.38.x/overview.mdx b/cosmjs/v0.38.x/overview.mdx index e7d681539..90278f75d 100644 --- a/cosmjs/v0.38.x/overview.mdx +++ b/cosmjs/v0.38.x/overview.mdx @@ -13,7 +13,7 @@ CosmJS is published as a set of scoped npm packages. Use the ones that match you | --- | --- | | `@cosmjs/stargate` | High-level client for querying and broadcasting on Cosmos SDK 0.40+ chains | | `@cosmjs/proto-signing` | Wallet primitives and Protobuf-based transaction signing | -| `@cosmjs/cosmwasm-stargate` | Client extensions for CosmWasm-enabled chains | +| `@cosmjs/cosmwasm` | Client extensions for CosmWasm-enabled chains | | `@cosmjs/amino` | Amino signing support for legacy compatibility | | `@cosmjs/tendermint-rpc` | Low-level Tendermint/CometBFT RPC client | | `@cosmjs/encoding` | Encoding utilities (hex, base64, bech32, UTF-8) | diff --git a/cosmjs/v0.38.x/quick-start.mdx b/cosmjs/v0.38.x/quick-start.mdx index d7d8acd0c..9885ac91a 100644 --- a/cosmjs/v0.38.x/quick-start.mdx +++ b/cosmjs/v0.38.x/quick-start.mdx @@ -3,9 +3,11 @@ title: Quick Start description: Install CosmJS, connect to a Cosmos SDK chain, query state, and send your first transaction --- +This guide walks you through installing CosmJS, connecting to a Cosmos SDK chain, querying on-chain state, and sending your first transaction. + ## Prerequisites -- **Node.js** v16 or later +- **Node.js** v22 or later - **npm**, **yarn**, or **pnpm** - A Cosmos SDK chain RPC endpoint (e.g. `https://rpc.cosmos.network` for the Cosmos Hub) From 930c53990bd54ac53c8b9737f390ca7e8d6e9e24 Mon Sep 17 00:00:00 2001 From: Nur Fikri Date: Fri, 13 Mar 2026 05:41:52 +0700 Subject: [PATCH 08/17] feat: add new API references for encoding, crypto, math, and more; update RPC endpoint examples; and improve overall clarity and structure. --- cosmjs/v0.38.x/api-reference/amino.mdx | 253 ++++++++++++++ cosmjs/v0.38.x/api-reference/cosmwasm.mdx | 312 +++++++++++++++++ cosmjs/v0.38.x/api-reference/crypto.mdx | 236 +++++++++++++ cosmjs/v0.38.x/api-reference/encoding.mdx | 98 ++++++ .../v0.38.x/api-reference/faucet-client.mdx | 29 ++ cosmjs/v0.38.x/api-reference/json-rpc.mdx | 129 +++++++ cosmjs/v0.38.x/api-reference/ledger-amino.mdx | 84 +++++ cosmjs/v0.38.x/api-reference/math.mdx | 117 +++++++ .../v0.38.x/api-reference/proto-signing.mdx | 195 +++++++++++ cosmjs/v0.38.x/api-reference/socket.mdx | 99 ++++++ cosmjs/v0.38.x/api-reference/stargate.mdx | 316 ++++++++++++++++++ cosmjs/v0.38.x/api-reference/stream.mdx | 66 ++++ .../v0.38.x/api-reference/tendermint-rpc.mdx | 172 ++++++++++ cosmjs/v0.38.x/api-reference/utils.mdx | 60 ++++ cosmjs/v0.38.x/concepts/account/account.mdx | 2 +- .../concepts/account/injected-wallets.mdx | 2 +- .../concepts/account/local-wallets.mdx | 2 +- .../concepts/clients/read-only-clients.mdx | 6 +- .../concepts/clients/signing-clients.mdx | 4 +- .../concepts/fees-gas/dynamic-gas-pricing.mdx | 2 +- .../v0.38.x/concepts/fees-gas/fee-grants.mdx | 2 +- .../concepts/fees-gas/gas-and-fees.mdx | 2 +- .../concepts/transactions/sign-broadcast.mdx | 2 +- cosmjs/v0.38.x/concepts/transports/http.mdx | 12 +- .../concepts/transports/rpc-client.mdx | 8 +- .../v0.38.x/concepts/transports/websocket.mdx | 6 +- cosmjs/v0.38.x/guides/connect/connect.mdx | 83 +++++ .../guides/connect/custom-endpoints.mdx | 105 ++++++ cosmjs/v0.38.x/guides/connect/errors.mdx | 80 +++++ cosmjs/v0.38.x/guides/connect/http.mdx | 75 +++++ cosmjs/v0.38.x/guides/connect/timeouts.mdx | 70 ++++ .../guides/connect/version-detection.mdx | 61 ++++ cosmjs/v0.38.x/guides/connect/websocket.mdx | 95 ++++++ .../guides/cosmwasm/administration.mdx | 85 +++++ cosmjs/v0.38.x/guides/cosmwasm/cosmwasm.mdx | 100 ++++++ cosmjs/v0.38.x/guides/cosmwasm/executing.mdx | 102 ++++++ .../guides/cosmwasm/gas-and-advanced.mdx | 185 ++++++++++ .../v0.38.x/guides/cosmwasm/instantiating.mdx | 108 ++++++ cosmjs/v0.38.x/guides/cosmwasm/querying.mdx | 105 ++++++ cosmjs/v0.38.x/guides/cosmwasm/uploading.mdx | 80 +++++ .../guides/extending/amino-converters.mdx | 143 ++++++++ .../guides/extending/code-generation.mdx | 223 ++++++++++++ .../guides/extending/custom-modules.mdx | 220 ++++++++++++ .../v0.38.x/guides/extending/custom-types.mdx | 148 ++++++++ cosmjs/v0.38.x/guides/extending/extending.mdx | 45 +++ .../v0.38.x/guides/extending/new-chains.mdx | 175 ++++++++++ .../guides/extending/query-extensions.mdx | 157 +++++++++ cosmjs/v0.38.x/guides/query/accounts.mdx | 94 ++++++ cosmjs/v0.38.x/guides/query/bank.mdx | 56 ++++ .../guides/query/blocks-and-chain-info.mdx | 96 ++++++ cosmjs/v0.38.x/guides/query/cosmwasm.mdx | 55 +++ .../guides/query/custom-extensions.mdx | 78 +++++ .../guides/query/distribution-and-mint.mdx | 78 +++++ .../v0.38.x/guides/query/error-handling.mdx | 79 +++++ cosmjs/v0.38.x/guides/query/governance.mdx | 83 +++++ cosmjs/v0.38.x/guides/query/ibc.mdx | 58 ++++ cosmjs/v0.38.x/guides/query/pagination.mdx | 105 ++++++ cosmjs/v0.38.x/guides/query/querying.mdx | 158 +++++++++ .../guides/query/slashing-authz-feegrant.mdx | 78 +++++ cosmjs/v0.38.x/guides/query/staking.mdx | 96 ++++++ cosmjs/v0.38.x/guides/query/transactions.mdx | 221 ++++++++++++ .../guides/transactions/building-messages.mdx | 63 ++++ .../guides/transactions/confirmation.mdx | 64 ++++ .../guides/transactions/error-handling.mdx | 119 +++++++ .../transactions/events-and-lookups.mdx | 77 +++++ .../guides/transactions/send-transactions.mdx | 122 +++++++ .../transactions/signing-broadcasting.mdx | 87 +++++ .../guides/transactions/simulating-gas.mdx | 67 ++++ cosmjs/v0.38.x/quick-start.mdx | 2 +- docs.json | 91 +++++ 70 files changed, 6662 insertions(+), 26 deletions(-) create mode 100644 cosmjs/v0.38.x/api-reference/amino.mdx create mode 100644 cosmjs/v0.38.x/api-reference/cosmwasm.mdx create mode 100644 cosmjs/v0.38.x/api-reference/crypto.mdx create mode 100644 cosmjs/v0.38.x/api-reference/encoding.mdx create mode 100644 cosmjs/v0.38.x/api-reference/faucet-client.mdx create mode 100644 cosmjs/v0.38.x/api-reference/json-rpc.mdx create mode 100644 cosmjs/v0.38.x/api-reference/ledger-amino.mdx create mode 100644 cosmjs/v0.38.x/api-reference/math.mdx create mode 100644 cosmjs/v0.38.x/api-reference/proto-signing.mdx create mode 100644 cosmjs/v0.38.x/api-reference/socket.mdx create mode 100644 cosmjs/v0.38.x/api-reference/stargate.mdx create mode 100644 cosmjs/v0.38.x/api-reference/stream.mdx create mode 100644 cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx create mode 100644 cosmjs/v0.38.x/api-reference/utils.mdx create mode 100644 cosmjs/v0.38.x/guides/connect/connect.mdx create mode 100644 cosmjs/v0.38.x/guides/connect/custom-endpoints.mdx create mode 100644 cosmjs/v0.38.x/guides/connect/errors.mdx create mode 100644 cosmjs/v0.38.x/guides/connect/http.mdx create mode 100644 cosmjs/v0.38.x/guides/connect/timeouts.mdx create mode 100644 cosmjs/v0.38.x/guides/connect/version-detection.mdx create mode 100644 cosmjs/v0.38.x/guides/connect/websocket.mdx create mode 100644 cosmjs/v0.38.x/guides/cosmwasm/administration.mdx create mode 100644 cosmjs/v0.38.x/guides/cosmwasm/cosmwasm.mdx create mode 100644 cosmjs/v0.38.x/guides/cosmwasm/executing.mdx create mode 100644 cosmjs/v0.38.x/guides/cosmwasm/gas-and-advanced.mdx create mode 100644 cosmjs/v0.38.x/guides/cosmwasm/instantiating.mdx create mode 100644 cosmjs/v0.38.x/guides/cosmwasm/querying.mdx create mode 100644 cosmjs/v0.38.x/guides/cosmwasm/uploading.mdx create mode 100644 cosmjs/v0.38.x/guides/extending/amino-converters.mdx create mode 100644 cosmjs/v0.38.x/guides/extending/code-generation.mdx create mode 100644 cosmjs/v0.38.x/guides/extending/custom-modules.mdx create mode 100644 cosmjs/v0.38.x/guides/extending/custom-types.mdx create mode 100644 cosmjs/v0.38.x/guides/extending/extending.mdx create mode 100644 cosmjs/v0.38.x/guides/extending/new-chains.mdx create mode 100644 cosmjs/v0.38.x/guides/extending/query-extensions.mdx create mode 100644 cosmjs/v0.38.x/guides/query/accounts.mdx create mode 100644 cosmjs/v0.38.x/guides/query/bank.mdx create mode 100644 cosmjs/v0.38.x/guides/query/blocks-and-chain-info.mdx create mode 100644 cosmjs/v0.38.x/guides/query/cosmwasm.mdx create mode 100644 cosmjs/v0.38.x/guides/query/custom-extensions.mdx create mode 100644 cosmjs/v0.38.x/guides/query/distribution-and-mint.mdx create mode 100644 cosmjs/v0.38.x/guides/query/error-handling.mdx create mode 100644 cosmjs/v0.38.x/guides/query/governance.mdx create mode 100644 cosmjs/v0.38.x/guides/query/ibc.mdx create mode 100644 cosmjs/v0.38.x/guides/query/pagination.mdx create mode 100644 cosmjs/v0.38.x/guides/query/querying.mdx create mode 100644 cosmjs/v0.38.x/guides/query/slashing-authz-feegrant.mdx create mode 100644 cosmjs/v0.38.x/guides/query/staking.mdx create mode 100644 cosmjs/v0.38.x/guides/query/transactions.mdx create mode 100644 cosmjs/v0.38.x/guides/transactions/building-messages.mdx create mode 100644 cosmjs/v0.38.x/guides/transactions/confirmation.mdx create mode 100644 cosmjs/v0.38.x/guides/transactions/error-handling.mdx create mode 100644 cosmjs/v0.38.x/guides/transactions/events-and-lookups.mdx create mode 100644 cosmjs/v0.38.x/guides/transactions/send-transactions.mdx create mode 100644 cosmjs/v0.38.x/guides/transactions/signing-broadcasting.mdx create mode 100644 cosmjs/v0.38.x/guides/transactions/simulating-gas.mdx diff --git a/cosmjs/v0.38.x/api-reference/amino.mdx b/cosmjs/v0.38.x/api-reference/amino.mdx new file mode 100644 index 000000000..5e72ca36d --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/amino.mdx @@ -0,0 +1,253 @@ +--- +title: "@cosmjs/amino" +description: "Amino encoding, signing, and wallet management" +--- + +Provides Amino JSON encoding and signing capabilities for Cosmos SDK transactions. Essential for legacy signing, Ledger hardware wallets, and backwards compatibility. + +```bash +npm install @cosmjs/amino +``` + +## Secp256k1HdWallet + +HD wallet using BIP-39 mnemonic with Amino JSON signing. Implements `OfflineAminoSigner`. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `generate` | `length?: 12 \| 15 \| 18 \| 21 \| 24`, `options?: Partial` | `Promise` | +| `fromMnemonic` | `mnemonic: string`, `options?: Partial` | `Promise` | +| `deserialize` | `serialization: string`, `password: string` | `Promise` | +| `deserializeWithEncryptionKey` | `serialization: string`, `encryptionKey: Uint8Array` | `Promise` | + +### Instance Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `getAccounts` | — | `Promise` | +| `signAmino` | `signerAddress: string`, `signDoc: StdSignDoc` | `Promise` | +| `serialize` | `password: string` | `Promise` | +| `serializeWithEncryptionKey` | `encryptionKey: Uint8Array`, `kdfConfiguration: KdfConfiguration` | `Promise` | + +### Instance Properties + +| Property | Type | +|----------|------| +| `mnemonic` | `string` | + +### Options + +```typescript +interface Secp256k1HdWalletOptions { + readonly bip39Password: string; // default: "" + readonly hdPaths: readonly HdPath[]; // default: [makeCosmoshubPath(0)] + readonly prefix: string; // default: "cosmos" +} +``` + +### Usage + +```typescript +import { Secp256k1HdWallet, makeCosmoshubPath } from "@cosmjs/amino"; + +const wallet = await Secp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "cosmos", + hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1)], +}); + +const [account1, account2] = await wallet.getAccounts(); +``` + +## Secp256k1Wallet + +Single-key wallet for Amino JSON signing. Implements `OfflineAminoSigner`. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `fromKey` (static) | `privkey: Uint8Array`, `prefix?: string` | `Promise` | +| `getAccounts` | — | `Promise` | +| `signAmino` | `signerAddress: string`, `signDoc: StdSignDoc` | `Promise` | + +## Address Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `pubkeyToAddress` | `pubkey: Pubkey`, `prefix: string` | `string` | +| `pubkeyToRawAddress` | `pubkey: Pubkey` | `Uint8Array` | +| `rawSecp256k1PubkeyToRawAddress` | `pubkeyRaw: Uint8Array` | `Uint8Array` | +| `rawEd25519PubkeyToRawAddress` | `pubkeyRaw: Uint8Array` | `Uint8Array` | +| `rawEthSecp256k1PubkeyToRawAddress` | `pubkeyRaw: Uint8Array` | `Uint8Array` | + +## Coin Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `coin` | `amount: number \| string`, `denom: string` | `Coin` | +| `coins` | `amount: number \| string`, `denom: string` | `Coin[]` | +| `parseCoins` | `input: string` | `Coin[]` | +| `addCoins` | `a: Coin`, `b: Coin` | `Coin` | + +```typescript +import { coin, coins, parseCoins, addCoins } from "@cosmjs/amino"; + +const amount = coin(1000000, "uatom"); +const amounts = coins(500, "uatom"); +const parsed = parseCoins("1000uatom,500ustake"); +const total = addCoins(coin(100, "uatom"), coin(50, "uatom")); +``` + +## Pubkey Encoding + +| Function | Parameters | Returns | +|----------|------------|---------| +| `encodeSecp256k1Pubkey` | `pubkey: Uint8Array` | `Secp256k1Pubkey` | +| `encodeEd25519Pubkey` | `pubkey: Uint8Array` | `Ed25519Pubkey` | +| `encodeEthSecp256k1Pubkey` | `pubkey: Uint8Array` | `EthSecp256k1Pubkey` | +| `encodeAminoPubkey` | `pubkey: Pubkey` | `Uint8Array` | +| `decodeAminoPubkey` | `amino: Uint8Array` | `Pubkey` | +| `encodeBech32Pubkey` | `pubkey: Pubkey`, `prefix: string` | `string` | +| `decodeBech32Pubkey` | `bechEncoded: string` | `Pubkey` | + +## Signature Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `encodeSecp256k1Signature` | `pubkey: Uint8Array`, `signature: Uint8Array` | `StdSignature` | +| `encodeEthSecp256k1Signature` | `pubkey: Uint8Array`, `signature: Uint8Array` | `StdSignature` | +| `decodeSignature` | `signature: StdSignature` | `{ pubkey: Uint8Array; signature: Uint8Array }` | + +## Sign Document Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `makeSignDoc` | `msgs: readonly AminoMsg[]`, `fee: StdFee`, `chainId: string`, `memo: string`, `accountNumber: number \| string`, `sequence: number \| string` | `StdSignDoc` | +| `serializeSignDoc` | `signDoc: StdSignDoc` | `Uint8Array` | + +## Multisig + +| Function | Parameters | Returns | +|----------|------------|---------| +| `createMultisigThresholdPubkey` | `pubkeys: readonly SinglePubkey[]`, `threshold: number` | `MultisigThresholdPubkey` | + +## Key Types + +### Coin + +```typescript +interface Coin { + readonly denom: string; + readonly amount: string; +} +``` + +### StdFee + +```typescript +interface StdFee { + readonly amount: readonly Coin[]; + readonly gas: string; + readonly granter?: string; + readonly payer?: string; +} +``` + +### AminoMsg + +```typescript +interface AminoMsg { + readonly type: string; + readonly value: any; +} +``` + +### StdSignDoc + +```typescript +interface StdSignDoc { + readonly chain_id: string; + readonly account_number: string; + readonly sequence: string; + readonly fee: StdFee; + readonly msgs: readonly AminoMsg[]; + readonly memo: string; +} +``` + +### AccountData + +```typescript +interface AccountData { + readonly address: string; + readonly algo: Algo; + readonly pubkey: Uint8Array; +} +``` + +### OfflineAminoSigner + +```typescript +interface OfflineAminoSigner { + readonly getAccounts: () => Promise; + readonly signAmino: (signerAddress: string, signDoc: StdSignDoc) => Promise; +} +``` + +### AminoSignResponse + +```typescript +interface AminoSignResponse { + readonly signed: StdSignDoc; + readonly signature: StdSignature; +} +``` + +### StdSignature + +```typescript +interface StdSignature { + readonly pub_key: Pubkey; + readonly signature: string; +} +``` + +### Pubkey Types + +```typescript +interface Secp256k1Pubkey { + readonly type: "tendermint/PubKeySecp256k1"; + readonly value: string; +} + +interface Ed25519Pubkey { + readonly type: "tendermint/PubKeyEd25519"; + readonly value: string; +} + +interface EthSecp256k1Pubkey { + readonly type: "ethermint/PubKeyEthSecp256k1"; + readonly value: string; +} + +interface MultisigThresholdPubkey { + readonly type: "tendermint/PubKeyMultisigThreshold"; + readonly value: { + readonly threshold: string; + readonly pubkeys: readonly SinglePubkey[]; + }; +} +``` + +## Other Exports + +| Function/Type | Purpose | +|---------------|---------| +| `makeCosmoshubPath(account)` | Creates HD path `m/44'/118'/0'/0/{account}` | +| `omitDefault(value)` | Omit protobuf default values | +| `isStdTx(value)` | Type guard for StdTx | +| `makeStdTx(signDoc, signature)` | Create StdTx from sign doc and signature | +| `extractKdfConfiguration(serialization)` | Extract KDF config from serialized wallet | +| `executeKdf(password, config)` | Execute key derivation function | +| `isEthereumSecp256k1Account(account)` | Check if account uses Ethereum secp256k1 | +| `getAminoPubkey(account)` | Get amino pubkey from account data | diff --git a/cosmjs/v0.38.x/api-reference/cosmwasm.mdx b/cosmjs/v0.38.x/api-reference/cosmwasm.mdx new file mode 100644 index 000000000..0d43df7ac --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/cosmwasm.mdx @@ -0,0 +1,312 @@ +--- +title: "@cosmjs/cosmwasm" +description: "Client for CosmWasm smart contract chains" +--- + +Extends `@cosmjs/stargate` with CosmWasm-specific functionality for interacting with smart contracts on CosmWasm-enabled chains. + +```bash +npm install @cosmjs/cosmwasm +``` + + + The previous package name `@cosmjs/cosmwasm-stargate` is deprecated. Update your imports to use `@cosmjs/cosmwasm`. + + +## CosmWasmClient + +Read-only client for querying blockchain state and smart contracts. Extends `StargateClient` functionality with contract-specific methods. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connect` | `endpoint: string \| HttpEndpoint`, `options?: CosmWasmClientOptions` | `Promise` | +| `create` | `cometClient: CometClient`, `options?: CosmWasmClientOptions` | `CosmWasmClient` | + +### Instance Methods — Chain Queries + +| Method | Parameters | Returns | +|--------|------------|---------| +| `getChainId` | — | `Promise` | +| `getHeight` | — | `Promise` | +| `getAccount` | `searchAddress: string` | `Promise` | +| `getSequence` | `address: string` | `Promise` | +| `getBlock` | `height?: number` | `Promise` | +| `getBalance` | `address: string`, `searchDenom: string` | `Promise` | +| `getTx` | `id: string` | `Promise` | +| `searchTx` | `query: SearchTxQuery` | `Promise` | +| `broadcastTx` | `tx: Uint8Array`, `timeoutMs?: number`, `pollIntervalMs?: number` | `Promise` | +| `broadcastTxSync` | `tx: Uint8Array` | `Promise` | +| `disconnect` | — | `void` | + +### Instance Methods — Contract Queries + +| Method | Parameters | Returns | +|--------|------------|---------| +| `getCodes` | — | `Promise` | +| `getCodeDetails` | `codeId: number` | `Promise` | +| `getContracts` | `codeId: number` | `Promise` | +| `getContractsByCreator` | `creator: string` | `Promise` | +| `getContract` | `address: string` | `Promise` | +| `getContractCodeHistory` | `address: string` | `Promise` | +| `queryContractRaw` | `address: string`, `key: Uint8Array` | `Promise` | +| `queryContractSmart` | `address: string`, `queryMsg: JsonObject` | `Promise` | + +### Usage + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await CosmWasmClient.connect("https://rpc.my-chain.network"); + +const info = await client.getContract("osmo1contractaddr..."); +const state = await client.queryContractSmart("osmo1contractaddr...", { + get_count: {}, +}); +const codes = await client.getCodes(); +const contracts = await client.getContracts(1); + +client.disconnect(); +``` + +## SigningCosmWasmClient + +Extends `CosmWasmClient` with transaction signing and smart contract management. Inherits all read-only methods above. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connectWithSigner` | `endpoint: string \| HttpEndpoint`, `signer: OfflineSigner`, `options?: SigningCosmWasmClientOptions` | `Promise` | +| `createWithSigner` | `cometClient: CometClient`, `signer: OfflineSigner`, `options?: SigningCosmWasmClientOptions` | `SigningCosmWasmClient` | +| `offline` | `signer: OfflineSigner`, `options?: SigningCosmWasmClientOptions` | `Promise` | + +### Instance Methods — Contract Operations + +| Method | Parameters | Returns | +|--------|------------|---------| +| `upload` | `senderAddress: string`, `wasmCode: Uint8Array`, `fee: StdFee \| "auto" \| number`, `memo?: string`, `instantiatePermission?: AccessConfig` | `Promise` | +| `instantiate` | `senderAddress: string`, `codeId: number`, `msg: JsonObject`, `label: string`, `fee: StdFee \| "auto" \| number`, `options?: InstantiateOptions` | `Promise` | +| `instantiate2` | `senderAddress: string`, `codeId: number`, `salt: Uint8Array`, `msg: JsonObject`, `label: string`, `fee: StdFee \| "auto" \| number`, `options?: InstantiateOptions` | `Promise` | +| `execute` | `senderAddress: string`, `contractAddress: string`, `msg: JsonObject`, `fee: StdFee \| "auto" \| number`, `memo?: string`, `funds?: readonly Coin[]` | `Promise` | +| `executeMultiple` | `senderAddress: string`, `instructions: readonly ExecuteInstruction[]`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `migrate` | `senderAddress: string`, `contractAddress: string`, `codeId: number`, `migrateMsg: JsonObject`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `updateAdmin` | `senderAddress: string`, `contractAddress: string`, `newAdmin: string`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `clearAdmin` | `senderAddress: string`, `contractAddress: string`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | + +### Instance Methods — Token Operations + +| Method | Parameters | Returns | +|--------|------------|---------| +| `sendTokens` | `senderAddress: string`, `recipientAddress: string`, `amount: readonly Coin[]`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `delegateTokens` | `delegatorAddress: string`, `validatorAddress: string`, `amount: Coin`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `undelegateTokens` | `delegatorAddress: string`, `validatorAddress: string`, `amount: Coin`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `withdrawRewards` | `delegatorAddress: string`, `validatorAddress: string`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | + +### Instance Methods — Signing + +| Method | Parameters | Returns | +|--------|------------|---------| +| `simulate` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `memo: string \| undefined` | `Promise` | +| `signAndBroadcast` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `fee: StdFee \| "auto" \| number`, `memo?: string`, `timeoutHeight?: bigint` | `Promise` | +| `signAndBroadcastSync` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `fee: StdFee \| "auto" \| number`, `memo?: string`, `timeoutHeight?: bigint` | `Promise` | +| `sign` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `fee: StdFee`, `memo: string`, `explicitSignerData?: SignerData`, `timeoutHeight?: bigint` | `Promise` | + +### Usage + +```typescript +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { GasPrice } from "@cosmjs/stargate"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "osmo", +}); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningCosmWasmClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uosmo") }, +); + +// Upload +const wasmCode = fs.readFileSync("contract.wasm"); +const { codeId } = await client.upload(address, wasmCode, "auto"); + +// Instantiate +const { contractAddress } = await client.instantiate( + address, codeId, { count: 0 }, "My Contract", "auto", +); + +// Execute +const result = await client.execute( + address, contractAddress, { increment: {} }, "auto", +); + +// Query +const state = await client.queryContractSmart(contractAddress, { get_count: {} }); +``` + +## Key Types + +### Code + +```typescript +interface Code { + readonly id: number; + readonly creator: string; + readonly checksum: string; +} +``` + +### CodeDetails + +```typescript +interface CodeDetails extends Code { + readonly data: Uint8Array; +} +``` + +### Contract + +```typescript +interface Contract { + readonly address: string; + readonly codeId: number; + readonly creator: string; + readonly admin: string | undefined; + readonly label: string; + readonly ibcPortId: string | undefined; +} +``` + +### ContractCodeHistoryEntry + +```typescript +interface ContractCodeHistoryEntry { + readonly operation: "Genesis" | "Init" | "Migrate"; + readonly codeId: number; + readonly msg: JsonObject; +} +``` + +### UploadResult + +```typescript +interface UploadResult { + readonly checksum: string; + readonly originalSize: number; + readonly compressedSize: number; + readonly codeId: number; + readonly height: number; + readonly transactionHash: string; + readonly events: readonly Event[]; + readonly gasWanted: bigint; + readonly gasUsed: bigint; +} +``` + +### InstantiateResult + +```typescript +interface InstantiateResult { + readonly contractAddress: string; + readonly height: number; + readonly transactionHash: string; + readonly events: readonly Event[]; + readonly gasWanted: bigint; + readonly gasUsed: bigint; +} +``` + +### InstantiateOptions + +```typescript +interface InstantiateOptions { + readonly memo?: string; + readonly funds?: readonly Coin[]; + readonly admin?: string; +} +``` + +### ExecuteResult + +```typescript +interface ExecuteResult { + readonly height: number; + readonly transactionHash: string; + readonly events: readonly Event[]; + readonly gasWanted: bigint; + readonly gasUsed: bigint; +} +``` + +### ExecuteInstruction + +```typescript +interface ExecuteInstruction { + contractAddress: string; + msg: JsonObject; + funds?: readonly Coin[]; +} +``` + +### MigrateResult + +```typescript +interface MigrateResult { + readonly height: number; + readonly transactionHash: string; + readonly events: readonly Event[]; + readonly gasWanted: bigint; + readonly gasUsed: bigint; +} +``` + +### ChangeAdminResult + +```typescript +interface ChangeAdminResult { + readonly height: number; + readonly transactionHash: string; + readonly events: readonly Event[]; + readonly gasWanted: bigint; + readonly gasUsed: bigint; +} +``` + +### SigningCosmWasmClientOptions + +```typescript +interface SigningCosmWasmClientOptions extends CosmWasmClientOptions { + readonly registry?: Registry; + readonly aminoTypes?: AminoTypes; + readonly broadcastTimeoutMs?: number; + readonly broadcastPollIntervalMs?: number; + readonly gasPrice?: GasPrice | DynamicGasPriceConfig; +} +``` + +## Helper Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `setupWasmExtension` | `base: QueryClient` | `WasmExtension` | +| `createWasmAminoConverters` | — | `AminoConverters` | +| `instantiate2Address` | `checksum: Uint8Array`, `creator: string`, `salt: Uint8Array`, `prefix: string` | `string` | +| `toBinary` | `obj: JsonObject` | `string` | +| `fromBinary` | `binary: string` | `JsonObject` | + +## Encode Objects + +| Type | `typeUrl` | +|------|-----------| +| `MsgStoreCodeEncodeObject` | `/cosmwasm.wasm.v1.MsgStoreCode` | +| `MsgInstantiateContractEncodeObject` | `/cosmwasm.wasm.v1.MsgInstantiateContract` | +| `MsgInstantiateContract2EncodeObject` | `/cosmwasm.wasm.v1.MsgInstantiateContract2` | +| `MsgExecuteContractEncodeObject` | `/cosmwasm.wasm.v1.MsgExecuteContract` | +| `MsgMigrateContractEncodeObject` | `/cosmwasm.wasm.v1.MsgMigrateContract` | +| `MsgUpdateAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgUpdateAdmin` | +| `MsgClearAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgClearAdmin` | diff --git a/cosmjs/v0.38.x/api-reference/crypto.mdx b/cosmjs/v0.38.x/api-reference/crypto.mdx new file mode 100644 index 000000000..e3167985d --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/crypto.mdx @@ -0,0 +1,236 @@ +--- +title: "@cosmjs/crypto" +description: "Cryptographic primitives for blockchain applications" +--- + +Low-level cryptographic library providing hashing, signing, HD key derivation, and encryption. Wraps `@noble/*` libraries with type safety and a consistent API. + +```bash +npm install @cosmjs/crypto +``` + +## Hashing + +### Convenience Functions + +| Function | Parameters | Returns | Output Size | +|----------|------------|---------|-------------| +| `sha256` | `data: Uint8Array` | `Uint8Array` | 32 bytes | +| `sha512` | `data: Uint8Array` | `Uint8Array` | 64 bytes | +| `keccak256` | `data: Uint8Array` | `Uint8Array` | 32 bytes | +| `ripemd160` | `data: Uint8Array` | `Uint8Array` | 20 bytes | + +### Incremental Hashing Classes + +For large data, use the class API with `update()` for incremental hashing: + +| Class | Methods | +|-------|---------| +| `Sha256` | `constructor(data?: Uint8Array)`, `update(data: Uint8Array): Sha256`, `digest(): Uint8Array` | +| `Sha512` | `constructor(data?: Uint8Array)`, `update(data: Uint8Array): Sha512`, `digest(): Uint8Array` | +| `Keccak256` | `constructor(data?: Uint8Array)`, `update(data: Uint8Array): Keccak256`, `digest(): Uint8Array` | +| `Ripemd160` | `constructor(data?: Uint8Array)`, `update(data: Uint8Array): Ripemd160`, `digest(): Uint8Array` | + +```typescript +import { sha256, Sha256, keccak256 } from "@cosmjs/crypto"; + +const hash = sha256(new Uint8Array([1, 2, 3])); + +const hasher = new Sha256(); +hasher.update(chunk1); +hasher.update(chunk2); +const incrementalHash = hasher.digest(); +``` + +### Hmac + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `hashFunction: HashFunction`, `key: Uint8Array` | `Hmac` | +| `update` | `data: Uint8Array` | `Hmac` | +| `digest` | — | `Uint8Array` | + +```typescript +import { Hmac, Sha256 } from "@cosmjs/crypto"; + +const hmac = new Hmac(Sha256, key); +hmac.update(message); +const mac = hmac.digest(); +``` + +## Secp256k1 + +Elliptic curve operations for Cosmos, Bitcoin, and Ethereum signing. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `makeKeypair` (static) | `privkey: Uint8Array` | `Promise` | +| `createSignature` (static) | `messageHash: Uint8Array`, `privkey: Uint8Array` | `Promise` | +| `verifySignature` (static) | `signature: Secp256k1Signature`, `messageHash: Uint8Array`, `pubkey: Uint8Array` | `Promise` | +| `compressPubkey` (static) | `pubkey: Uint8Array` | `Uint8Array` | +| `uncompressPubkey` (static) | `pubkey: Uint8Array` | `Uint8Array` | +| `trimRecoveryByte` (static) | `signature: Uint8Array` | `Uint8Array` | + +### Types + +```typescript +interface Secp256k1Keypair { + readonly pubkey: Uint8Array; // 33 bytes (compressed) or 65 bytes + readonly privkey: Uint8Array; // 32 bytes +} +``` + +```typescript +import { Secp256k1, sha256 } from "@cosmjs/crypto"; + +const keypair = await Secp256k1.makeKeypair(privkey); +const hash = sha256(message); +const signature = await Secp256k1.createSignature(hash, keypair.privkey); +const valid = await Secp256k1.verifySignature(signature, hash, keypair.pubkey); +``` + +## Secp256k1Signature / ExtendedSecp256k1Signature + +| Property | Type | Description | +|----------|------|-------------| +| `r` | `Uint8Array` | 32 bytes | +| `s` | `Uint8Array` | 32 bytes | +| `recovery` | `number` | 0 or 1 (extended only) | + +| Method | Returns | +|--------|---------| +| `toFixedLength()` | `Uint8Array` (64 bytes) | +| `toDer()` | `Uint8Array` | +| `fromFixedLength(data)` (static) | `Secp256k1Signature` / `ExtendedSecp256k1Signature` | +| `fromDer(data)` (static) | `Secp256k1Signature` | + +## Ed25519 + +Edwards-curve digital signature algorithm for fast, deterministic signing. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `makeKeypair` (static) | `seed: Uint8Array` | `Promise` | +| `createSignature` (static) | `message: Uint8Array`, `keypair: Ed25519Keypair` | `Promise` | +| `verifySignature` (static) | `signature: Uint8Array`, `message: Uint8Array`, `pubkey: Uint8Array` | `Promise` | + + + Ed25519 hashes the message internally. Do not pre-hash the message before signing. + + +```typescript +import { Ed25519 } from "@cosmjs/crypto"; + +const keypair = await Ed25519.makeKeypair(seed32bytes); +const signature = await Ed25519.createSignature(message, keypair); +const valid = await Ed25519.verifySignature(signature, message, keypair.pubkey); +``` + +## BIP-39 Mnemonics + +### Bip39 + +| Method | Parameters | Returns | +|--------|------------|---------| +| `encode` (static) | `entropy: Uint8Array` | `EnglishMnemonic` | +| `decode` (static) | `mnemonic: EnglishMnemonic` | `Uint8Array` | +| `mnemonicToSeed` (static) | `mnemonic: EnglishMnemonic`, `password?: string` | `Promise` | + +### EnglishMnemonic + +Validates and wraps a BIP-39 English mnemonic string. Throws on invalid input. + +```typescript +import { Bip39, EnglishMnemonic, Random } from "@cosmjs/crypto"; + +const mnemonic = Bip39.encode(Random.getBytes(32)); // 24 words +const mnemonic12 = Bip39.encode(Random.getBytes(16)); // 12 words + +const validated = new EnglishMnemonic("your mnemonic words ..."); +const seed = await Bip39.mnemonicToSeed(validated); +``` + +## SLIP-10 HD Key Derivation + +### Slip10 + +| Method | Parameters | Returns | +|--------|------------|---------| +| `derivePath` (static) | `curve: Slip10Curve`, `seed: Uint8Array`, `path: HdPath` | `Slip10Result` | + +### Path Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `stringToPath` | `pathString: string` | `HdPath` | +| `pathToString` | `path: HdPath` | `string` | +| `slip10CurveFromString` | `curve: string` | `Slip10Curve` | + +### Types + +```typescript +type HdPath = readonly Slip10RawIndex[]; + +interface Slip10Result { + readonly privkey: Uint8Array; + readonly chainCode: Uint8Array; +} + +enum Slip10Curve { + Secp256k1 = "Bitcoin seed", + Ed25519 = "ed25519 seed", +} +``` + +```typescript +import { Slip10, Slip10Curve, stringToPath, Bip39, EnglishMnemonic } from "@cosmjs/crypto"; + +const mnemonic = new EnglishMnemonic("your mnemonic ..."); +const seed = await Bip39.mnemonicToSeed(mnemonic); +const hdPath = stringToPath("m/44'/118'/0'/0/0"); +const { privkey } = Slip10.derivePath(Slip10Curve.Secp256k1, seed, hdPath); +``` + +## Encryption + +### Xchacha20poly1305Ietf + +Authenticated encryption using XChaCha20-Poly1305. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `encrypt` (static) | `plaintext: Uint8Array`, `key: Uint8Array`, `nonce: Uint8Array` | `Uint8Array` | +| `decrypt` (static) | `ciphertext: Uint8Array`, `key: Uint8Array`, `nonce: Uint8Array` | `Uint8Array` | + +The constant `xchacha20NonceLength` is `24`. + +### Argon2id + +Password-based key derivation. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `execute` (static) | `password: string`, `salt: Uint8Array`, `options: Argon2idOptions` | `Promise` | + +```typescript +interface Argon2idOptions { + readonly outputLength: number; + readonly opsLimit: number; + readonly memLimitKib: number; +} +``` + +## Random + +Cryptographically secure random number generation. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `getBytes` (static) | `count: number` | `Uint8Array` | + +```typescript +import { Random } from "@cosmjs/crypto"; + +const nonce = Random.getBytes(24); +const privkey = Random.getBytes(32); +``` diff --git a/cosmjs/v0.38.x/api-reference/encoding.mdx b/cosmjs/v0.38.x/api-reference/encoding.mdx new file mode 100644 index 000000000..37b385bf4 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/encoding.mdx @@ -0,0 +1,98 @@ +--- +title: "@cosmjs/encoding" +description: "Encoding utilities for hex, base64, bech32, UTF-8, and more" +--- + +Cross-platform encoding and decoding utilities that work in both browsers and Node.js without relying on the Node.js `Buffer` class. + +```bash +npm install @cosmjs/encoding +``` + +## Hex + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toHex` | `data: Uint8Array` | `string` | +| `fromHex` | `hexString: string` | `Uint8Array` | + +```typescript +import { toHex, fromHex } from "@cosmjs/encoding"; + +const hex = toHex(new Uint8Array([255, 0, 128])); // "ff0080" +const bytes = fromHex("ff0080"); // Uint8Array [255, 0, 128] +``` + +## Base64 + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toBase64` | `data: Uint8Array` | `string` | +| `fromBase64` | `base64String: string` | `Uint8Array` | + +```typescript +import { toBase64, fromBase64 } from "@cosmjs/encoding"; + +const b64 = toBase64(new Uint8Array([1, 2, 3])); // "AQID" +const bytes = fromBase64("AQID"); // Uint8Array [1, 2, 3] +``` + +## Bech32 + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toBech32` | `prefix: string`, `data: Uint8Array` | `string` | +| `fromBech32` | `address: string` | `{ prefix: string; data: Uint8Array }` | +| `normalizeBech32` | `address: string` | `string` | + +```typescript +import { toBech32, fromBech32 } from "@cosmjs/encoding"; + +const address = toBech32("cosmos", addressBytes); +const { prefix, data } = fromBech32("cosmos1abc..."); +``` + +## UTF-8 + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toUtf8` | `str: string` | `Uint8Array` | +| `fromUtf8` | `data: Uint8Array` | `string` | + +```typescript +import { toUtf8, fromUtf8 } from "@cosmjs/encoding"; + +const bytes = toUtf8("hello world"); +const str = fromUtf8(bytes); // "hello world" +``` + +## ASCII + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toAscii` | `str: string` | `Uint8Array` | +| `fromAscii` | `data: Uint8Array` | `string` | + +Throws if the input contains non-ASCII characters (code points above 127). + +## RFC 3339 Timestamps + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toRfc3339` | `date: Date` | `string` | +| `fromRfc3339` | `str: string` | `Date` | + +```typescript +import { toRfc3339, fromRfc3339 } from "@cosmjs/encoding"; + +const timestamp = toRfc3339(new Date()); // "2024-01-15T10:30:00.000Z" +const date = fromRfc3339("2024-01-15T10:30:00.000Z"); +``` + +## Uint8Array Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `fixUint8Array` | `data: ArrayLike` | `Uint8Array` | + +Ensures a value is a proper `Uint8Array` instance, which is necessary in some cross-environment scenarios. diff --git a/cosmjs/v0.38.x/api-reference/faucet-client.mdx b/cosmjs/v0.38.x/api-reference/faucet-client.mdx new file mode 100644 index 000000000..45f600c5a --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/faucet-client.mdx @@ -0,0 +1,29 @@ +--- +title: "@cosmjs/faucet-client" +description: "HTTP client for the CosmJS token faucet" +--- + +Simple HTTP client for requesting tokens from a `@cosmjs/faucet` server. Useful for testnet development. + +```bash +npm install @cosmjs/faucet-client +``` + +## FaucetClient + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `baseUrl: string` | `FaucetClient` | +| `credit` | `address: string`, `denom?: string` | `Promise` | + +### Usage + +```typescript +import { FaucetClient } from "@cosmjs/faucet-client"; + +const faucet = new FaucetClient("http://localhost:8000"); + +await faucet.credit("cosmos1youraddress...", "uatom"); +``` + +The `credit` method throws if the faucet request fails (cooldown not met, faucet out of funds, etc.). diff --git a/cosmjs/v0.38.x/api-reference/json-rpc.mdx b/cosmjs/v0.38.x/api-reference/json-rpc.mdx new file mode 100644 index 000000000..9cf9f5aec --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/json-rpc.mdx @@ -0,0 +1,129 @@ +--- +title: "@cosmjs/json-rpc" +description: "JSON-RPC 2.0 protocol implementation" +--- + +JSON-RPC 2.0 protocol implementation used by `@cosmjs/tendermint-rpc` for HTTP and WebSocket RPC communication. + +```bash +npm install @cosmjs/json-rpc +``` + +## JsonRpcClient + +Sends JSON-RPC requests over a generic messaging connection. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `connection: SimpleMessagingConnection` | `JsonRpcClient` | +| `run` | `request: JsonRpcRequest` | `Promise` | + +```typescript +interface SimpleMessagingConnection { + readonly responseStream: Stream; + readonly sendRequest: (request: string) => void; +} +``` + +## Parsing Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `parseJsonRpcResponse` | `data: unknown` | `JsonRpcResponse` | +| `parseJsonRpcSuccessResponse` | `data: unknown` | `JsonRpcSuccessResponse` | +| `parseJsonRpcErrorResponse` | `data: unknown` | `JsonRpcErrorResponse` | +| `parseJsonRpcRequest` | `data: unknown` | `JsonRpcRequest` | +| `parseJsonRpcId` | `data: unknown` | `JsonRpcId` | + +## Type Guards + +| Function | Parameters | Returns | +|----------|------------|---------| +| `isJsonRpcSuccessResponse` | `response: JsonRpcResponse` | `response is JsonRpcSuccessResponse` | +| `isJsonRpcErrorResponse` | `response: JsonRpcResponse` | `response is JsonRpcErrorResponse` | + +```typescript +import { parseJsonRpcResponse, isJsonRpcErrorResponse } from "@cosmjs/json-rpc"; + +const response = parseJsonRpcResponse(data); + +if (isJsonRpcErrorResponse(response)) { + console.error("RPC error:", response.error.message); +} else { + console.info("Result:", response.result); +} +``` + +## ID Generation + +| Function | Parameters | Returns | +|----------|------------|---------| +| `makeJsonRpcId` | — | `JsonRpcId` | + +## Key Types + +### JsonRpcRequest + +```typescript +interface JsonRpcRequest { + readonly jsonrpc: "2.0"; + readonly id: JsonRpcId; + readonly method: string; + readonly params: Record; +} +``` + +### JsonRpcSuccessResponse + +```typescript +interface JsonRpcSuccessResponse { + readonly jsonrpc: "2.0"; + readonly id: JsonRpcId; + readonly result: any; +} +``` + +### JsonRpcErrorResponse + +```typescript +interface JsonRpcErrorResponse { + readonly jsonrpc: "2.0"; + readonly id: JsonRpcId; + readonly error: JsonRpcError; +} +``` + +### JsonRpcError + +```typescript +interface JsonRpcError { + readonly code: number; + readonly message: string; + readonly data?: string; +} +``` + +### JsonRpcId + +```typescript +type JsonRpcId = number | string; +``` + +### JsonRpcResponse + +```typescript +type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse; +``` + +## Error Codes + +The `jsonRpcCode` object provides standard JSON-RPC 2.0 error codes: + +| Code | Constant | Description | +|------|----------|-------------| +| -32700 | `parseError` | Invalid JSON | +| -32600 | `invalidRequest` | JSON is not a valid request | +| -32601 | `methodNotFound` | Method does not exist | +| -32602 | `invalidParams` | Invalid method parameters | +| -32603 | `internalError` | Internal JSON-RPC error | +| -32000 | `serverError.default` | Server error | diff --git a/cosmjs/v0.38.x/api-reference/ledger-amino.mdx b/cosmjs/v0.38.x/api-reference/ledger-amino.mdx new file mode 100644 index 000000000..8492c600e --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/ledger-amino.mdx @@ -0,0 +1,84 @@ +--- +title: "@cosmjs/ledger-amino" +description: "Ledger hardware wallet integration for Amino signing" +--- + +Provides Ledger hardware wallet support for Amino transaction signing. Implements the `OfflineAminoSigner` interface, making it compatible with `SigningStargateClient` and `SigningCosmWasmClient`. + +```bash +npm install @cosmjs/ledger-amino +``` + + + Requires the Cosmos app installed on your Ledger device and a transport library like `@ledgerhq/hw-transport-webusb` (browser) or `@ledgerhq/hw-transport-node-hid` (Node.js). + + +## LedgerSigner + +Implements `OfflineAminoSigner` using a Ledger hardware wallet. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `transport: Transport`, `options?: LedgerSignerOptions` | `LedgerSigner` | +| `getAccounts` | — | `Promise` | +| `signAmino` | `signerAddress: string`, `signDoc: StdSignDoc` | `Promise` | + +### Options + +```typescript +interface LedgerSignerOptions { + readonly hdPaths?: readonly HdPath[]; + readonly prefix?: string; + readonly ledgerAppName?: string; +} +``` + +### Usage + +```typescript +import TransportWebUSB from "@ledgerhq/hw-transport-webusb"; +import { LedgerSigner } from "@cosmjs/ledger-amino"; +import { makeCosmoshubPath } from "@cosmjs/amino"; +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const transport = await TransportWebUSB.create(); +const signer = new LedgerSigner(transport, { + hdPaths: [makeCosmoshubPath(0)], + prefix: "cosmos", +}); + +const [{ address }] = await signer.getAccounts(); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + signer, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const result = await client.sendTokens( + address, + "cosmos1recipient...", + [{ denom: "uatom", amount: "1000000" }], + "auto", +); +``` + +## LedgerConnector + +Low-level interface for direct communication with the Cosmos Ledger app. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `transport: Transport`, `options?: { ledgerAppName?: string }` | `LedgerConnector` | +| `getPublicKey` | `hdPath: HdPath` | `Promise` | +| `getPubkeyAndAddress` | `hdPath: HdPath`, `prefix: string` | `Promise` | +| `sign` | `message: Uint8Array`, `hdPath: HdPath` | `Promise` | + +### Types + +```typescript +interface AddressAndPubkey { + readonly pubkey: Uint8Array; + readonly address: string; +} +``` diff --git a/cosmjs/v0.38.x/api-reference/math.mdx b/cosmjs/v0.38.x/api-reference/math.mdx new file mode 100644 index 000000000..6f9fc6846 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/math.mdx @@ -0,0 +1,117 @@ +--- +title: "@cosmjs/math" +description: "Safe integer and decimal arithmetic" +--- + +Provides safe integer types and arbitrary-precision decimal arithmetic to prevent JavaScript number precision issues when handling token amounts. + +```bash +npm install @cosmjs/math +``` + +## Uint32 + +32-bit unsigned integer. Range: 0 to 4,294,967,295. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `value: number` | `Uint32` | +| `toNumber` | — | `number` | +| `toString` | — | `string` | +| `toBigInt` | — | `bigint` | + +## Uint53 + +53-bit unsigned integer (JavaScript safe integer range). Range: 0 to 9,007,199,254,740,991. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `value: number` | `Uint53` | +| `toNumber` | — | `number` | +| `toString` | — | `string` | +| `toBigInt` | — | `bigint` | + +## Int53 + +53-bit signed integer. Range: -9,007,199,254,740,991 to 9,007,199,254,740,991. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `value: number` | `Int53` | +| `toNumber` | — | `number` | +| `toString` | — | `string` | +| `toBigInt` | — | `bigint` | + +## Uint64 + +64-bit unsigned integer. Uses string-based internal representation for values beyond JavaScript's safe integer range. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `fromString` (static) | `str: string` | `Uint64` | +| `fromNumber` (static) | `value: number` | `Uint64` | +| `toNumber` | — | `number` | +| `toString` | — | `string` | +| `toBigInt` | — | `bigint` | + +```typescript +import { Uint64 } from "@cosmjs/math"; + +const large = Uint64.fromString("9007199254740993"); +large.toString(); // "9007199254740993" +``` + +## Decimal + +Arbitrary-precision decimal type for safe financial calculations. Internally stores values as integer atomics with a fixed fractional digit count. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `fromAtomics` | `atomics: string`, `fractionalDigits: number` | `Decimal` | +| `fromUserInput` | `input: string`, `fractionalDigits: number` | `Decimal` | +| `zero` | `fractionalDigits: number` | `Decimal` | +| `one` | `fractionalDigits: number` | `Decimal` | +| `fromPlanck` | `planckValue: string`, `fractionalDigits: number` | `Decimal` | + +### Instance Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `plus` | `other: Decimal` | `Decimal` | +| `minus` | `other: Decimal` | `Decimal` | +| `multiply` | `other: Decimal` | `Decimal` | +| `equals` | `other: Decimal` | `boolean` | +| `isLessThan` | `other: Decimal` | `boolean` | +| `isLessThanOrEqual` | `other: Decimal` | `boolean` | +| `isGreaterThan` | `other: Decimal` | `boolean` | +| `isGreaterThanOrEqual` | `other: Decimal` | `boolean` | +| `toString` | — | `string` | +| `toFloatApproximation` | — | `number` | + +### Instance Properties + +| Property | Type | Description | +|----------|------|-------------| +| `atomics` | `string` | Value in smallest unit | +| `fractionalDigits` | `number` | Number of decimal places | + +### Usage + +```typescript +import { Decimal } from "@cosmjs/math"; + +const amount = Decimal.fromAtomics("1000000", 6); +amount.toString(); // "1" +amount.atomics; // "1000000" + +const fee = Decimal.fromAtomics("5000", 6); +const total = amount.plus(fee); +total.toString(); // "1.005" +total.atomics; // "1005000" + +const price = Decimal.fromUserInput("12.5", 6); +const cost = amount.multiply(price); +cost.toString(); // "12.5" +``` diff --git a/cosmjs/v0.38.x/api-reference/proto-signing.mdx b/cosmjs/v0.38.x/api-reference/proto-signing.mdx new file mode 100644 index 000000000..a61e067ed --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/proto-signing.mdx @@ -0,0 +1,195 @@ +--- +title: "@cosmjs/proto-signing" +description: "Protobuf-based transaction signing for Cosmos SDK 0.40+" +--- + +Provides Protobuf Direct signing mode for modern Cosmos SDK chains. This is the preferred signing method for new applications. + +```bash +npm install @cosmjs/proto-signing +``` + +## DirectSecp256k1HdWallet + +HD wallet using BIP-39 mnemonic with Protobuf Direct signing. Implements `OfflineDirectSigner`. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `generate` | `length?: 12 \| 15 \| 18 \| 21 \| 24`, `options?: Partial` | `Promise` | +| `fromMnemonic` | `mnemonic: string`, `options?: Partial` | `Promise` | +| `deserialize` | `serialization: string`, `password: string` | `Promise` | +| `deserializeWithEncryptionKey` | `serialization: string`, `encryptionKey: Uint8Array` | `Promise` | + +### Instance Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `getAccounts` | — | `Promise` | +| `signDirect` | `signerAddress: string`, `signDoc: SignDoc` | `Promise` | +| `serialize` | `password: string` | `Promise` | +| `serializeWithEncryptionKey` | `encryptionKey: Uint8Array`, `kdfConfiguration: KdfConfiguration` | `Promise` | + +### Instance Properties + +| Property | Type | +|----------|------| +| `mnemonic` | `string` | + +### Options + +```typescript +interface DirectSecp256k1HdWalletOptions { + readonly bip39Password: string; // default: "" + readonly hdPaths: readonly HdPath[]; // default: [makeCosmoshubPath(0)] + readonly prefix: string; // default: "cosmos" +} +``` + +### Usage + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.generate(24, { prefix: "cosmos" }); +const [{ address, pubkey }] = await wallet.getAccounts(); + +const restored = await DirectSecp256k1HdWallet.fromMnemonic(wallet.mnemonic, { + prefix: "osmo", + hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1)], +}); +``` + +## DirectSecp256k1Wallet + +Single-key wallet for Protobuf Direct signing. Implements `OfflineDirectSigner`. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `fromKey` (static) | `privkey: Uint8Array`, `prefix?: string` | `Promise` | +| `getAccounts` | — | `Promise` | +| `signDirect` | `address: string`, `signDoc: SignDoc` | `Promise` | + +## DirectEthSecp256k1HdWallet + +HD wallet using Ethereum's secp256k1 curve for chains with EVM compatibility. Same API as `DirectSecp256k1HdWallet`. + +## DirectEthSecp256k1Wallet + +Single-key wallet using Ethereum's secp256k1 curve. Same API as `DirectSecp256k1Wallet`. + +## Registry + +Maps type URLs to protobuf codec implementations for encoding and decoding messages. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `customTypes?: Iterable<[string, GeneratedType]>` | `Registry` | +| `register` | `typeUrl: string`, `type: GeneratedType` | `void` | +| `lookupType` | `typeUrl: string` | `GeneratedType \| undefined` | +| `encode` | `encodeObject: EncodeObject` | `Uint8Array` | +| `encodeAsAny` | `encodeObject: EncodeObject` | `Any` | +| `encodeTxBody` | `txBodyFields: TxBodyValue` | `Uint8Array` | +| `decode` | `decodeObject: DecodeObject` | `any` | +| `decodeTxBody` | `txBody: Uint8Array` | `TxBody` | + +### Usage + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes } from "@cosmjs/stargate"; +import { MsgSend } from "cosmjs-types/cosmos/bank/v1beta1/tx"; + +const registry = new Registry(defaultRegistryTypes); +registry.register("/my.custom.MsgCustom", MsgCustom); + +const encoded = registry.encode({ + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: MsgSend.fromPartial({ + fromAddress: "cosmos1sender...", + toAddress: "cosmos1recipient...", + amount: [{ denom: "uatom", amount: "1000" }], + }), +}); +``` + +## Key Types + +### EncodeObject + +```typescript +interface EncodeObject { + readonly typeUrl: string; + readonly value: any; +} +``` + +### DecodeObject + +```typescript +interface DecodeObject { + readonly typeUrl: string; + readonly value: Uint8Array; +} +``` + +### TxBodyEncodeObject + +```typescript +interface TxBodyEncodeObject extends EncodeObject { + readonly typeUrl: "/cosmos.tx.v1beta1.TxBody"; + readonly value: TxBodyValue; +} +``` + +### AccountData + +```typescript +interface AccountData { + readonly address: string; + readonly algo: Algo; + readonly pubkey: Uint8Array; +} +``` + +### OfflineDirectSigner + +```typescript +interface OfflineDirectSigner { + readonly getAccounts: () => Promise; + readonly signDirect: (signerAddress: string, signDoc: SignDoc) => Promise; +} +``` + +### OfflineSigner + +```typescript +type OfflineSigner = OfflineAminoSigner | OfflineDirectSigner; +``` + +### DecodedTxRaw + +```typescript +interface DecodedTxRaw { + readonly authInfo: AuthInfo; + readonly body: TxBody; + readonly signatures: readonly Uint8Array[]; +} +``` + +## Helper Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `makeAuthInfoBytes` | `signers: readonly SignerData[]`, `feeAmount: readonly Coin[]`, `gasLimit: number`, `feeGranter?: string`, `feePayer?: string`, `signMode?: SignMode` | `Uint8Array` | +| `makeSignDoc` | `bodyBytes: Uint8Array`, `authInfoBytes: Uint8Array`, `chainId: string`, `accountNumber: number` | `SignDoc` | +| `makeSignBytes` | `signDoc: SignDoc` | `Uint8Array` | +| `decodeTxRaw` | `tx: Uint8Array` | `DecodedTxRaw` | +| `encodePubkey` | `pubkey: Pubkey` | `Any` | +| `decodePubkey` | `pubkey: Any \| null` | `Pubkey \| null` | +| `makeCosmoshubPath` | `account: number` | `HdPath` | +| `coin` | `amount: number \| string`, `denom: string` | `Coin` | +| `coins` | `amount: number \| string`, `denom: string` | `Coin[]` | +| `parseCoins` | `input: string` | `Coin[]` | +| `extractKdfConfiguration` | `serialization: string` | `KdfConfiguration` | diff --git a/cosmjs/v0.38.x/api-reference/socket.mdx b/cosmjs/v0.38.x/api-reference/socket.mdx new file mode 100644 index 000000000..a7cde82c0 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/socket.mdx @@ -0,0 +1,99 @@ +--- +title: "@cosmjs/socket" +description: "Cross-platform WebSocket client utilities" +--- + +Low-level WebSocket client for browser and Node.js environments. Used internally by `@cosmjs/tendermint-rpc` for WebSocket connections and streaming subscriptions. + +```bash +npm install @cosmjs/socket +``` + +## SocketWrapper + +Thin abstraction over the native WebSocket API that works in both browsers and Node.js. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `url: string`, `messageHandler: (event: SocketWrapperMessageEvent) => void`, `errorHandler?: (event: SocketWrapperErrorEvent) => void`, `openHandler?: () => void`, `closeHandler?: (event: SocketWrapperCloseEvent) => void` | `SocketWrapper` | +| `connect` | — | `void` | +| `disconnect` | — | `void` | +| `send` | `data: string` | `void` | + +## StreamingSocket + +WebSocket client that exposes received messages as an xstream `Stream`. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `url: string`, `timeout?: number` | `StreamingSocket` | +| `connect` | — | `void` | +| `disconnect` | — | `void` | +| `send` | `data: string` | `void` | + +| Property | Type | +|----------|------| +| `events` | `Stream` | + +## ReconnectingSocket + +WebSocket client with automatic reconnection logic. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `url: string`, `reconnectInterval?: number`, `timeout?: number` | `ReconnectingSocket` | +| `connect` | — | `void` | +| `disconnect` | — | `void` | +| `send` | `data: string` | `void` | + +| Property | Type | +|----------|------| +| `events` | `Stream` | + +## QueueingStreamingSocket + +WebSocket that queues outgoing messages until the connection is established. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `url: string`, `timeout?: number` | `QueueingStreamingSocket` | +| `connect` | — | `void` | +| `disconnect` | — | `void` | +| `send` | `data: string` | `void` | +| `getQueueLength` | — | `number` | + +| Property | Type | +|----------|------| +| `events` | `Stream` | +| `connectionStatus` | `ValueAndUpdates` | + +## Event Types + +```typescript +interface SocketWrapperMessageEvent { + readonly data: string; + readonly type: string; +} + +interface SocketWrapperErrorEvent { + readonly message: string; + readonly type: string; +} + +interface SocketWrapperCloseEvent { + readonly wasClean: boolean; + readonly code: number; +} +``` + +## ConnectionStatus + +```typescript +enum ConnectionStatus { + Unconnected = "unconnected", + Connecting = "connecting", + Connected = "connected", + Disconnecting = "disconnecting", + Disconnected = "disconnected", +} +``` diff --git a/cosmjs/v0.38.x/api-reference/stargate.mdx b/cosmjs/v0.38.x/api-reference/stargate.mdx new file mode 100644 index 000000000..b1b3b4e16 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/stargate.mdx @@ -0,0 +1,316 @@ +--- +title: "@cosmjs/stargate" +description: "High-level client for Cosmos SDK 0.40+ (Stargate) chains" +--- + +The primary client library for interacting with Cosmos SDK chains. Provides read-only querying via `StargateClient` and transaction signing/broadcasting via `SigningStargateClient`. + +```bash +npm install @cosmjs/stargate +``` + +## StargateClient + +Read-only client for querying blockchain state. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connect` | `endpoint: string \| HttpEndpoint`, `options?: StargateClientOptions` | `Promise` | +| `create` | `cometClient: CometClient`, `options?: StargateClientOptions` | `StargateClient` | + +### Instance Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `getChainId` | — | `Promise` | +| `getHeight` | — | `Promise` | +| `getAccount` | `searchAddress: string` | `Promise` | +| `getSequence` | `address: string` | `Promise` | +| `getBlock` | `height?: number` | `Promise` | +| `getBalance` | `address: string`, `searchDenom: string` | `Promise` | +| `getAllBalances` | `address: string` | `Promise` | +| `getBalanceStaked` | `address: string` | `Promise` | +| `getDelegation` | `delegatorAddress: string`, `validatorAddress: string` | `Promise` | +| `getTx` | `id: string` | `Promise` | +| `searchTx` | `query: SearchTxQuery` | `Promise` | +| `broadcastTx` | `tx: Uint8Array`, `timeoutMs?: number`, `pollIntervalMs?: number` | `Promise` | +| `broadcastTxSync` | `tx: Uint8Array` | `Promise` | +| `disconnect` | — | `void` | + +### Usage + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const balance = await client.getBalance("cosmos1...", "uatom"); +const account = await client.getAccount("cosmos1..."); +const block = await client.getBlock(); +const tx = await client.getTx("ABC123..."); + +client.disconnect(); +``` + +## SigningStargateClient + +Extends `StargateClient` with transaction signing and broadcasting. Inherits all read-only methods above. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connectWithSigner` | `endpoint: string \| HttpEndpoint`, `signer: OfflineSigner`, `options?: SigningStargateClientOptions` | `Promise` | +| `createWithSigner` | `cometClient: CometClient`, `signer: OfflineSigner`, `options?: SigningStargateClientOptions` | `SigningStargateClient` | +| `offline` | `signer: OfflineSigner`, `options?: SigningStargateClientOptions` | `Promise` | + +### Instance Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `simulate` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `memo: string \| undefined` | `Promise` | +| `sendTokens` | `senderAddress: string`, `recipientAddress: string`, `amount: readonly Coin[]`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `delegateTokens` | `delegatorAddress: string`, `validatorAddress: string`, `amount: Coin`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `undelegateTokens` | `delegatorAddress: string`, `validatorAddress: string`, `amount: Coin`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `withdrawRewards` | `delegatorAddress: string`, `validatorAddress: string`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `signAndBroadcast` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `fee: StdFee \| "auto" \| number`, `memo?: string`, `timeoutHeight?: bigint` | `Promise` | +| `signAndBroadcastSync` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `fee: StdFee \| "auto" \| number`, `memo?: string`, `timeoutHeight?: bigint` | `Promise` | +| `sign` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `fee: StdFee`, `memo: string`, `explicitSignerData?: SignerData`, `timeoutHeight?: bigint` | `Promise` | + +### Instance Properties + +| Property | Type | +|----------|------| +| `registry` | `Registry` | +| `broadcastTimeoutMs` | `number \| undefined` | +| `broadcastPollIntervalMs` | `number \| undefined` | + +### Usage + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ..."); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const result = await client.sendTokens( + address, + "cosmos1recipient...", + [{ denom: "uatom", amount: "1000000" }], + "auto", +); + +await client.signAndBroadcast(address, [msg], "auto", "memo"); +``` + +## GasPrice + +Represents a gas price as an amount and denomination. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `amount: Decimal`, `denom: string` | `GasPrice` | +| `fromString` (static) | `gasPrice: string` | `GasPrice` | +| `toString` | — | `string` | + +| Property | Type | +|----------|------| +| `amount` | `Decimal` | +| `denom` | `string` | + +## calculateFee + +Calculates transaction fees from a gas limit and gas price. + +```typescript +function calculateFee(gasLimit: number, gasPrice: GasPrice | string): StdFee +``` + +```typescript +import { calculateFee, GasPrice } from "@cosmjs/stargate"; + +const fee = calculateFee(200_000, GasPrice.fromString("0.025uatom")); +// { amount: [{ denom: "uatom", amount: "5000" }], gas: "200000" } +``` + +## QueryClient + +Base query client that supports modular extensions. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `withExtensions` (static) | `cometClient: CometClient`, `...extensionSetups: QueryExtensionSetup[]` | `QueryClient & Extensions` | +| `queryAbci` | `path: string`, `request: Uint8Array`, `desiredHeight?: number` | `Promise` | + +### Query Extensions + +Setup functions to add module-specific query methods: + +| Function | Namespace | Key Methods | +|----------|-----------|-------------| +| `setupBankExtension` | `bank` | `balance`, `allBalances`, `totalSupply`, `supplyOf` | +| `setupStakingExtension` | `staking` | `validators`, `delegation`, `delegatorDelegations`, `unbondingDelegation` | +| `setupGovExtension` | `gov` | `proposals`, `proposal`, `deposits`, `votes`, `tally` | +| `setupDistributionExtension` | `distribution` | `delegationRewards`, `delegationTotalRewards`, `communityPool` | +| `setupMintExtension` | `mint` | `inflation`, `annualProvisions`, `params` | +| `setupAuthExtension` | `auth` | `account`, `accounts` | +| `setupIbcExtension` | `ibc` | `channel.channel`, `channel.channels`, `transfer.denomTrace` | +| `setupTxExtension` | `tx` | `getTx`, `simulate` | +| `setupSlashingExtension` | `slashing` | `signingInfos`, `params` | +| `setupFeegrantExtension` | `feegrant` | `allowance`, `allowances` | +| `setupAuthzExtension` | `authz` | `grants` | + +```typescript +import { QueryClient, setupBankExtension, setupStakingExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions( + cometClient, + setupBankExtension, + setupStakingExtension, +); + +const balance = await queryClient.bank.balance("cosmos1...", "uatom"); +const validators = await queryClient.staking.validators("BOND_STATUS_BONDED"); +``` + +## AminoTypes + +Manages conversion between Protobuf messages and Amino JSON format. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `types: AminoConverters` | `AminoTypes` | +| `toAmino` | `encodeObject: EncodeObject` | `AminoMsg` | +| `fromAmino` | `aminoMsg: AminoMsg` | `EncodeObject` | + +## Key Types + +### DeliverTxResponse + +```typescript +interface DeliverTxResponse { + readonly height: number; + readonly txIndex: number; + readonly code: number; + readonly transactionHash: string; + readonly events: readonly Event[]; + readonly rawLog?: string; + readonly msgResponses: Array<{ readonly typeUrl: string; readonly value: Uint8Array }>; + readonly gasUsed: bigint; + readonly gasWanted: bigint; +} +``` + +### IndexedTx + +```typescript +interface IndexedTx { + readonly height: number; + readonly txIndex: number; + readonly hash: string; + readonly code: number; + readonly events: readonly Event[]; + readonly rawLog: string; + readonly tx: Uint8Array; + readonly msgResponses: Array<{ readonly typeUrl: string; readonly value: Uint8Array }>; + readonly gasUsed: bigint; + readonly gasWanted: bigint; +} +``` + +### Block + +```typescript +interface Block { + readonly id: string; + readonly header: BlockHeader; + readonly txs: readonly Uint8Array[]; +} +``` + +### BlockHeader + +```typescript +interface BlockHeader { + readonly version: { readonly block: string; readonly app: string }; + readonly height: number; + readonly chainId: string; + readonly time: string; +} +``` + +### SigningStargateClientOptions + +```typescript +interface SigningStargateClientOptions extends StargateClientOptions { + readonly registry?: Registry; + readonly aminoTypes?: AminoTypes; + readonly broadcastTimeoutMs?: number; + readonly broadcastPollIntervalMs?: number; + readonly gasPrice?: GasPrice | DynamicGasPriceConfig; +} +``` + +### SignerData + +```typescript +interface SignerData { + readonly accountNumber: number; + readonly sequence: number; + readonly chainId: string; +} +``` + +### Account + +```typescript +interface Account { + readonly address: string; + readonly pubkey: Pubkey | null; + readonly accountNumber: number; + readonly sequence: number; +} +``` + +### SequenceResponse + +```typescript +interface SequenceResponse { + readonly accountNumber: number; + readonly sequence: number; +} +``` + +## Helper Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `assertIsDeliverTxSuccess` | `result: DeliverTxResponse` | `void` (throws on failure) | +| `assertIsDeliverTxFailure` | `result: DeliverTxResponse` | `void` (throws on success) | +| `isDeliverTxSuccess` | `result: DeliverTxResponse` | `boolean` | +| `isDeliverTxFailure` | `result: DeliverTxResponse` | `boolean` | +| `coin` | `amount: number \| string`, `denom: string` | `Coin` | +| `coins` | `amount: number \| string`, `denom: string` | `Coin[]` | +| `parseCoins` | `input: string` | `Coin[]` | +| `makeCosmoshubPath` | `account: number` | `HdPath` | +| `createPagination` | `paginationKey?: Uint8Array` | `PageRequest \| undefined` | +| `createProtobufRpcClient` | `base: QueryClient` | `ProtobufRpcClient` | +| `decodeCosmosSdkDecFromProto` | `input: string \| Uint8Array` | `Decimal` | + +## Error Classes + +| Class | Description | +|-------|-------------| +| `BroadcastTxError` | Thrown when a transaction fails during broadcast | +| `TimeoutError` | Thrown when broadcast times out waiting for inclusion | diff --git a/cosmjs/v0.38.x/api-reference/stream.mdx b/cosmjs/v0.38.x/api-reference/stream.mdx new file mode 100644 index 000000000..b4ed5e5ff --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/stream.mdx @@ -0,0 +1,66 @@ +--- +title: "@cosmjs/stream" +description: "Reactive stream utilities built on xstream" +--- + +Provides reactive stream utilities for handling asynchronous data flows. Used internally by `@cosmjs/tendermint-rpc` for WebSocket subscriptions. + +```bash +npm install @cosmjs/stream +``` + +## DefaultValueProducer + +An xstream `Producer` that stores a current value and emits updates. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `value: T`, `callbacks?: DefaultValueProducerCallsbacks` | `DefaultValueProducer` | +| `update` | `value: T` | `void` | +| `error` | `error: any` | `void` | + +| Property | Type | +|----------|------| +| `value` | `T` | + +```typescript +interface DefaultValueProducerCallsbacks { + readonly onStarted?: () => void; + readonly onStop?: () => void; +} +``` + +## ValueAndUpdates + +Wraps a `DefaultValueProducer` to expose both the current value and a stream of updates. + +| Property | Type | +|----------|------| +| `value` | `T` | +| `updates` | `Stream` | + +## Promise Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toListPromise` | `stream: Stream`, `count: number` | `Promise` | +| `firstEvent` | `stream: Stream` | `Promise` | +| `fromListPromise` | `promise: Promise>` | `Stream` | + +```typescript +import { toListPromise, firstEvent } from "@cosmjs/stream"; + +const first = await firstEvent(stream); +const items = await toListPromise(stream, 5); +``` + +## Stream Operators + +| Function | Parameters | Returns | +|----------|------------|---------| +| `concat` | `...streams: Array>` | `Stream` | +| `dropDuplicates` | `comparator?: (a: T, b: T) => boolean` | `SameTypeStreamOperator` | + +## Reducer + +Utilities for applying reducer patterns to streams. diff --git a/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx b/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx new file mode 100644 index 000000000..0b4603300 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx @@ -0,0 +1,172 @@ +--- +title: "@cosmjs/tendermint-rpc" +description: "Tendermint/CometBFT RPC client for HTTP and WebSocket" +--- + +Low-level RPC client for communicating with Tendermint/CometBFT nodes. Supports HTTP and WebSocket transports, and auto-detects the node version. + +```bash +npm install @cosmjs/tendermint-rpc +``` + +## connectComet + +Auto-detects the CometBFT/Tendermint version and returns the appropriate client. + +```typescript +function connectComet(endpoint: string | HttpEndpoint): Promise +``` + +```typescript +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const client = await connectComet("https://rpc.my-chain.network"); +const status = await client.status(); +``` + +## CometClient Interface + +All version-specific clients (`Tendermint37Client`, `Comet38Client`, `Comet1Client`) implement this interface. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `status` | — | `Promise` | +| `block` | `height?: number` | `Promise` | +| `blockResults` | `height?: number` | `Promise` | +| `blockchain` | `minHeight?: number`, `maxHeight?: number` | `Promise` | +| `tx` | `params: TxParams` | `Promise` | +| `txSearch` | `params: TxSearchParams` | `Promise` | +| `validators` | `params: ValidatorsParams` | `Promise` | +| `broadcastTxSync` | `params: BroadcastTxParams` | `Promise` | +| `broadcastTxAsync` | `params: BroadcastTxParams` | `Promise` | +| `broadcastTxCommit` | `params: BroadcastTxParams` | `Promise` | +| `abciQuery` | `params: AbciQueryParams` | `Promise` | +| `disconnect` | — | `void` | + +## Version-Specific Clients + +### Tendermint37Client + +For Tendermint 0.37 nodes. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connect` (static) | `endpoint: string \| HttpEndpoint` | `Promise` | +| `create` (static) | `rpcClient: RpcClient` | `Tendermint37Client` | + +### Comet38Client + +For CometBFT 0.38 nodes. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connect` (static) | `endpoint: string \| HttpEndpoint` | `Promise` | +| `create` (static) | `rpcClient: RpcClient` | `Comet38Client` | + +### Comet1Client + +For CometBFT 1.x nodes. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connect` (static) | `endpoint: string \| HttpEndpoint` | `Promise` | +| `create` (static) | `rpcClient: RpcClient` | `Comet1Client` | + +## Type Guards + +| Function | Parameters | Returns | +|----------|------------|---------| +| `isTendermint37Client` | `client: CometClient` | `boolean` | +| `isComet38Client` | `client: CometClient` | `boolean` | +| `isComet1Client` | `client: CometClient` | `boolean` | + +## RPC Clients + +Low-level HTTP and WebSocket implementations. + +### HttpClient + +Standard HTTP client for request/response RPC. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `endpoint: string \| HttpEndpoint` | `HttpClient` | +| `execute` | `request: JsonRpcRequest` | `Promise` | +| `disconnect` | — | `void` | + +### HttpBatchClient + +Batches multiple RPC requests into a single HTTP call. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `endpoint: string \| HttpEndpoint`, `options?: HttpBatchClientOptions` | `HttpBatchClient` | +| `execute` | `request: JsonRpcRequest` | `Promise` | +| `disconnect` | — | `void` | + +```typescript +interface HttpBatchClientOptions { + readonly dispatchInterval: number; + readonly batchSizeLimit: number; +} +``` + +### WebsocketClient + +WebSocket client for streaming subscriptions. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `endpoint: string`, `onError?: (err: any) => void` | `WebsocketClient` | +| `execute` | `request: JsonRpcRequest` | `Promise` | +| `listen` | `request: JsonRpcRequest` | `Stream` | +| `disconnect` | — | `void` | + +## Key Types + +### HttpEndpoint + +```typescript +interface HttpEndpoint { + readonly url: string; + readonly headers: Record; +} +``` + +### RpcClient + +```typescript +interface RpcClient { + readonly execute: (request: JsonRpcRequest) => Promise; + readonly disconnect: () => void; +} +``` + +### BlockIdFlag + +```typescript +enum BlockIdFlag { + Unknown = 0, + Absent = 1, + Commit = 2, + Nil = 3, +} +``` + +## Date Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `fromRfc3339WithNanoseconds` | `str: string` | `ReadonlyDateWithNanoseconds` | +| `toRfc3339WithNanoseconds` | `date: ReadonlyDateWithNanoseconds` | `string` | +| `fromSeconds` | `seconds: number`, `nanos?: number` | `ReadonlyDateWithNanoseconds` | +| `toSeconds` | `date: ReadonlyDateWithNanoseconds` | `{ seconds: number; nanos: number }` | + +## Address Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `pubkeyToAddress` | `type: string`, `data: Uint8Array` | `Uint8Array` | +| `pubkeyToRawAddress` | `type: string`, `data: Uint8Array` | `Uint8Array` | +| `rawSecp256k1PubkeyToRawAddress` | `pubkeyRaw: Uint8Array` | `Uint8Array` | +| `rawEd25519PubkeyToRawAddress` | `pubkeyRaw: Uint8Array` | `Uint8Array` | diff --git a/cosmjs/v0.38.x/api-reference/utils.mdx b/cosmjs/v0.38.x/api-reference/utils.mdx new file mode 100644 index 000000000..4fea3c148 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/utils.mdx @@ -0,0 +1,60 @@ +--- +title: "@cosmjs/utils" +description: "Assertion and utility helpers" +--- + +Lightweight utility functions for assertions, type guards, and async helpers used throughout CosmJS. + +```bash +npm install @cosmjs/utils +``` + +## Assertions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `assert` | `condition: any`, `msg?: string` | `void` (throws if falsy) | +| `assertDefined` | `value: T \| undefined`, `msg?: string` | `void` (throws if undefined) | +| `assertDefinedAndNotNull` | `value: T \| undefined \| null`, `msg?: string` | `void` (throws if null/undefined) | + +```typescript +import { assert, assertDefined } from "@cosmjs/utils"; + +assert(amount > 0, "Amount must be positive"); +assertDefined(account, "Account not found"); +``` + +## Type Guards + +| Function | Parameters | Returns | +|----------|------------|---------| +| `isDefined` | `value: T \| undefined` | `value is T` | +| `isNonNullObject` | `value: unknown` | `value is Record` | +| `isUint8Array` | `value: unknown` | `value is Uint8Array` | + +```typescript +import { isDefined, isNonNullObject } from "@cosmjs/utils"; + +if (isDefined(optional)) { + optional.property; // TypeScript knows it's defined +} +``` + +## Async Helpers + +| Function | Parameters | Returns | +|----------|------------|---------| +| `sleep` | `ms: number` | `Promise` | + +```typescript +import { sleep } from "@cosmjs/utils"; + +await sleep(1000); // wait 1 second +``` + +## Array Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `arrayContentEquals` | `a: ArrayLike`, `b: ArrayLike` | `boolean` | +| `arrayContentStartsWith` | `a: ArrayLike`, `b: ArrayLike` | `boolean` | diff --git a/cosmjs/v0.38.x/concepts/account/account.mdx b/cosmjs/v0.38.x/concepts/account/account.mdx index 6b3ad9611..e92656766 100644 --- a/cosmjs/v0.38.x/concepts/account/account.mdx +++ b/cosmjs/v0.38.x/concepts/account/account.mdx @@ -30,7 +30,7 @@ You can query any account with a read-only client: ```typescript import { StargateClient } from "@cosmjs/stargate"; -const client = await StargateClient.connect("https://rpc.cosmos.network"); +const client = await StargateClient.connect("https://rpc.my-chain.network"); const account = await client.getAccount("cosmos1..."); // { address: "cosmos1...", pubkey: {...}, accountNumber: 47, sequence: 12 } ``` diff --git a/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx b/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx index 5520d480d..728dc1690 100644 --- a/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx +++ b/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx @@ -24,7 +24,7 @@ const signer = window.keplr.getOfflineSigner(chainId); // 3. Use it exactly like a local wallet const client = await SigningStargateClient.connectWithSigner( - "https://rpc.cosmos.network", + "https://rpc.my-chain.network", signer, { gasPrice: GasPrice.fromString("0.025uatom") }, ); diff --git a/cosmjs/v0.38.x/concepts/account/local-wallets.mdx b/cosmjs/v0.38.x/concepts/account/local-wallets.mdx index 81a39fe7c..7ae3e0c0e 100644 --- a/cosmjs/v0.38.x/concepts/account/local-wallets.mdx +++ b/cosmjs/v0.38.x/concepts/account/local-wallets.mdx @@ -37,7 +37,7 @@ Both implement `OfflineSigner` and can be passed directly to import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; const client = await SigningStargateClient.connectWithSigner( - "https://rpc.cosmos.network", + "https://rpc.my-chain.network", wallet, { gasPrice: GasPrice.fromString("0.025uatom") }, ); diff --git a/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx b/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx index a13d179da..da6557eab 100644 --- a/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx +++ b/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx @@ -25,7 +25,7 @@ The primary read-only client for Cosmos SDK chains. ```typescript import { StargateClient } from "@cosmjs/stargate"; -const client = await StargateClient.connect("https://rpc.cosmos.network"); +const client = await StargateClient.connect("https://rpc.my-chain.network"); ``` ### Factory Methods @@ -73,7 +73,7 @@ methods as `StargateClient` plus smart contract queries. ```typescript import { CosmWasmClient } from "@cosmjs/cosmwasm"; -const client = await CosmWasmClient.connect("https://rpc.osmosis.zone"); +const client = await CosmWasmClient.connect("https://rpc.my-chain.network"); ``` ### CosmWasm-Specific Query Methods @@ -116,7 +116,7 @@ import { setupDistributionExtension, } from "@cosmjs/stargate"; -const cometClient = await connectComet("https://rpc.cosmos.network"); +const cometClient = await connectComet("https://rpc.my-chain.network"); const queryClient = QueryClient.withExtensions( cometClient, setupBankExtension, diff --git a/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx index c2f5c2671..474122d6f 100644 --- a/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx +++ b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx @@ -35,7 +35,7 @@ const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; const client = await SigningStargateClient.connectWithSigner( - "https://rpc.cosmos.network", + "https://rpc.my-chain.network", wallet, { gasPrice: GasPrice.fromString("0.025uatom") }, ); @@ -109,7 +109,7 @@ Extends `CosmWasmClient` with signing and smart contract transaction methods. import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; const client = await SigningCosmWasmClient.connectWithSigner( - "https://rpc.osmosis.zone", + "https://rpc.my-chain.network", wallet, { gasPrice: GasPrice.fromString("0.025uosmo") }, ); diff --git a/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx b/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx index 04f863319..a0941b5cd 100644 --- a/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx +++ b/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx @@ -31,7 +31,7 @@ const dynamicConfig: DynamicGasPriceConfig = { }; const client = await SigningStargateClient.connectWithSigner( - "https://rpc.cosmos.network", + "https://rpc.my-chain.network", wallet, { gasPrice: dynamicConfig }, ); diff --git a/cosmjs/v0.38.x/concepts/fees-gas/fee-grants.mdx b/cosmjs/v0.38.x/concepts/fees-gas/fee-grants.mdx index ff1bd28de..9cece0ae5 100644 --- a/cosmjs/v0.38.x/concepts/fees-gas/fee-grants.mdx +++ b/cosmjs/v0.38.x/concepts/fees-gas/fee-grants.mdx @@ -37,7 +37,7 @@ import { } from "@cosmjs/stargate"; import { connectComet } from "@cosmjs/tendermint-rpc"; -const cometClient = await connectComet("https://rpc.cosmos.network"); +const cometClient = await connectComet("https://rpc.my-chain.network"); const queryClient = QueryClient.withExtensions( cometClient, setupFeegrantExtension, diff --git a/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx b/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx index 42f93d5b5..e92244345 100644 --- a/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx +++ b/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx @@ -57,7 +57,7 @@ const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { }); const client = await SigningStargateClient.connectWithSigner( - "https://rpc.cosmos.network", + "https://rpc.my-chain.network", wallet, { gasPrice: GasPrice.fromString("0.025uatom") }, ); diff --git a/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx b/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx index dac4db193..7aab6b1f7 100644 --- a/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx +++ b/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx @@ -24,7 +24,7 @@ const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { const [{ address }] = await wallet.getAccounts(); const client = await SigningStargateClient.connectWithSigner( - "https://rpc.cosmos.network", + "https://rpc.my-chain.network", wallet, { gasPrice: GasPrice.fromString("0.025uatom") }, ); diff --git a/cosmjs/v0.38.x/concepts/transports/http.mdx b/cosmjs/v0.38.x/concepts/transports/http.mdx index 4335129e0..9c9a3a679 100644 --- a/cosmjs/v0.38.x/concepts/transports/http.mdx +++ b/cosmjs/v0.38.x/concepts/transports/http.mdx @@ -16,7 +16,7 @@ sends one JSON-RPC POST request per `execute()` call using the platform's ```typescript import { HttpClient } from "@cosmjs/tendermint-rpc"; -const client = new HttpClient("https://rpc.cosmos.network"); +const client = new HttpClient("https://rpc.my-chain.network"); ``` ### Custom Headers @@ -28,7 +28,7 @@ request: import { HttpClient, HttpEndpoint } from "@cosmjs/tendermint-rpc"; const endpoint: HttpEndpoint = { - url: "https://rpc.cosmos.network", + url: "https://rpc.my-chain.network", headers: { Authorization: "Bearer ", }, @@ -43,7 +43,7 @@ the underlying `fetch` call uses `AbortSignal.timeout()` to abort if the server doesn't respond in time: ```typescript -const client = new HttpClient("https://rpc.cosmos.network", 10_000); +const client = new HttpClient("https://rpc.my-chain.network", 10_000); ``` If omitted, requests have no timeout (they rely on the runtime's default @@ -78,7 +78,7 @@ reduces HTTP overhead when you need to make many queries in a short time. ```typescript import { HttpBatchClient } from "@cosmjs/tendermint-rpc"; -const client = new HttpBatchClient("https://rpc.cosmos.network"); +const client = new HttpBatchClient("https://rpc.my-chain.network"); ``` ### Options @@ -92,7 +92,7 @@ interface HttpBatchClientOptions { ``` ```typescript -const client = new HttpBatchClient("https://rpc.cosmos.network", { +const client = new HttpBatchClient("https://rpc.my-chain.network", { batchSizeLimit: 10, dispatchInterval: 50, httpTimeout: 30_000, @@ -120,7 +120,7 @@ multiple contract states. Instead of N separate HTTP round-trips, you get one. ```typescript import { Comet38Client, HttpBatchClient } from "@cosmjs/tendermint-rpc"; -const batchClient = new HttpBatchClient("https://rpc.cosmos.network", { +const batchClient = new HttpBatchClient("https://rpc.my-chain.network", { batchSizeLimit: 10, dispatchInterval: 50, }); diff --git a/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx b/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx index 5aea81d30..345c3fee2 100644 --- a/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx +++ b/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx @@ -54,10 +54,10 @@ the transport is selected based on the URL protocol: ```typescript // HTTP transport (default for most use cases) -const client = await StargateClient.connect("https://rpc.cosmos.network"); +const client = await StargateClient.connect("https://rpc.my-chain.network"); // WebSocket transport (needed for subscriptions) -const client = await StargateClient.connect("wss://rpc.cosmos.network"); +const client = await StargateClient.connect("wss://rpc.my-chain.network"); ``` ## Manual Transport Configuration @@ -71,7 +71,7 @@ import { StargateClient } from "@cosmjs/stargate"; import { Comet38Client, HttpClient } from "@cosmjs/tendermint-rpc"; // HTTP with 15-second timeout -const rpcClient = new HttpClient("https://rpc.cosmos.network", 15_000); +const rpcClient = new HttpClient("https://rpc.my-chain.network", 15_000); const cometClient = await Comet38Client.create(rpcClient); const client = StargateClient.create(cometClient); ``` @@ -81,7 +81,7 @@ import { StargateClient } from "@cosmjs/stargate"; import { Comet38Client, HttpBatchClient } from "@cosmjs/tendermint-rpc"; // Batched HTTP with custom options -const rpcClient = new HttpBatchClient("https://rpc.cosmos.network", { +const rpcClient = new HttpBatchClient("https://rpc.my-chain.network", { batchSizeLimit: 10, dispatchInterval: 50, httpTimeout: 15_000, diff --git a/cosmjs/v0.38.x/concepts/transports/websocket.mdx b/cosmjs/v0.38.x/concepts/transports/websocket.mdx index 83f9e678c..39e2d76e8 100644 --- a/cosmjs/v0.38.x/concepts/transports/websocket.mdx +++ b/cosmjs/v0.38.x/concepts/transports/websocket.mdx @@ -12,7 +12,7 @@ queries and event subscriptions. It is the only transport that supports ```typescript import { WebsocketClient } from "@cosmjs/tendermint-rpc"; -const client = new WebsocketClient("wss://rpc.cosmos.network"); +const client = new WebsocketClient("wss://rpc.my-chain.network"); ``` The client automatically appends `/websocket` to the URL (the standard CometBFT @@ -27,7 +27,7 @@ replacement for `HttpClient` when you need a persistent connection: ```typescript import { Comet38Client, WebsocketClient } from "@cosmjs/tendermint-rpc"; -const wsClient = new WebsocketClient("wss://rpc.cosmos.network"); +const wsClient = new WebsocketClient("wss://rpc.my-chain.network"); const cometClient = await Comet38Client.create(wsClient); ``` @@ -57,7 +57,7 @@ The CometBFT client classes provide typed subscription helpers: ```typescript import { Comet38Client, WebsocketClient } from "@cosmjs/tendermint-rpc"; -const wsClient = new WebsocketClient("wss://rpc.cosmos.network"); +const wsClient = new WebsocketClient("wss://rpc.my-chain.network"); const cometClient = await Comet38Client.create(wsClient); const newBlocks = cometClient.subscribeNewBlock(); diff --git a/cosmjs/v0.38.x/guides/connect/connect.mdx b/cosmjs/v0.38.x/guides/connect/connect.mdx new file mode 100644 index 000000000..af6fa1733 --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/connect.mdx @@ -0,0 +1,83 @@ +--- +title: "Connect to a Chain" +description: "Establish a connection to any Cosmos SDK chain using CosmJS clients over HTTP or WebSocket" +--- + +CosmJS clients communicate with Cosmos SDK chains through [CometBFT RPC](https://docs.cometbft.com/v1/spec/rpc/) over HTTP or WebSocket. Pass an RPC URL to any client's `connect` factory method to get started. + +## Quick Start + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); +``` + +CosmJS auto-detects the CometBFT version (0.37, 0.38, or 1.x) and picks the right internal client. The same pattern works for all high-level clients: + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await CosmWasmClient.connect("https://rpc.my-chain.network"); +``` + +## Transport Selection + +The transport is selected automatically based on the endpoint you provide: + +| Endpoint Value | Transport | Subscriptions | +|----------------|-----------|---------------| +| `"https://..."` or `"http://..."` | HTTP | No | +| `"wss://..."` or `"ws://..."` | WebSocket | Yes | +| `HttpEndpoint` object | HTTP (always) | No | +| `HttpBatchClient` instance | Batched HTTP | No | +| `WebsocketClient` instance | WebSocket | Yes | + +## Disconnecting + +Always call `disconnect()` when you're done with a client, especially in long-running processes. What happens depends on the transport: + +| Transport | `disconnect()` behavior | +|-----------|------------------------| +| `HttpClient` | No-op — nothing to close | +| `HttpBatchClient` | Clears the dispatch interval timer | +| `WebsocketClient` | Closes the WebSocket and stops all subscription streams | + +For high-level clients (`StargateClient`, `CosmWasmClient`, and their signing variants), `disconnect()` delegates to the underlying CometBFT client: + +```typescript +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +try { + const balance = await client.getBalance("cosmos1...", "uatom"); +} finally { + client.disconnect(); +} +``` + + +Failing to disconnect a `WebsocketClient` leaves the socket open and the reconnection timer running, which can leak resources in server-side applications. + + +## Next Steps + + + + Connect over HTTP with direct and batched clients. + + + Use WebSocket for persistent connections and real-time subscriptions. + + + Configure HTTP, WebSocket, and broadcast timeouts. + + + Attach authentication headers and compose transport layers. + + + How CosmJS auto-detects CometBFT versions and how to skip it. + + + Handle transport errors, broadcast failures, and timeouts. + + diff --git a/cosmjs/v0.38.x/guides/connect/custom-endpoints.mdx b/cosmjs/v0.38.x/guides/connect/custom-endpoints.mdx new file mode 100644 index 000000000..ae6b8877d --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/custom-endpoints.mdx @@ -0,0 +1,105 @@ +--- +title: "Custom RPC Endpoints" +description: "Attach authentication headers and compose transport layers for custom RPC providers" +--- + +Many RPC providers require authentication headers. CosmJS supports this through the `HttpEndpoint` interface, which lets you attach headers to every request. + +## Custom Headers + +Pass an `HttpEndpoint` object instead of a plain URL to attach headers to every request: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { HttpEndpoint } from "@cosmjs/tendermint-rpc"; + +const endpoint: HttpEndpoint = { + url: "https://rpc.my-chain.network", + headers: { + Authorization: "Bearer ", + "X-Api-Key": "", + }, +}; + +const client = await StargateClient.connect(endpoint); +``` + +`HttpEndpoint` works everywhere a string URL is accepted — `StargateClient.connect`, `SigningStargateClient.connectWithSigner`, `CosmWasmClient.connect`, `connectComet`, `HttpClient`, and `HttpBatchClient`. + + +When you pass an `HttpEndpoint` object, the transport is always HTTP — even if the URL uses a `ws://` scheme. + + +## Custom Headers with Batching + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { Comet38Client, HttpBatchClient, HttpEndpoint } from "@cosmjs/tendermint-rpc"; + +const endpoint: HttpEndpoint = { + url: "https://rpc.my-chain.network", + headers: { Authorization: "Bearer " }, +}; + +const rpcClient = new HttpBatchClient(endpoint, { + batchSizeLimit: 10, + httpTimeout: 15_000, +}); + +const cometClient = await Comet38Client.create(rpcClient); +const client = StargateClient.create(cometClient); +``` + +## Signing Client with Custom Endpoint + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { HttpEndpoint } from "@cosmjs/tendermint-rpc"; + +const endpoint: HttpEndpoint = { + url: "https://rpc.my-chain.network", + headers: { Authorization: "Bearer " }, +}; + +const client = await SigningStargateClient.connectWithSigner(endpoint, wallet, { + gasPrice: GasPrice.fromString("0.025uatom"), +}); +``` + +## Full Manual Configuration + +For maximum control — custom headers, timeouts, batching, and a specific CometBFT version — compose the layers yourself: + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { Comet38Client, HttpBatchClient, HttpEndpoint } from "@cosmjs/tendermint-rpc"; + +const endpoint: HttpEndpoint = { + url: "https://rpc.my-chain.network", + headers: { Authorization: "Bearer " }, +}; + +const rpcClient = new HttpBatchClient(endpoint, { + batchSizeLimit: 10, + dispatchInterval: 50, + httpTimeout: 15_000, +}); + +const cometClient = await Comet38Client.create(rpcClient); + +const client = SigningStargateClient.createWithSigner(cometClient, wallet, { + gasPrice: GasPrice.fromString("0.025uatom"), + broadcastTimeoutMs: 120_000, +}); +``` + +## Next Steps + + + + Understand CometBFT auto-detection and when to skip it. + + + Configure timeout values at every layer. + + diff --git a/cosmjs/v0.38.x/guides/connect/errors.mdx b/cosmjs/v0.38.x/guides/connect/errors.mdx new file mode 100644 index 000000000..1a0606119 --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/errors.mdx @@ -0,0 +1,80 @@ +--- +title: "Connection Errors" +description: "Handle transport errors, broadcast failures, and timeouts when connecting to Cosmos chains" +--- + +CosmJS surfaces errors at two levels: transport-level errors from the RPC client, and broadcast-level errors from transaction submission. + +## Transport-Level Errors + +| Scenario | Error | +|----------|-------| +| Connection refused | `Error` with `ECONNREFUSED` or `fetch failed` | +| HTTP status >= 400 | `Error` with status code and response body | +| JSON-RPC error response | `Error` with serialized JSON-RPC error object | +| HTTP request timeout | `AbortError` from `fetch` (via `AbortSignal.timeout()`) | +| WebSocket handshake timeout | `Error("Connection attempt timed out after X ms")` | +| Missing URL protocol | `Error("Endpoint URL is missing a protocol. Expected 'https://' or 'http://'.")` | + +## Broadcast Errors + +When a signed transaction is submitted but rejected during `CheckTx` (for example, insufficient fees or an invalid signature), the client throws a `BroadcastTxError`: + +```typescript +import { BroadcastTxError } from "@cosmjs/stargate"; + +try { + await client.signAndBroadcast(address, messages, fee); +} catch (error) { + if (error instanceof BroadcastTxError) { + console.error("Code:", error.code, "Codespace:", error.codespace, "Log:", error.log); + } + throw error; +} +``` + +## Timeout Errors + +When a transaction is submitted successfully but not included in a block before the timeout expires, the client throws a `TimeoutError` with the transaction hash: + +```typescript +import { TimeoutError } from "@cosmjs/stargate"; + +try { + await client.signAndBroadcast(address, messages, fee); +} catch (error) { + if (error instanceof TimeoutError) { + console.error("Tx may still land. Hash:", error.txId); + } + throw error; +} +``` + + +A `TimeoutError` does not mean the transaction failed — it may still be included in a later block. You can query for it later using `client.getTx(error.txId)`. + + +## Fire-and-Forget Broadcasting + +If you don't want to wait for block inclusion, use `signAndBroadcastSync` to get the transaction hash immediately after submission: + +```typescript +const txHash = await client.signAndBroadcastSync(address, messages, fee); +``` + +This avoids the polling loop and the `TimeoutError` entirely. Use it when your application handles confirmation tracking separately. + +## No Built-In Retry + +Neither `HttpClient` nor `HttpBatchClient` retry failed requests. If your application needs retry logic for transient network errors, wrap the RPC client or implement retries at the application level. + +## Next Steps + + + + Configure timeout values to tune error behavior. + + + Return to the connection overview. + + diff --git a/cosmjs/v0.38.x/guides/connect/http.mdx b/cosmjs/v0.38.x/guides/connect/http.mdx new file mode 100644 index 000000000..87e58b0a6 --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/http.mdx @@ -0,0 +1,75 @@ +--- +title: "HTTP Transport" +description: "Connect to Cosmos SDK chains over HTTP using direct and batched RPC clients" +--- + +HTTP is the default transport for `http://` and `https://` endpoints. Each query sends a single JSON-RPC POST request using the platform's `fetch` API. There is no persistent connection — each call is independent. + +## Using High-Level Clients + +Pass an HTTP URL to `connect` and CosmJS handles the rest: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const height = await client.getHeight(); +client.disconnect(); +``` + +## Using the HTTP Client Directly + +For more control, create an `HttpClient` and pass it through the CometBFT client layer: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { Comet38Client, HttpClient } from "@cosmjs/tendermint-rpc"; + +const rpcClient = new HttpClient("https://rpc.my-chain.network"); +const cometClient = await Comet38Client.create(rpcClient); +const client = StargateClient.create(cometClient); +``` + + +When constructing the CometBFT client manually, you need to know the node's version. Use `Tendermint37Client` for Tendermint 0.37, `Comet38Client` for CometBFT 0.38, or `Comet1Client` for CometBFT 1.x. + + +## Batching HTTP Requests + +`HttpBatchClient` groups multiple concurrent `execute()` calls into a single JSON-RPC batch request, reducing HTTP round-trips: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { Comet38Client, HttpBatchClient } from "@cosmjs/tendermint-rpc"; + +const rpcClient = new HttpBatchClient("https://rpc.my-chain.network", { + batchSizeLimit: 10, + dispatchInterval: 50, +}); + +const cometClient = await Comet38Client.create(rpcClient); +const client = StargateClient.create(cometClient); +``` + +| Option | Type | Default | Description | +|--------|------|---------|-------------| +| `batchSizeLimit` | `number` | 20 | Max requests per batch. Queue flushes when this limit is reached. | +| `dispatchInterval` | `number` | 20 | Milliseconds between automatic queue flushes. | +| `httpTimeout` | `number` | — | Request timeout in milliseconds. | + +Batching is useful when your application fires many independent queries in rapid succession — for example, fetching balances for a list of addresses. + +## Next Steps + + + + Use persistent connections and real-time subscriptions. + + + Attach authentication headers to HTTP and batched clients. + + + Configure HTTP request and batch timeouts. + + diff --git a/cosmjs/v0.38.x/guides/connect/timeouts.mdx b/cosmjs/v0.38.x/guides/connect/timeouts.mdx new file mode 100644 index 000000000..483d62c88 --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/timeouts.mdx @@ -0,0 +1,70 @@ +--- +title: "Timeouts" +description: "Configure HTTP request, WebSocket connection, and broadcast polling timeouts" +--- + +CosmJS exposes timeouts at three levels: HTTP requests, WebSocket connections, and transaction broadcast polling. Each is configured independently. + +## HTTP Request Timeout + +Pass a timeout in milliseconds as the second argument to `HttpClient`: + +```typescript +import { HttpClient } from "@cosmjs/tendermint-rpc"; + +const rpcClient = new HttpClient("https://rpc.my-chain.network", 15_000); +``` + +When the timeout fires, the underlying `fetch` call is aborted via `AbortSignal.timeout()`. If omitted, requests have no timeout and rely on the runtime's default behavior. + +For `HttpBatchClient`, use the `httpTimeout` option: + +```typescript +import { HttpBatchClient } from "@cosmjs/tendermint-rpc"; + +const rpcClient = new HttpBatchClient("https://rpc.my-chain.network", { + httpTimeout: 15_000, +}); +``` + +## WebSocket Connection Timeout + +The underlying socket has a 10-second connection timeout. If the WebSocket handshake doesn't complete in time, the connection promise rejects with a timeout error. + +## Broadcast Timeout + +Separately from transport timeouts, signing clients control how long `signAndBroadcast()` polls for transaction inclusion in a block: + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { + gasPrice: GasPrice.fromString("0.025uatom"), + broadcastTimeoutMs: 120_000, + broadcastPollIntervalMs: 5_000, + }, +); +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `broadcastTimeoutMs` | 60,000 (60s) | Max time to wait for tx inclusion | +| `broadcastPollIntervalMs` | 3,000 (3s) | Interval between inclusion checks | + + +These are not transport-level timeouts — they only affect `signAndBroadcast()`. If you use `signAndBroadcastSync` instead, no polling occurs and these options are ignored. + + +## Next Steps + + + + Handle timeout errors and other connection failures. + + + Combine timeouts with custom headers and batching. + + diff --git a/cosmjs/v0.38.x/guides/connect/version-detection.mdx b/cosmjs/v0.38.x/guides/connect/version-detection.mdx new file mode 100644 index 000000000..01dac696b --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/version-detection.mdx @@ -0,0 +1,61 @@ +--- +title: "Version Detection" +description: "How CosmJS auto-detects CometBFT versions and how to skip the detection round-trip" +--- + +When you call `StargateClient.connect()` or `connectComet()`, CosmJS auto-detects the node's CometBFT version so it can use the correct RPC protocol. + +## How Auto-Detection Works + + + +CosmJS connects a Tendermint 0.37 client and calls `status()`. + + +It reads `nodeInfo.version` from the response. + + +If the version starts with `0.38.`, it disconnects and reconnects with `Comet38Client`. If it starts with `1.`, it reconnects with `Comet1Client`. Otherwise, it keeps the 0.37 client. + + + +This costs one extra RPC round-trip on startup. + +## Skipping Auto-Detection + +If you already know your chain's CometBFT version, skip auto-detection by constructing the client directly: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { Comet1Client, HttpClient } from "@cosmjs/tendermint-rpc"; + +const rpcClient = new HttpClient("https://rpc.my-chain.network"); +const cometClient = await Comet1Client.create(rpcClient); +const client = StargateClient.create(cometClient); +``` + + +Skipping auto-detection saves one RPC round-trip on every client creation. This is worth doing in production when you know the chain's CometBFT version. + + +## Using `connectComet` Directly + +You can also use `connectComet` on its own when you need a `CometClient` without a high-level wrapper: + +```typescript +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const status = await cometClient.status(); +``` + +## Next Steps + + + + Return to the connection overview and transport selection table. + + + Combine manual client construction with custom headers and batching. + + diff --git a/cosmjs/v0.38.x/guides/connect/websocket.mdx b/cosmjs/v0.38.x/guides/connect/websocket.mdx new file mode 100644 index 000000000..dd674e18c --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/websocket.mdx @@ -0,0 +1,95 @@ +--- +title: "WebSocket Transport" +description: "Connect over WebSocket for persistent connections and real-time event subscriptions" +--- + +Use a `ws://` or `wss://` URL to connect over WebSocket. This gives you a persistent connection and is the only transport that supports real-time event subscriptions. + +## Using High-Level Clients + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("wss://rpc.my-chain.network"); +``` + +The transport is selected automatically based on the URL scheme. + +## Subscriptions + +WebSocket connections can subscribe to new blocks and transactions: + +```typescript +import { Comet38Client, WebsocketClient } from "@cosmjs/tendermint-rpc"; + +const wsClient = new WebsocketClient("wss://rpc.my-chain.network"); +const cometClient = await Comet38Client.create(wsClient); + +const newBlocks = cometClient.subscribeNewBlock(); +const subscription = newBlocks.subscribe({ + next: (event) => { + console.info("New block:", event.header.height); + }, + error: (err) => console.error(err), + complete: () => console.info("Subscription ended"), +}); + +// Clean up when done +subscription.unsubscribe(); +cometClient.disconnect(); +``` + +Available subscription methods on CometBFT clients: + +| Method | Events | +|--------|--------| +| `subscribeNewBlock()` | Full block data on each new block | +| `subscribeNewBlockHeader()` | Block header only | +| `subscribeTx(query?)` | Transactions matching an optional query | + +## Reconnection + +`WebsocketClient` reconnects automatically with exponential backoff (100 ms initial, doubling up to 5 seconds). Requests made while disconnected are queued and sent when the connection is restored. + +## Error Handler + +The `WebsocketClient` constructor accepts an optional error handler as its second argument: + +```typescript +const wsClient = new WebsocketClient("wss://rpc.my-chain.network", (err) => { + console.error("WebSocket error:", err); +}); +``` + +If omitted, errors are thrown by default. + +## Checking Subscription Support + +Not all transports support event subscriptions. Only `WebsocketClient` implements the streaming interface. If you have a `CometClient` and need to check at runtime, verify the underlying RPC client is a `WebsocketClient`: + +```typescript +import { WebsocketClient } from "@cosmjs/tendermint-rpc"; + +if (rpcClient instanceof WebsocketClient) { + const stream = cometClient.subscribeNewBlock(); + // ... +} else { + // Fall back to polling +} +``` + +Calling `subscribeNewBlock()`, `subscribeNewBlockHeader()`, or `subscribeTx()` on a CometBFT client backed by an HTTP transport throws `"This RPC client type cannot subscribe to events"`. + +## Next Steps + + + + Use HTTP for stateless request-response queries. + + + Configure WebSocket connection and broadcast timeouts. + + + Handle WebSocket errors and reconnection failures. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/administration.mdx b/cosmjs/v0.38.x/guides/cosmwasm/administration.mdx new file mode 100644 index 000000000..a6cb205a8 --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/administration.mdx @@ -0,0 +1,85 @@ +--- +title: "Contract Administration" +description: "Migrate contracts to new code, transfer admin privileges, and manage the contract lifecycle" +--- + +Contracts with an admin address can be migrated to new code versions and have their admin transferred or cleared. These operations are central to the CosmWasm upgrade lifecycle. + +## Migrating a Contract + +Migrate moves a contract to a new code ID while preserving its address and state. The contract must have an admin, and the migration message is passed to the new code's `migrate` entry point. + + + + + +```typescript +const newWasmCode = readFileSync("./my_contract_v2.wasm"); +const { codeId: newCodeId } = await client.upload(address, newWasmCode, "auto"); +``` + + + + + +```typescript +const migrateResult = await client.migrate( + address, + contractAddress, + newCodeId, + { new_field: "default_value" }, + "auto", +); +``` + + + + + +The migrate message (fourth argument) is contract-defined. It typically handles schema changes, data migrations, or field initialization for the new version. + + +Only the contract's admin address can call `migrate`. The sender must match the admin set during instantiation (or a subsequent `updateAdmin` call). + + +## Updating the Admin + +Transfer admin privileges to a different address: + +```typescript +await client.updateAdmin(address, contractAddress, "osmo1newadmin...", "auto"); +``` + +After this call, only `osmo1newadmin...` can migrate the contract or change the admin again. The original admin loses all privileges. + +## Clearing the Admin + +Remove the admin entirely, making the contract permanently non-upgradeable: + +```typescript +await client.clearAdmin(address, contractAddress, "auto"); +``` + + +Clearing the admin is irreversible. The contract can never be migrated or have its admin updated again. Only do this when you are certain the contract should be immutable. + + +## Contract Lifecycle Summary + +| State | Can Migrate | Can Change Admin | How to Reach | +|-------|-------------|------------------|--------------| +| Admin set | Yes | Yes | `instantiate` with `admin` option | +| Admin transferred | Yes | Yes | `updateAdmin` | +| Admin cleared | No | No | `clearAdmin` | +| No admin (from init) | No | No | `instantiate` without `admin` option | + +## Next Steps + + + + Verify contract metadata and code history after migration. + + + Gas estimation, custom messages, and the wasm query extension. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/cosmwasm.mdx b/cosmjs/v0.38.x/guides/cosmwasm/cosmwasm.mdx new file mode 100644 index 000000000..89fee67eb --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/cosmwasm.mdx @@ -0,0 +1,100 @@ +--- +title: "CosmWasm Smart Contracts" +description: "Interact with CosmWasm smart contracts using the @cosmjs/cosmwasm package" +--- + +The `@cosmjs/cosmwasm` package provides a full-featured client for interacting with CosmWasm smart contracts. It covers the complete contract lifecycle: connecting to a chain, querying contract state, uploading code, instantiating contracts, executing messages, and managing contract administration. + +## Prerequisites + +Install the required packages: + + + +```bash npm +npm install @cosmjs/cosmwasm @cosmjs/proto-signing @cosmjs/stargate @cosmjs/encoding +``` + +```bash yarn +yarn add @cosmjs/cosmwasm @cosmjs/proto-signing @cosmjs/stargate @cosmjs/encoding +``` + + + +## Connecting + +`CosmWasmClient` is the read-only client for querying CosmWasm chains. It extends the core Cosmos SDK query functionality with smart contract methods. + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await CosmWasmClient.connect("https://rpc.my-chain.network"); + +const chainId = await client.getChainId(); +const height = await client.getHeight(); +``` + +CosmJS auto-detects the CometBFT version (0.37, 0.38, or 1.x) at the endpoint. If you need to bypass auto-detection, use the `create` factory method with a specific CometBFT client: + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; +import { Comet38Client } from "@cosmjs/tendermint-rpc"; + +const cometClient = await Comet38Client.connect("https://rpc.my-chain.network"); +const client = CosmWasmClient.create(cometClient); +``` + +Always disconnect when you're done, especially with WebSocket connections: + +```typescript +try { + const balance = await client.getBalance("osmo1abc...", "uosmo"); +} finally { + client.disconnect(); +} +``` + +For signing transactions, `SigningCosmWasmClient` extends `CosmWasmClient` with upload, instantiate, execute, migrate, and all standard Cosmos SDK transaction capabilities: + +```typescript +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { GasPrice } from "@cosmjs/stargate"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic( + "your mnemonic words here ...", + { prefix: "osmo" }, +); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningCosmWasmClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uosmo") }, +); +``` + +Setting `gasPrice` enables `"auto"` fee estimation for all transactions. Without it, you must provide an explicit `StdFee` for every call. + +## Next Steps + + + + Smart queries, raw state access, and contract discovery. + + + Deploy Wasm binaries to chain with access restrictions. + + + Create contract instances with admin, funds, and predictable addresses. + + + Execute single or batched contract calls with funds and events. + + + Migrate contracts, update admin, and manage the contract lifecycle. + + + Gas estimation, custom messages, binary helpers, and the wasm query extension. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/executing.mdx b/cosmjs/v0.38.x/guides/cosmwasm/executing.mdx new file mode 100644 index 000000000..d1f3bcfcf --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/executing.mdx @@ -0,0 +1,102 @@ +--- +title: "Executing Contracts" +description: "Execute single or batched contract calls with funds and parse transaction events" +--- + +Executing a contract sends a JSON message that triggers state changes. You can attach native tokens, batch multiple executions atomically, and inspect the emitted events. + +## Basic Execution + +```typescript +const result = await client.execute( + address, + contractAddress, + { increment: {} }, + "auto", +); + +const { transactionHash, events, gasUsed } = result; +``` + +## Execute with Funds + +Attach native tokens to the execution message. The tokens are transferred to the contract as part of the message execution. + +```typescript +const result = await client.execute( + address, + contractAddress, + { deposit: {} }, + "auto", + "depositing tokens", + [{ denom: "uosmo", amount: "5000000" }], +); +``` + +## Execute Multiple Contracts Atomically + +Bundle multiple contract calls into a single transaction using `executeMultiple`. If any call fails, the entire transaction is reverted. + +```typescript +const result = await client.executeMultiple( + address, + [ + { + contractAddress: counterAddress, + msg: { increment: {} }, + }, + { + contractAddress: registryAddress, + msg: { register: { name: "alice" } }, + funds: [{ denom: "uosmo", amount: "5000" }], + }, + ], + "auto", +); +``` + +Each instruction in the array follows the `ExecuteInstruction` interface: + +| Field | Type | Description | +|-------|------|-------------| +| `contractAddress` | `string` | Target contract address | +| `msg` | `JsonObject` | The JSON execute message | +| `funds` | `Coin[]` | Optional native tokens to attach | + +## Parsing Events + +Contract executions emit custom events under the `"wasm"` event type. These contain contract-defined key-value attributes. + +```typescript +const result = await client.execute(address, contractAddress, { release: {} }, "auto"); + +const wasmEvents = result.events.filter((e) => e.type === "wasm"); +for (const event of wasmEvents) { + for (const attr of event.attributes) { + console.info(`${attr.key}: ${attr.value}`); + } +} +``` + +When using `executeMultiple`, each contract call produces its own set of wasm events. Filter by the `_contract_address` attribute to distinguish which contract emitted each event. + +## Execution Result + +| Field | Type | Description | +|-------|------|-------------| +| `transactionHash` | `string` | Upper-case hex transaction hash | +| `height` | `number` | Block height of inclusion | +| `events` | `Event[]` | All transaction events (including `"wasm"` events) | +| `gasWanted` | `bigint` | Gas requested | +| `gasUsed` | `bigint` | Gas consumed | + +## Next Steps + + + + Migrate contracts and manage admin privileges. + + + Gas estimation, custom messages, and binary helpers. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/gas-and-advanced.mdx b/cosmjs/v0.38.x/guides/cosmwasm/gas-and-advanced.mdx new file mode 100644 index 000000000..c8280eef2 --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/gas-and-advanced.mdx @@ -0,0 +1,185 @@ +--- +title: "Gas and Advanced Usage" +description: "Gas estimation, custom messages, binary helpers, and the wasm query extension" +--- + +This page covers gas configuration for CosmWasm transactions, building custom encode objects, working with the CosmWasm `Binary` type, and using the low-level wasm query extension for fine-grained pagination. + +## Gas Estimation + +### Auto Gas + +When you pass `"auto"` as the fee, the client simulates the transaction and applies a gas multiplier: + +| Operation | Default Multiplier | Reason | +|-----------|-------------------|--------| +| `upload` | 1.1x | Upload simulation is very accurate | +| All others | 1.4x | General safety margin for state changes | + +You can pass a numeric multiplier instead of `"auto"` for finer control: + +```typescript +const result = await client.execute( + address, + contractAddress, + { complex_operation: {} }, + 1.6, +); +``` + +### Static Fees + +For full control, provide an explicit fee object: + +```typescript +import { coins } from "@cosmjs/stargate"; + +const fee = { + amount: coins(5000, "uosmo"), + gas: "300000", +}; + +const result = await client.execute(address, contractAddress, { increment: {} }, fee); +``` + +### Gas Simulation + +Simulate a transaction to estimate gas without broadcasting: + +```typescript +import { toUtf8 } from "@cosmjs/encoding"; +import { MsgExecuteContract } from "cosmjs-types/cosmwasm/wasm/v1/tx"; + +const msg = { + typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", + value: MsgExecuteContract.fromPartial({ + sender: address, + contract: contractAddress, + msg: toUtf8(JSON.stringify({ increment: {} })), + funds: [], + }), +}; + +const gasEstimate = await client.simulate(address, [msg], "estimating gas"); +``` + +## Working with Binary Data + +The `toBinary` and `fromBinary` helpers convert JavaScript objects to and from the base64-encoded JSON format used by CosmWasm `Binary` fields: + +```typescript +import { toBinary, fromBinary } from "@cosmjs/cosmwasm"; + +const encoded = toBinary({ some: "data" }); +// "eyJzb21lIjoiZGF0YSJ9" + +const decoded = fromBinary(encoded); +// { some: "data" } +``` + +This is useful when composing nested messages, such as sending a sub-message through a contract: + +```typescript +await client.execute( + address, + multisigAddress, + { + propose: { + msg: toBinary({ transfer: { recipient: "osmo1...", amount: "1000000" } }), + }, + }, + "auto", +); +``` + +## Building Custom Messages + +For advanced use cases, construct CosmWasm encode objects directly and broadcast them via `signAndBroadcast`: + +```typescript +import { toUtf8 } from "@cosmjs/encoding"; +import { MsgExecuteContract } from "cosmjs-types/cosmwasm/wasm/v1/tx"; + +const msg = { + typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", + value: MsgExecuteContract.fromPartial({ + sender: address, + contract: contractAddress, + msg: toUtf8(JSON.stringify({ increment: {} })), + funds: [{ denom: "uosmo", amount: "1000" }], + }), +}; + +const result = await client.signAndBroadcast(address, [msg], "auto"); +``` + +### Mixing CosmWasm and Cosmos SDK Messages + +This approach lets you combine contract calls with standard Cosmos SDK messages in a single atomic transaction: + +```typescript +import { toUtf8 } from "@cosmjs/encoding"; +import { MsgExecuteContract } from "cosmjs-types/cosmwasm/wasm/v1/tx"; + +const executeMsg = { + typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", + value: MsgExecuteContract.fromPartial({ + sender: address, + contract: contractAddress, + msg: toUtf8(JSON.stringify({ claim_rewards: {} })), + funds: [], + }), +}; + +const sendMsg = { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: { + fromAddress: address, + toAddress: "osmo1recipient...", + amount: [{ denom: "uosmo", amount: "500000" }], + }, +}; + +const result = await client.signAndBroadcast(address, [executeMsg, sendMsg], "auto"); +``` + +## Wasm Query Extension + +For fine-grained control over pagination or when building a custom query client, use the wasm extension directly instead of the high-level `CosmWasmClient` methods: + +```typescript +import { QueryClient } from "@cosmjs/stargate"; +import { setupWasmExtension } from "@cosmjs/cosmwasm"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupWasmExtension); + +const { codeInfos, pagination } = await queryClient.wasm.listCodeInfo(); +const allState = await queryClient.wasm.getAllContractState("osmo1contractaddr..."); +``` + +### Available Extension Methods + +| Method | Description | +|--------|-------------| +| `listCodeInfo(paginationKey?)` | List all uploaded codes | +| `getCode(id)` | Download original Wasm by code ID | +| `listContractsByCodeId(id, paginationKey?)` | List contract addresses for a code ID | +| `listContractsByCreator(creator, paginationKey?)` | List contracts created by an address | +| `getContractInfo(address)` | Get contract metadata | +| `getContractCodeHistory(address, paginationKey?)` | Get migration history | +| `getAllContractState(address, paginationKey?)` | Dump all contract storage | +| `queryContractRaw(address, key)` | Read a single storage key | +| `queryContractSmart(address, query)` | Execute a smart query | + +## Next Steps + + + + Back to the CosmWasm guide overview. + + + Comparing the two client families and when to use each. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/instantiating.mdx b/cosmjs/v0.38.x/guides/cosmwasm/instantiating.mdx new file mode 100644 index 000000000..cb774ee64 --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/instantiating.mdx @@ -0,0 +1,108 @@ +--- +title: "Instantiating Contracts" +description: "Create contract instances with admin, funds, and predictable addresses" +--- + +After uploading a Wasm binary, you create contract instances from its `codeId`. Each instance gets its own address, storage, and optional admin. A single code ID can be instantiated many times with different configuration. + +## Basic Instantiation + +```typescript +const instantiateResult = await client.instantiate( + address, + codeId, + { count: 0 }, + "My Counter Contract", + "auto", +); + +const { contractAddress, transactionHash, events } = instantiateResult; +``` + +The third argument is the JSON init message whose shape is defined by the contract. The fourth argument is a human-readable label stored on-chain. + +## Instantiation Options + +Pass an options object as the last argument to set an admin, attach funds, or add a memo: + +```typescript +const instantiateResult = await client.instantiate( + address, + codeId, + { owner: address, threshold: 3 }, + "My Multisig Contract", + "auto", + { + admin: address, + funds: [{ denom: "uosmo", amount: "1000000" }], + memo: "deploying multisig v1", + }, +); +``` + +| Option | Type | Description | +|--------|------|-------------| +| `admin` | `string` | Bech32 address with permission to migrate or update the contract. Omit to make the contract immutable. | +| `funds` | `Coin[]` | Native tokens transferred to the contract on creation. | +| `memo` | `string` | Transaction memo. | + + +Setting an admin is required if you ever want to migrate the contract to new code. If you omit the admin, the contract becomes permanently non-upgradeable. + + +## Predictable Addresses with Instantiate2 + +`instantiate2` creates a contract with a deterministic address derived from the code checksum, creator address, and a salt. This is useful when other contracts or off-chain systems need to know the address before it exists. + +```typescript +import { Random, sha256 } from "@cosmjs/crypto"; +import { instantiate2Address } from "@cosmjs/cosmwasm"; +import { readFileSync } from "fs"; + +const wasmCode = readFileSync("./my_contract.wasm"); +const salt = Random.getBytes(32); + +const predictedAddress = instantiate2Address( + sha256(wasmCode), + address, + salt, + "osmo", +); + +const result = await client.instantiate2( + address, + codeId, + salt, + { count: 0 }, + "Predictable Counter", + "auto", + { admin: address }, +); +// result.contractAddress === predictedAddress +``` + + +The salt must be between 1 and 64 bytes. Use a unique salt for each instantiation to avoid address collisions. + + +## Instantiation Result + +| Field | Type | Description | +|-------|------|-------------| +| `contractAddress` | `string` | Bech32 address of the new contract | +| `transactionHash` | `string` | Upper-case hex transaction hash | +| `height` | `number` | Block height of inclusion | +| `events` | `Event[]` | Transaction events | +| `gasWanted` | `bigint` | Gas requested | +| `gasUsed` | `bigint` | Gas consumed | + +## Next Steps + + + + Send execute messages to change contract state. + + + Migrate contracts and manage admin privileges. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/querying.mdx b/cosmjs/v0.38.x/guides/cosmwasm/querying.mdx new file mode 100644 index 000000000..7e75dc392 --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/querying.mdx @@ -0,0 +1,105 @@ +--- +title: "Querying Contracts" +description: "Query smart contract state, metadata, and code info on CosmWasm-enabled chains" +--- + +`CosmWasmClient` provides multiple ways to read contract state: JSON smart queries that execute the contract's query entry point, raw binary reads against storage keys, and metadata lookups for contracts and uploaded code. + +## Smart Queries + +Smart queries execute the contract's query entry point and return parsed JSON. The query message shape depends on the contract. + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await CosmWasmClient.connect("https://rpc.my-chain.network"); + +const count = await client.queryContractSmart("osmo1contractaddr...", { + get_count: {}, +}); + +const balance = await client.queryContractSmart("osmo1tokencontract...", { + balance: { address: "osmo1useraddr..." }, +}); +``` + + +Smart queries are rejected if the contract address does not exist or the query message does not match the contract's schema. Both cases throw an error. + + +## Raw State Access + +For direct storage reads, use `queryContractRaw` with the binary storage key: + +```typescript +import { toAscii } from "@cosmjs/encoding"; + +const raw = await client.queryContractRaw("osmo1contractaddr...", toAscii("config")); +if (raw) { + const config = JSON.parse(new TextDecoder().decode(raw)); +} +``` + +## Contract Metadata + +Retrieve a contract's on-chain metadata including its code ID, creator, admin, and label: + +```typescript +const info = await client.getContract("osmo1contractaddr..."); +// { address, codeId, creator, admin, label, ibcPortId } + +const history = await client.getContractCodeHistory("osmo1contractaddr..."); +// [{ operation: "Init" | "Migrate" | "Genesis", codeId, msg }] +``` + +## Code and Contract Discovery + +List uploaded codes and find contracts by code ID or creator: + +```typescript +const codes = await client.getCodes(); +// [{ id, creator, checksum }] + +const codeDetails = await client.getCodeDetails(1); +// { id, creator, checksum, data (Uint8Array of original wasm) } + +const contracts = await client.getContracts(1); +// ["osmo1abc...", "osmo1def..."] + +const byCreator = await client.getContractsByCreator("osmo1creatoraddr..."); +// ["osmo1abc...", "osmo1def..."] +``` + + +`getCodes()`, `getContracts()`, and `getContractsByCreator()` loop through all pagination pages internally. For large result sets, consider using the wasm query extension directly with manual pagination. + + +## Using the Wasm Query Extension + +For fine-grained control over pagination or when building a custom query client, use the wasm extension directly: + +```typescript +import { QueryClient } from "@cosmjs/stargate"; +import { setupWasmExtension } from "@cosmjs/cosmwasm"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupWasmExtension); + +const { codeInfos, pagination } = await queryClient.wasm.listCodeInfo(); +const contracts = await queryClient.wasm.listContractsByCodeId(1); +const contractInfo = await queryClient.wasm.getContractInfo("osmo1contractaddr..."); +const history = await queryClient.wasm.getContractCodeHistory("osmo1contractaddr..."); +const allState = await queryClient.wasm.getAllContractState("osmo1contractaddr..."); +``` + +## Next Steps + + + + Deploy Wasm binaries to chain. + + + Execute contract messages and parse events. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/uploading.mdx b/cosmjs/v0.38.x/guides/cosmwasm/uploading.mdx new file mode 100644 index 000000000..70c3afa70 --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/uploading.mdx @@ -0,0 +1,80 @@ +--- +title: "Uploading Code" +description: "Deploy Wasm binaries to a CosmWasm chain with optional access restrictions" +--- + +Before you can instantiate a contract, the compiled Wasm binary must be uploaded to the chain. The `upload` method on `SigningCosmWasmClient` handles gzip compression, transaction signing, and returns a `codeId` you use for instantiation. + +## Basic Upload + +```typescript +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { GasPrice } from "@cosmjs/stargate"; +import { readFileSync } from "fs"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "osmo", +}); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningCosmWasmClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uosmo") }, +); + +const wasmCode = readFileSync("./my_contract.wasm"); +const uploadResult = await client.upload(address, wasmCode, "auto"); + +const { codeId, checksum, originalSize, compressedSize, transactionHash } = uploadResult; +``` + +CosmJS automatically gzip-compresses the Wasm bytes before submitting the transaction. The `upload` method uses a tighter gas multiplier of 1.1x (instead of the default 1.4x) for `"auto"` fee estimation because code upload simulation is very accurate. + +## Upload with Access Restrictions + +You can restrict who is allowed to instantiate your uploaded code: + +```typescript +import { AccessConfig, AccessType } from "cosmjs-types/cosmwasm/wasm/v1/types"; + +const permission = AccessConfig.fromPartial({ + permission: AccessType.ACCESS_TYPE_ANY_OF_ADDRESSES, + addresses: [address], +}); + +const uploadResult = await client.upload(address, wasmCode, "auto", "optional memo", permission); +``` + +| AccessType | Description | +|-----------|-------------| +| `ACCESS_TYPE_EVERYBODY` | Anyone can instantiate | +| `ACCESS_TYPE_ANY_OF_ADDRESSES` | Only the listed addresses can instantiate | + +## Upload Result + +The `UploadResult` contains everything you need to proceed with instantiation: + +| Field | Type | Description | +|-------|------|-------------| +| `codeId` | `number` | The chain-assigned code ID for instantiation | +| `checksum` | `string` | Hex-encoded SHA-256 of the original (uncompressed) Wasm | +| `originalSize` | `number` | Size of the original Wasm in bytes | +| `compressedSize` | `number` | Size of the gzip-compressed Wasm in bytes | +| `transactionHash` | `string` | Upper-case hex transaction hash | +| `height` | `number` | Block height of inclusion | +| `events` | `Event[]` | Transaction events | +| `gasWanted` | `bigint` | Gas requested | +| `gasUsed` | `bigint` | Gas consumed | + +## Next Steps + + + + Create contract instances from uploaded code. + + + Gas estimation, simulation, and fee configuration. + + diff --git a/cosmjs/v0.38.x/guides/extending/amino-converters.mdx b/cosmjs/v0.38.x/guides/extending/amino-converters.mdx new file mode 100644 index 000000000..6c46ac4da --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/amino-converters.mdx @@ -0,0 +1,143 @@ +--- +title: "Amino Converters" +description: "Add Amino JSON signing support for custom message types used by wallets like Keplr and Leap" +--- + +Wallets like Keplr and Leap use **Amino JSON** signing (`SIGN_MODE_LEGACY_AMINO_JSON`) by default. If your custom module needs to support these wallets, you must provide Amino converters that translate between protobuf field names (camelCase) and Amino field names (snake_case). + +## Defining Converters + +An `AminoConverter` maps a protobuf type URL to its Amino type string and provides `toAmino`/`fromAmino` transform functions: + +```typescript +import { AminoConverters } from "@cosmjs/stargate"; + +export function createBlogAminoConverters(): AminoConverters { + return { + "/blog.v1.MsgCreatePost": { + aminoType: "blog/MsgCreatePost", + toAmino: ({ author, title, body }) => ({ + author, + title, + body, + }), + fromAmino: ({ author, title, body }) => ({ + author, + title, + body, + }), + }, + "/blog.v1.MsgEditPost": { + aminoType: "blog/MsgEditPost", + toAmino: ({ author, id, title, body }) => ({ + author, + id: id.toString(), + title, + body, + }), + fromAmino: ({ author, id, title, body }) => ({ + author, + id: BigInt(id), + title, + body, + }), + }, + }; +} +``` + +Each converter has three parts: + +| Field | Purpose | +|-------|---------| +| `aminoType` | The Amino type identifier string registered on the chain (e.g. `"blog/MsgCreatePost"`) | +| `toAmino` | Converts a protobuf message value to its Amino JSON representation | +| `fromAmino` | Converts an Amino JSON value back to the protobuf message format | + + +The `aminoType` string must match exactly what the chain's `x/` module registers on the server side. A mismatch causes signature verification failures. Check your module's Go source for the registered Amino type name. + + +## Handling Type Conversions + +Amino JSON uses different representations for some types. Common conversions you'll encounter: + +| Protobuf type | Amino representation | `toAmino` | `fromAmino` | +|---------------|---------------------|-----------|-------------| +| `bigint` / `int64` | String | `id.toString()` | `BigInt(id)` | +| `Uint8Array` | Base64 string | `toBase64(data)` | `fromBase64(data)` | +| `Timestamp` | ISO string | `timestamp.toISOString()` | `new Date(str)` | +| Nested message | Flattened snake_case | Manual field mapping | Manual field mapping | + +Example with multiple type conversions: + +```typescript +import { fromBase64, toBase64 } from "@cosmjs/encoding"; + +"/blog.v1.MsgCreatePostWithAttachment": { + aminoType: "blog/MsgCreatePostWithAttachment", + toAmino: ({ author, id, title, attachment }) => ({ + author, + id: id.toString(), + title, + attachment: toBase64(attachment), + }), + fromAmino: ({ author, id, title, attachment }) => ({ + author, + id: BigInt(id), + title, + attachment: fromBase64(attachment), + }), +}, +``` + +## Passing Converters to the Signing Client + +Merge your custom converters with the defaults using `AminoTypes`: + +```typescript +import { + SigningStargateClient, + GasPrice, + AminoTypes, + defaultRegistryTypes, + createDefaultAminoConverters, +} from "@cosmjs/stargate"; +import { Registry } from "@cosmjs/proto-signing"; + +const registry = new Registry([...defaultRegistryTypes, ...blogTypes]); + +const aminoTypes = new AminoTypes({ + ...createDefaultAminoConverters(), + ...createBlogAminoConverters(), +}); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { registry, aminoTypes, gasPrice: GasPrice.fromString("0.025utoken") }, +); +``` + +The client automatically selects the signing mode based on the wallet: + +- **`OfflineDirectSigner`** (e.g. `DirectSecp256k1HdWallet`) uses `SIGN_MODE_DIRECT` — protobuf encoding, Amino converters not needed +- **`OfflineAminoSigner`** (e.g. `Secp256k1HdWallet`, Keplr, Leap) uses `SIGN_MODE_LEGACY_AMINO_JSON` — requires Amino converters for all message types in the transaction + + +If you only use `DirectSecp256k1HdWallet` and never need Keplr/Leap support, you can skip Amino converters entirely. But adding them makes your code compatible with all Cosmos wallets. + + +## Next Steps + + + + Register the protobuf types that your Amino converters translate. + + + See a complete module integration that ties types, queries, and Amino converters together. + + + Understand how the two signing modes work and when each is used. + + diff --git a/cosmjs/v0.38.x/guides/extending/code-generation.mdx b/cosmjs/v0.38.x/guides/extending/code-generation.mdx new file mode 100644 index 000000000..905c9f74b --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/code-generation.mdx @@ -0,0 +1,223 @@ +--- +title: "Code Generation" +description: "Generate TypeScript types from protobuf definitions using Telescope, ts-proto, or protobufjs" +--- + +Writing protobuf codec wrappers, query clients, and Amino converters by hand is error-prone and tedious. Code generation tools read your chain's `.proto` files and produce TypeScript code that's directly compatible with CosmJS's `Registry`, `createProtobufRpcClient`, and `AminoTypes`. + +## Choosing a Generator + +| | [Telescope](https://github.com/cosmology-tech/telescope) | [ts-proto](https://github.com/stephenh/ts-proto) | [protobufjs](https://github.com/protobufjs/protobuf.js) | +|---|---|---|---| +| **Approach** | Full-stack Cosmos codegen | General-purpose protobuf codegen | Runtime type definitions | +| **Output** | Message codecs, query clients, Amino converters, registry helpers, LCD clients | Message codecs, query service clients | Encode/decode at runtime (no build step) | +| **CosmJS interface** | `TelescopeGeneratedType` | `TsProtoGeneratedType` / `TsProto2GeneratedType` | `PbjsGeneratedType` | +| **`fromPartial`** | Yes | Yes | No (uses `create`) | +| **Best for** | Full dApp development, chain-specific libraries | Matching CosmJS's own code style, lightweight projects | Prototyping, runtime-defined types | +| **Used by** | OsmoJS, Stargaze, dYdX, Stride | `cosmjs-types` (CosmJS itself) | Quick prototypes, dynamic schemas | + +## Telescope + +[Telescope](https://github.com/cosmology-tech/telescope) is the most popular code generator in the Cosmos ecosystem. It produces complete TypeScript libraries that include everything needed for CosmJS integration — message codecs, query clients, Amino converters, and registry arrays. + +### Quick Start + + +Telescope v2 has been published as `@hyperweb/telescope` with InterchainJS as the default dependency. For CosmJS-based projects, `@cosmology/telescope` v1.x remains the recommended version. The CLI commands below work with both versions. + + + + +### Install Telescope + +```bash +npm install -g @cosmology/telescope +``` + +### Initialize a new package + +```bash +telescope generate +``` + +This creates a new project scaffold. Place your `.proto` files (or the chain's proto files) into the `./proto` directory. + +### Install existing protobuf definitions + +For well-known chains, Telescope can pull proto definitions automatically: + +```bash +telescope install +``` + +### Generate TypeScript code + +```bash +telescope transpile +``` + +This produces typed message codecs, query clients, Amino converters, and registry helpers — ready to import into your CosmJS project. + + + +### Using Telescope Output with CosmJS + +Telescope-generated types implement `TelescopeGeneratedType`, which the CosmJS `Registry` accepts directly. A typical Telescope output includes: + +- **Message codecs** (`MsgXxx` with `encode`, `decode`, `fromPartial`) +- **Query clients** (`QueryClientImpl` for gRPC-web queries) +- **Registry arrays** (pre-built `[typeUrl, codec]` pairs) +- **Amino converters** (ready-made `AminoConverter` objects) + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes, AminoTypes, createDefaultAminoConverters } from "@cosmjs/stargate"; + +// Telescope-generated imports from OsmoJS +import { osmosis, osmosisProtoRegistry, osmosisAminoConverters } from "osmojs"; + +// Message composers give you typed helpers +const { joinPool, swapExactAmountIn } = osmosis.gamm.v1beta1.MessageComposer.withTypeUrl; + +// Use the top-level registry and amino exports +const registry = new Registry([ + ...defaultRegistryTypes, + ...osmosisProtoRegistry, +]); + +const aminoTypes = new AminoTypes({ + ...createDefaultAminoConverters(), + ...osmosisAminoConverters, +}); +``` + +### Chain-Specific Libraries + +Many popular chains already have Telescope-generated libraries published on npm: + +| Chain | Package | Install | +|-------|---------|---------| +| Osmosis | `osmojs` | `npm install osmojs` | +| Stargaze | `stargazejs` | `npm install stargazejs` | +| Juno | `juno-network` | `npm install juno-network` | +| Stride | `stridejs` | `npm install stridejs` | +| dYdX | `@dydxprotocol/v4-client-js` | `npm install @dydxprotocol/v4-client-js` | +| Injective | `@injectivelabs/sdk-ts` | `npm install @injectivelabs/sdk-ts` | + +Check if a library exists for your chain before generating types from scratch. + +## ts-proto + +CosmJS itself uses [ts-proto](https://github.com/stephenh/ts-proto) via the [`cosmjs-types`](https://github.com/confio/cosmjs-types) package. It's a lightweight, general-purpose protobuf code generator that produces clean TypeScript with no Cosmos-specific abstractions. + +### Setup + +Install `ts-proto` and `protoc` (the Protocol Buffer compiler): + + + +```bash npm +npm install --save-dev ts-proto +``` + +```bash yarn +yarn add --dev ts-proto +``` + + + +You also need [`protoc`](https://github.com/protocolbuffers/protobuf/releases) installed on your system. + +### Generating Code + +```bash +protoc \ + --plugin="./node_modules/.bin/protoc-gen-ts_proto" \ + --ts_proto_out="./src/generated" \ + --proto_path="./proto" \ + --ts_proto_opt="esModuleInterop=true,forceLong=bigint,useOptionals=messages" \ + ./proto/mymodule/v1/tx.proto \ + ./proto/mymodule/v1/query.proto +``` + +Key `ts_proto_opt` options: + +| Option | Recommended value | Purpose | +|--------|-------------------|---------| +| `esModuleInterop` | `true` | Compatibility with ES module imports | +| `forceLong` | `bigint` | Use native `bigint` instead of the `Long` library | +| `useOptionals` | `messages` | Make nested message fields optional | + +The generated `MsgXxx` and `QueryClientImpl` classes work directly with CosmJS's `Registry` and `createProtobufRpcClient`. + +### Working with Yarn 2+ + +The binary `./node_modules/.bin/protoc-gen-ts_proto` is not easily available in Yarn 2+. Create an executable wrapper script `bin/protoc-gen-ts_proto_yarn_2`: + +```bash +#!/usr/bin/env -S yarn node +require('ts-proto/build/plugin') +``` + +Then use `--ts_proto_yarn_2_opt` instead of `--ts_proto_opt` in your `protoc` command. See the [cosmjs-types repo](https://github.com/confio/cosmjs-types) for a full example. + +## protobufjs (Runtime Types) + +For prototyping or when you don't have access to `.proto` files, [protobufjs](https://github.com/protobufjs/protobuf.js) lets you define types at runtime in pure JavaScript — no build step required: + +```typescript +import * as protobuf from "protobufjs"; +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes } from "@cosmjs/stargate"; + +const root = protobuf.Root.fromJSON({ + nested: { + blog: { + nested: { + v1: { + nested: { + MsgCreatePost: { + fields: { + author: { type: "string", id: 1 }, + title: { type: "string", id: 2 }, + body: { type: "string", id: 3 }, + }, + }, + }, + }, + }, + }, + }, +}); + +const MsgCreatePost = root.lookupType("blog.v1.MsgCreatePost"); + +const registry = new Registry(defaultRegistryTypes); +registry.register("/blog.v1.MsgCreatePost", MsgCreatePost); +``` + + +Runtime types from protobufjs use `create` instead of `fromPartial`. The Registry handles both automatically. + + +### When to Use protobufjs + +- **Prototyping**: Quickly test a message type without setting up a codegen pipeline +- **Dynamic schemas**: When the proto definitions aren't known at build time +- **Plain JavaScript**: When you don't want a TypeScript build step + +For production applications, Telescope or ts-proto are preferred because they provide compile-time type safety. + +## Next Steps + + + + Register your generated types in the CosmJS Registry. + + + Wire generated types into a complete module integration. + + + Configure CosmJS for your chain's address prefix, gas token, and account type. + + diff --git a/cosmjs/v0.38.x/guides/extending/custom-modules.mdx b/cosmjs/v0.38.x/guides/extending/custom-modules.mdx new file mode 100644 index 000000000..6db47c45b --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/custom-modules.mdx @@ -0,0 +1,220 @@ +--- +title: "Custom Modules" +description: "Combine types, queries, and Amino converters into a complete custom module integration" +--- + +A complete custom module integration brings together [registry types](/cosmjs/v0.38.x/guides/extending/custom-types), [query extensions](/cosmjs/v0.38.x/guides/extending/query-extensions), and [Amino converters](/cosmjs/v0.38.x/guides/extending/amino-converters) into a single cohesive package. This page walks through the full structure for a hypothetical `blog` module. + +## Module File Structure + +A well-organized module integration follows the same pattern CosmJS uses internally for its built-in modules: + +``` +src/ +├── generated/ +│ └── blog/v1/ +│ ├── tx.ts # Generated message codecs (MsgCreatePost, etc.) +│ ├── query.ts # Generated QueryClientImpl +│ └── types.ts # Generated shared types (Post, etc.) +└── modules/ + └── blog.ts # Registry types, Amino converters, query extension +``` + +## End-to-End Example + + + +### Generate TypeScript types from protobuf + +Use one of the supported code generators. With `ts-proto` and `protoc`: + +```bash +protoc \ + --plugin="./node_modules/.bin/protoc-gen-ts_proto" \ + --ts_proto_out="./src/generated" \ + --proto_path="./proto" \ + --ts_proto_opt="esModuleInterop=true,forceLong=bigint,useOptionals=messages" \ + ./proto/blog/v1/tx.proto \ + ./proto/blog/v1/query.proto +``` + +This produces `src/generated/blog/v1/tx.ts` (message codecs) and `src/generated/blog/v1/query.ts` (query service). + +### Define the module integration + +Create a single file that exports registry types, Amino converters, encode objects, and the query extension: + +```typescript +// src/modules/blog.ts +import { EncodeObject, GeneratedType } from "@cosmjs/proto-signing"; +import { AminoConverters, createProtobufRpcClient, QueryClient } from "@cosmjs/stargate"; + +import { MsgCreatePost, MsgEditPost, MsgDeletePost } from "../generated/blog/v1/tx"; +import { QueryClientImpl } from "../generated/blog/v1/query"; +import type { Post } from "../generated/blog/v1/types"; + +// Registry types +export const blogTypes: ReadonlyArray<[string, GeneratedType]> = [ + ["/blog.v1.MsgCreatePost", MsgCreatePost], + ["/blog.v1.MsgEditPost", MsgEditPost], + ["/blog.v1.MsgDeletePost", MsgDeletePost], +]; + +// Typed encode objects +export interface MsgCreatePostEncodeObject extends EncodeObject { + readonly typeUrl: "/blog.v1.MsgCreatePost"; + readonly value: Partial; +} + +// Amino converters +export function createBlogAminoConverters(): AminoConverters { + return { + "/blog.v1.MsgCreatePost": { + aminoType: "blog/MsgCreatePost", + toAmino: ({ author, title, body }) => ({ author, title, body }), + fromAmino: ({ author, title, body }) => ({ author, title, body }), + }, + "/blog.v1.MsgEditPost": { + aminoType: "blog/MsgEditPost", + toAmino: ({ author, id, title, body }) => ({ + author, + id: id.toString(), + title, + body, + }), + fromAmino: ({ author, id, title, body }) => ({ + author, + id: BigInt(id), + title, + body, + }), + }, + "/blog.v1.MsgDeletePost": { + aminoType: "blog/MsgDeletePost", + toAmino: ({ author, id }) => ({ author, id: id.toString() }), + fromAmino: ({ author, id }) => ({ author, id: BigInt(id) }), + }, + }; +} + +// Query extension +export interface BlogExtension { + readonly blog: { + readonly post: (id: bigint) => Promise; + readonly posts: (author: string) => Promise; + }; +} + +export function setupBlogExtension(base: QueryClient): BlogExtension { + const rpc = createProtobufRpcClient(base); + const queryService = new QueryClientImpl(rpc); + + return { + blog: { + post: async (id: bigint) => { + const { post } = await queryService.Post({ id }); + if (!post) throw new Error(`Post ${id} not found`); + return post; + }, + posts: async (author: string) => { + const { posts } = await queryService.Posts({ author }); + return posts; + }, + }, + }; +} +``` + +### Wire everything into the client + +```typescript +import { DirectSecp256k1HdWallet, Registry } from "@cosmjs/proto-signing"; +import { + SigningStargateClient, + GasPrice, + AminoTypes, + defaultRegistryTypes, + createDefaultAminoConverters, +} from "@cosmjs/stargate"; + +import { blogTypes, createBlogAminoConverters, MsgCreatePostEncodeObject } from "./modules/blog"; +import { MsgCreatePost } from "./generated/blog/v1/tx"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic( + "your mnemonic words here ...", + { prefix: "blog" }, +); +const [{ address }] = await wallet.getAccounts(); + +const registry = new Registry([...defaultRegistryTypes, ...blogTypes]); +const aminoTypes = new AminoTypes({ + ...createDefaultAminoConverters(), + ...createBlogAminoConverters(), +}); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { registry, aminoTypes, gasPrice: GasPrice.fromString("0.025ublog") }, +); + +const msg: MsgCreatePostEncodeObject = { + typeUrl: "/blog.v1.MsgCreatePost", + value: MsgCreatePost.fromPartial({ + author: address, + title: "My First Post", + body: "Published with CosmJS and custom module support.", + }), +}; + +const result = await client.signAndBroadcast(address, [msg], "auto"); +``` + + + +## Combining Multiple Modules + +Real applications often integrate types from several modules. Aggregate module registrations into a single setup: + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { + defaultRegistryTypes, + AminoTypes, + createDefaultAminoConverters, +} from "@cosmjs/stargate"; + +import { blogTypes, createBlogAminoConverters } from "./modules/blog"; +import { marketplaceTypes, createMarketplaceAminoConverters } from "./modules/marketplace"; +import { identityTypes, createIdentityAminoConverters } from "./modules/identity"; + +const allTypes = [ + ...defaultRegistryTypes, + ...blogTypes, + ...marketplaceTypes, + ...identityTypes, +]; + +const allAminoConverters = { + ...createDefaultAminoConverters(), + ...createBlogAminoConverters(), + ...createMarketplaceAminoConverters(), + ...createIdentityAminoConverters(), +}; + +const registry = new Registry(allTypes); +const aminoTypes = new AminoTypes(allAminoConverters); +``` + +Each module follows the same structure: export `xxxTypes` for the registry, `createXxxAminoConverters()` for Amino support, and `setupXxxExtension()` for queries. This pattern scales cleanly regardless of how many custom modules your chain has. + +## Next Steps + + + + Configure CosmJS for a new Cosmos SDK chain with custom parameters. + + + Automate type generation with Telescope or ts-proto instead of hand-writing modules. + + diff --git a/cosmjs/v0.38.x/guides/extending/custom-types.mdx b/cosmjs/v0.38.x/guides/extending/custom-types.mdx new file mode 100644 index 000000000..0f6dd8ab9 --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/custom-types.mdx @@ -0,0 +1,148 @@ +--- +title: "Custom Protobuf Types" +description: "Register custom message types in the Registry, create type-safe encode objects, and decode transactions" +--- + +Every transaction message in Cosmos SDK is identified by a **type URL** (e.g. `"/cosmos.bank.v1beta1.MsgSend"`) and encoded as Protocol Buffers. The `Registry` in `@cosmjs/proto-signing` maps type URLs to their codec implementations so CosmJS can encode and decode messages. + +## Adding Types to the Registry + +Start from `defaultRegistryTypes`, which includes all standard Cosmos SDK message types, and add your own: + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes, SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +import { MsgCreatePost } from "./generated/blog/v1/tx"; + +const registry = new Registry(defaultRegistryTypes); +registry.register("/blog.v1.MsgCreatePost", MsgCreatePost); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { registry, gasPrice: GasPrice.fromString("0.025utoken") }, +); +``` + +Now `signAndBroadcast` can serialize `MsgCreatePost` messages: + +```typescript +const result = await client.signAndBroadcast( + senderAddress, + [ + { + typeUrl: "/blog.v1.MsgCreatePost", + value: MsgCreatePost.fromPartial({ + author: senderAddress, + title: "Hello Cosmos", + body: "This is my first post on-chain.", + }), + }, + ], + "auto", +); +``` + +## Registering Multiple Types + +When your module has several message types, define them as an array and spread into the registry: + +```typescript +import { GeneratedType, Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes } from "@cosmjs/stargate"; + +import { MsgCreatePost, MsgEditPost, MsgDeletePost } from "./generated/blog/v1/tx"; + +const blogTypes: ReadonlyArray<[string, GeneratedType]> = [ + ["/blog.v1.MsgCreatePost", MsgCreatePost], + ["/blog.v1.MsgEditPost", MsgEditPost], + ["/blog.v1.MsgDeletePost", MsgDeletePost], +]; + +const registry = new Registry([...defaultRegistryTypes, ...blogTypes]); +``` + +## Supported Codec Formats + +The `Registry` accepts types generated by any of these tools: + +| Generator | Interface | `fromPartial` | Notes | +|-----------|-----------|---------------|-------| +| [Telescope](https://github.com/cosmology-tech/telescope) 1.x | `TelescopeGeneratedType` | Yes | Used by OsmoJS, Stargaze, dYdX, and others | +| [ts-proto](https://github.com/stephenh/ts-proto) 1.x | `TsProtoGeneratedType` | Yes | Used by `cosmjs-types` (CosmJS's own types) | +| [ts-proto](https://github.com/stephenh/ts-proto) 2.x | `TsProto2GeneratedType` | Yes | Uses `@bufbuild/protobuf` wire format | +| [protobufjs](https://github.com/protobufjs/protobuf.js) | `PbjsGeneratedType` | No (uses `create`) | Runtime-only type definitions, no codegen step required | + +All four implement `encode` and `decode`. Types with `fromPartial` (Telescope, ts-proto) are preferred because they allow constructing messages from partial objects without specifying every field. + +See the [Code Generation](/cosmjs/v0.38.x/guides/extending/code-generation) page for details on each tool. + +## Type-Safe Encode Objects + +For large projects, define typed encode objects that narrow the `typeUrl` to a string literal. This prevents typos and gives you autocomplete on the `value` field: + +```typescript +import { EncodeObject } from "@cosmjs/proto-signing"; +import { MsgCreatePost } from "./generated/blog/v1/tx"; + +export interface MsgCreatePostEncodeObject extends EncodeObject { + readonly typeUrl: "/blog.v1.MsgCreatePost"; + readonly value: Partial; +} + +export function isMsgCreatePostEncodeObject( + o: EncodeObject, +): o is MsgCreatePostEncodeObject { + return o.typeUrl === "/blog.v1.MsgCreatePost"; +} +``` + +Use them when constructing transactions: + +```typescript +const msg: MsgCreatePostEncodeObject = { + typeUrl: "/blog.v1.MsgCreatePost", + value: MsgCreatePost.fromPartial({ + author: senderAddress, + title: "Type-safe message", + body: "The compiler catches typos in typeUrl.", + }), +}; + +const result = await client.signAndBroadcast(senderAddress, [msg], "auto"); +``` + +## Decoding Transactions + +The `Registry` also decodes incoming data. This is useful for parsing transactions from the blockchain or decoding responses: + +```typescript +import { decodeTxRaw } from "@cosmjs/proto-signing"; + +const tx = await client.getTx(txHash); +if (tx) { + const decoded = decodeTxRaw(tx.tx); + + for (const msg of decoded.body.messages) { + const decodedMsg = registry.decode(msg); + console.info(`${msg.typeUrl}:`, decodedMsg); + } +} +``` + +Without your custom types registered, `registry.decode` throws `Unregistered type url` for unknown message types. Register all types you expect to encounter before decoding. + +## Next Steps + + + + Build typed query methods for your custom module. + + + Add Amino JSON signing support for wallets like Keplr and Leap. + + + Generate TypeScript codecs from protobuf definitions automatically. + + diff --git a/cosmjs/v0.38.x/guides/extending/extending.mdx b/cosmjs/v0.38.x/guides/extending/extending.mdx new file mode 100644 index 000000000..e19e63618 --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/extending.mdx @@ -0,0 +1,45 @@ +--- +title: "Extending CosmJS" +description: "Register custom protobuf types, build query extensions, integrate custom modules, and support new Cosmos SDK chains" +--- + +CosmJS is designed to be extended. While it ships with support for standard Cosmos SDK modules (bank, staking, governance, IBC), most Cosmos chains include custom modules with their own message types and query services. This section walks through every extension point — from registering a single custom message type to building full module integrations with code generation tools. + +## Prerequisites + + + +```bash npm +npm install @cosmjs/stargate @cosmjs/proto-signing @cosmjs/tendermint-rpc @cosmjs/amino +``` + +```bash yarn +yarn add @cosmjs/stargate @cosmjs/proto-signing @cosmjs/tendermint-rpc @cosmjs/amino +``` + + + +You should be familiar with [signing clients](/cosmjs/v0.38.x/concepts/clients/signing-clients), [the Registry](/cosmjs/v0.38.x/concepts/messages-encoding/registry), and [encode objects](/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects) before proceeding. + +## Guides + + + + Register custom message types in the Registry, create type-safe encode objects, and decode transactions. + + + Build typed query extensions that wrap your module's gRPC query service. + + + Add Amino JSON signing support for custom message types used by wallets like Keplr and Leap. + + + Combine types, queries, and Amino converters into a complete module integration. + + + Configure CosmJS for new Cosmos SDK chains with custom prefixes, gas prices, and account types. + + + Generate TypeScript types from protobuf definitions using Telescope, ts-proto, or protobufjs. + + diff --git a/cosmjs/v0.38.x/guides/extending/new-chains.mdx b/cosmjs/v0.38.x/guides/extending/new-chains.mdx new file mode 100644 index 000000000..481c8826b --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/new-chains.mdx @@ -0,0 +1,175 @@ +--- +title: "Supporting New Chains" +description: "Configure CosmJS for new Cosmos SDK chains with custom prefixes, gas prices, and account types" +--- + +Connecting to a new Cosmos SDK chain typically involves configuring a few chain-specific parameters. CosmJS auto-detects the CometBFT version (0.37, 0.38, or 1.x), so transport setup is usually automatic. + +## Chain Configuration + +The minimum configuration you need for a new chain: + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const chainConfig = { + rpcEndpoint: "https://rpc.my-chain.network", + prefix: "mychain", + denom: "umytoken", + gasPrice: "0.01umytoken", +}; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: chainConfig.prefix, +}); + +const client = await SigningStargateClient.connectWithSigner( + chainConfig.rpcEndpoint, + wallet, + { gasPrice: GasPrice.fromString(chainConfig.gasPrice) }, +); +``` + +The key parameters are: + +| Parameter | Purpose | Example | +|-----------|---------|---------| +| `rpcEndpoint` | CometBFT/Tendermint RPC URL | `"https://rpc.my-chain.network"` | +| `prefix` | Bech32 address prefix | `"osmo"`, `"cosmos"`, `"juno"` | +| `denom` | Fee token denomination | `"uosmo"`, `"uatom"` | +| `gasPrice` | Price per gas unit | `"0.025uosmo"` | + +## Chains with Custom Modules + +Most application-specific chains (Osmosis, dYdX, Stride, etc.) define custom modules beyond the standard Cosmos SDK set. Register their types and converters as described in the [Custom Modules](/cosmjs/v0.38.x/guides/extending/custom-modules) guide: + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { + SigningStargateClient, + GasPrice, + AminoTypes, + defaultRegistryTypes, + createDefaultAminoConverters, +} from "@cosmjs/stargate"; + +const registry = new Registry([ + ...defaultRegistryTypes, + ...myChainModuleATypes, + ...myChainModuleBTypes, +]); + +const aminoTypes = new AminoTypes({ + ...createDefaultAminoConverters(), + ...createModuleAAminoConverters(), + ...createModuleBAminoConverters(), +}); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { registry, aminoTypes, gasPrice: GasPrice.fromString("0.01utoken") }, +); +``` + + +Many popular chains have pre-built TypeScript libraries generated with Telescope: [OsmoJS](https://github.com/osmosis-labs/osmojs) for Osmosis, [stargazejs](https://github.com/public-awesome/stargazejs) for Stargaze, [stridejs](https://github.com/Stride-Labs/stridejs) for Stride, and others. Check if one exists for your chain before writing custom module code. + + +## Custom Account Parsers + +Some chains use non-standard account types (e.g. `EthAccount` on EVM-compatible chains). The default `accountFromAny` parser won't recognize them, causing account lookups to fail. Pass a custom `accountParser` to handle these: + +```typescript +import { accountFromAny, AccountParser } from "@cosmjs/stargate"; +import { EthAccount } from "./generated/ethermint/types/v1/account"; +import { Any } from "cosmjs-types/google/protobuf/any"; + +const customAccountParser: AccountParser = (any: Any) => { + if (any.typeUrl === "/ethermint.types.v1.EthAccount") { + const ethAccount = EthAccount.decode(any.value); + const baseAccount = ethAccount.baseAccount; + if (!baseAccount) throw new Error("EthAccount missing baseAccount"); + return { + address: baseAccount.address, + pubkey: baseAccount.pubKey ? decodePubkey(baseAccount.pubKey) : null, + accountNumber: Number(baseAccount.accountNumber), + sequence: Number(baseAccount.sequence), + }; + } + return accountFromAny(any); +}; + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { accountParser: customAccountParser }, +); +``` + +The `accountParser` option is available on both `StargateClient` (read-only) and `SigningStargateClient` (signing). The parser receives an `Any`-encoded account from the auth module and must return an `Account` object with `address`, `pubkey`, `accountNumber`, and `sequence`. + +## HD Derivation Paths + +Different chains may use different [BIP-44](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki) coin types in their HD derivation path. The default is `m/44'/118'/0'/0/0` (coin type 118, the Cosmos Hub standard). Override this for chains that use a different coin type: + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: "evmos", + hdPaths: [stringToPath("m/44'/60'/0'/0/0")], +}); +``` + +Common coin types: + +| Chain | Coin Type | HD Path | +|-------|-----------|---------| +| Cosmos Hub, most Cosmos chains | 118 | `m/44'/118'/0'/0/0` | +| Ethereum-based (Evmos, Injective) | 60 | `m/44'/60'/0'/0/0` | +| Terra | 330 | `m/44'/330'/0'/0/0` | +| Crypto.org | 394 | `m/44'/394'/0'/0/0` | + +```typescript +import { stringToPath } from "@cosmjs/crypto"; + +const cosmosPath = stringToPath("m/44'/118'/0'/0/0"); +const ethPath = stringToPath("m/44'/60'/0'/0/0"); +``` + +## Multiple Accounts + +To derive multiple accounts from the same mnemonic, pass multiple HD paths: + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { stringToPath } from "@cosmjs/crypto"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: "cosmos", + hdPaths: [ + stringToPath("m/44'/118'/0'/0/0"), + stringToPath("m/44'/118'/0'/0/1"), + stringToPath("m/44'/118'/0'/0/2"), + ], +}); + +const accounts = await wallet.getAccounts(); +// accounts[0], accounts[1], accounts[2] — each with a different address +``` + +## Next Steps + + + + Build a complete module integration for your chain's custom message types. + + + Use Telescope or ts-proto to generate TypeScript types from your chain's protobuf definitions. + + + Special considerations for EVM-compatible Cosmos chains. + + diff --git a/cosmjs/v0.38.x/guides/extending/query-extensions.mdx b/cosmjs/v0.38.x/guides/extending/query-extensions.mdx new file mode 100644 index 000000000..d8e0163fe --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/query-extensions.mdx @@ -0,0 +1,157 @@ +--- +title: "Query Extensions" +description: "Build typed query extensions that wrap your module's gRPC query service" +--- + +CosmJS uses the **query extension** pattern to expose typed query methods on the client. Each extension wraps a protobuf `QueryClientImpl` generated from your module's `.proto` files and attaches its methods to a shared `QueryClient`. + +## The Extension Pattern + +An extension is a function that takes a `QueryClient` and returns an object with your query methods, namespaced under a key that represents your module: + +```typescript +import { createProtobufRpcClient, QueryClient } from "@cosmjs/stargate"; +import { QueryClientImpl } from "./generated/blog/v1/query"; + +export interface BlogExtension { + readonly blog: { + readonly post: (id: bigint) => Promise; + readonly posts: (author: string) => Promise; + }; +} + +export function setupBlogExtension(base: QueryClient): BlogExtension { + const rpc = createProtobufRpcClient(base); + const queryService = new QueryClientImpl(rpc); + + return { + blog: { + post: async (id: bigint) => { + const { post } = await queryService.Post({ id }); + if (!post) throw new Error(`Post ${id} not found`); + return post; + }, + posts: async (author: string) => { + const { posts } = await queryService.Posts({ author }); + return posts; + }, + }, + }; +} +``` + +The three layers work together: + +1. `createProtobufRpcClient` wraps the `QueryClient` into a protobuf-compatible RPC transport +2. `QueryClientImpl` (generated from your `.proto` files) provides typed query methods over that transport +3. Your extension function maps those raw RPC calls into a developer-friendly API + + +The outer key (`blog` above) namespaces your methods on the query client. Choose a name that matches your module to avoid collisions with other extensions. + + +## Composing Extensions + +Use `QueryClient.withExtensions` to combine your extension with built-in ones: + +```typescript +import { QueryClient, setupBankExtension, setupStakingExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); + +const queryClient = QueryClient.withExtensions( + cometClient, + setupBankExtension, + setupStakingExtension, + setupBlogExtension, +); + +const post = await queryClient.blog.post(1n); +const balance = await queryClient.bank.balance("cosmos1abc...", "utoken"); +``` + +`QueryClient.withExtensions` supports up to 18 extensions, which is enough for even the most feature-rich chains. The resulting client is fully typed — TypeScript knows about all the query namespaces you've composed. + +## Using QueryClientImpl Directly + +If you only need a quick one-off query without composing extensions, use the generated query service directly: + +```typescript +import { createProtobufRpcClient, QueryClient } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; +import { QueryClientImpl } from "./generated/blog/v1/query"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = new QueryClient(cometClient); +const rpc = createProtobufRpcClient(queryClient); +const blogQuery = new QueryClientImpl(rpc); + +const { post } = await blogQuery.Post({ id: 1n }); +``` + +This approach skips the extension boilerplate and is useful for scripts, debugging, or when you only query a single module. + +## Handling Pagination + +Many Cosmos SDK queries return paginated results. Pass `PageRequest` to control pagination and iterate through all pages: + +```typescript +import { createPagination, createProtobufRpcClient, QueryClient } from "@cosmjs/stargate"; +import { QueryClientImpl } from "./generated/blog/v1/query"; + +export interface BlogExtension { + readonly blog: { + readonly allPosts: (paginationKey?: Uint8Array) => Promise<{ + readonly posts: Post[]; + readonly nextKey: Uint8Array | undefined; + }>; + }; +} + +export function setupBlogExtension(base: QueryClient): BlogExtension { + const rpc = createProtobufRpcClient(base); + const queryService = new QueryClientImpl(rpc); + + return { + blog: { + allPosts: async (paginationKey?: Uint8Array) => { + const response = await queryService.Posts({ + pagination: createPagination(paginationKey), + }); + return { + posts: response.posts, + nextKey: response.pagination?.nextKey, + }; + }, + }, + }; +} +``` + +Iterate through all pages: + +```typescript +const allPosts: Post[] = []; +let nextKey: Uint8Array | undefined; + +do { + const page = await queryClient.blog.allPosts(nextKey); + allPosts.push(...page.posts); + nextKey = page.nextKey?.length ? page.nextKey : undefined; +} while (nextKey); +``` + +## Next Steps + + + + Register message types in the Registry for signing transactions. + + + Combine query extensions with types and Amino converters into a complete module. + + + Generate QueryClientImpl and message codecs from protobuf definitions. + + diff --git a/cosmjs/v0.38.x/guides/query/accounts.mdx b/cosmjs/v0.38.x/guides/query/accounts.mdx new file mode 100644 index 000000000..e9e7a1d89 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/accounts.mdx @@ -0,0 +1,94 @@ +--- +title: "Account Queries" +description: "Look up account info, sequence numbers, and handle custom account types with AccountParser" +--- + +Account data is available through both the high-level client and the auth extension. Use `StargateClient` methods for most cases, and drop down to the auth extension when you need the raw protobuf response. + +## Using StargateClient + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const account = await client.getAccount("cosmos1..."); +if (account) { + console.info(account.address); + console.info(account.accountNumber); + console.info(account.sequence); + console.info(account.pubkey); +} + +const seq = await client.getSequence("cosmos1..."); +console.info(seq.accountNumber, seq.sequence); +``` + +`getAccount` returns `null` for addresses that have never received tokens. `getSequence` throws if the account does not exist. + +## Supported Account Types + +The default `accountFromAny` parser handles these Cosmos SDK account types: + +| Type URL | Account Type | +|----------|-------------| +| `/cosmos.auth.v1beta1.BaseAccount` | Standard account | +| `/cosmos.auth.v1beta1.ModuleAccount` | Module-owned account | +| `/cosmos.vesting.v1beta1.BaseVestingAccount` | Base vesting | +| `/cosmos.vesting.v1beta1.ContinuousVestingAccount` | Continuous vesting | +| `/cosmos.vesting.v1beta1.DelayedVestingAccount` | Delayed vesting | +| `/cosmos.vesting.v1beta1.PeriodicVestingAccount` | Periodic vesting | + +Any unrecognized type URL causes `accountFromAny` to throw. Use a custom `AccountParser` to handle chain-specific account types. + +## Using the Auth Extension Directly + +```typescript +import { QueryClient, setupAuthExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupAuthExtension); + +const anyAccount = await queryClient.auth.account("cosmos1..."); +``` + +The auth extension returns the raw protobuf `Any` type. `StargateClient` parses this with `accountFromAny`, which handles `BaseAccount`, `ModuleAccount`, and all vesting account types. + +## Custom Account Parser + +Chains with non-standard account types require a custom `AccountParser`: + +```typescript +import { StargateClient, accountFromAny } from "@cosmjs/stargate"; + +function myAccountParser(any: Any): Account { + if (any.typeUrl === "/my.chain.CustomAccount") { + const decoded = MyCustomAccount.decode(any.value); + return { + address: decoded.address, + pubkey: null, + accountNumber: decoded.accountNumber, + sequence: decoded.sequence, + }; + } + return accountFromAny(any); +} + +const client = await StargateClient.connect("https://rpc.my-chain.network", { + accountParser: myAccountParser, +}); +``` + + +Fall back to `accountFromAny` for standard types so your parser stays forward-compatible with Cosmos SDK updates. + + + + + Token balances and supply. + + + Handle missing accounts and other query errors. + + diff --git a/cosmjs/v0.38.x/guides/query/bank.mdx b/cosmjs/v0.38.x/guides/query/bank.mdx new file mode 100644 index 000000000..a4684db7a --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/bank.mdx @@ -0,0 +1,56 @@ +--- +title: "Bank Queries" +description: "Query token balances, total supply, and denomination metadata using the bank extension" +--- + +The bank extension queries token balances, supply, and denomination metadata. + +```typescript +import { QueryClient, setupBankExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupBankExtension); + +const balance = await queryClient.bank.balance("cosmos1...", "uatom"); +console.info(balance); // { denom: "uatom", amount: "1000000" } + +const allBalances = await queryClient.bank.allBalances("cosmos1..."); +console.info(allBalances); // [{ denom: "uatom", amount: "1000000" }, ...] +``` + +## Available Methods + +| Method | Parameters | Returns | +|--------|-----------|---------| +| `balance` | `address, denom` | `Coin` | +| `allBalances` | `address` | `Coin[]` | +| `totalSupply` | `paginationKey?` | `QueryTotalSupplyResponse` | +| `supplyOf` | `denom` | `Coin` | +| `denomMetadata` | `denom` | `Metadata` | +| `denomsMetadata` | — | `Metadata[]` | + +## Total Supply with Pagination + +```typescript +const firstPage = await queryClient.bank.totalSupply(); +console.info(firstPage.supply); + +if (firstPage.pagination?.nextKey?.length) { + const secondPage = await queryClient.bank.totalSupply(firstPage.pagination.nextKey); + console.info(secondPage.supply); +} +``` + + +`totalSupply` is the only paginated method in the bank module. See [Pagination](/cosmjs/v0.38.x/guides/query/pagination) for the general pattern. + + + + + Validators, delegations, and staking pool. + + + Navigate paginated result sets. + + diff --git a/cosmjs/v0.38.x/guides/query/blocks-and-chain-info.mdx b/cosmjs/v0.38.x/guides/query/blocks-and-chain-info.mdx new file mode 100644 index 000000000..1e6701182 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/blocks-and-chain-info.mdx @@ -0,0 +1,96 @@ +--- +title: "Blocks & Chain Info" +description: "Query block data, chain status, validator sets, and historical state" +--- + +Beyond module-specific queries, the CometBFT RPC layer provides block-level and chain-level information. You can access basic block data through `StargateClient` or use the CometBFT client directly for advanced queries. + +## Chain Status + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const chainId = await client.getChainId(); +const height = await client.getHeight(); +``` + +## Block Data + +```typescript +const latestBlock = await client.getBlock(); +console.info(latestBlock.header.height); +console.info(latestBlock.header.time); +console.info(latestBlock.header.chainId); +console.info(latestBlock.txs.length); + +const block100 = await client.getBlock(100); +``` + +## Using the CometBFT Client Directly + +For advanced block queries (block results, validator sets, block search), use the CometBFT client directly: + +```typescript +import { Comet38Client } from "@cosmjs/tendermint-rpc"; + +const cometClient = await Comet38Client.connect("https://rpc.my-chain.network"); + +const status = await cometClient.status(); +console.info(status.nodeInfo.network); +console.info(status.syncInfo.latestBlockHeight); +console.info(status.syncInfo.catchingUp); + +const validators = await cometClient.validatorsAll(100); +console.info(validators.validators); + +const blockResults = await cometClient.blockResults(100); +console.info(blockResults.results); + +const genesis = await cometClient.genesis(); +console.info(genesis.chainId); +``` + +### Available CometBFT Methods + +| Method | Description | +|--------|-------------| +| `status()` | Node info, sync status, latest block | +| `block(height?)` | Full block at height | +| `blockResults(height?)` | Tx results and events at height | +| `blockSearch(params)` | Search blocks by event query | +| `blockchain(min?, max?)` | Block headers in a height range | +| `validators(params)` | Validator set (paginated) | +| `validatorsAll(height?)` | Full validator set at height | +| `genesis()` | Genesis document | +| `health()` | Node health check | +| `numUnconfirmedTxs()` | Mempool summary | +| `tx(params)` | Single transaction by hash | +| `txSearch(params)` | Search transactions | +| `commit(height?)` | Signed block header | +| `abciInfo()` | ABCI application info | +| `abciQuery(params)` | Raw ABCI query | + +## Historical Queries + +`QueryClient.queryAbci` accepts an optional `desiredHeight` parameter, allowing you to query chain state as it existed at a specific block height: + +```typescript +import { QueryClient, setupBankExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupBankExtension); +``` + +The built-in extensions do not expose height parameters directly. For historical queries, use the lower-level `queryAbci` method or construct an RPC client that targets a specific height. This is primarily useful for building block explorers or auditing state changes. + + + + Search and decode transactions. + + + All available query methods. + + diff --git a/cosmjs/v0.38.x/guides/query/cosmwasm.mdx b/cosmjs/v0.38.x/guides/query/cosmwasm.mdx new file mode 100644 index 000000000..2fe77ef5e --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/cosmwasm.mdx @@ -0,0 +1,55 @@ +--- +title: "CosmWasm Queries" +description: "Query smart contract state, metadata, and code info on CosmWasm-enabled chains" +--- + +For chains running CosmWasm, `CosmWasmClient` supports JSON smart queries and raw state lookups against contract storage. The wasm extension on `QueryClient` provides additional methods for code and contract metadata. + +## Smart Queries + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await CosmWasmClient.connect("https://rpc.my-chain.network"); + +const result = await client.queryContractSmart("osmo1contractaddr...", { + get_count: {}, +}); +console.info(result); // { count: 42 } +``` + +## Raw State Access + +```typescript +import { toAscii } from "@cosmjs/encoding"; + +const raw = await client.queryContractRaw("osmo1contractaddr...", toAscii("config")); +``` + +## Using the Wasm Extension + +The wasm extension on `QueryClient` provides additional methods for listing codes, contracts, and reading full contract state: + +```typescript +import { QueryClient } from "@cosmjs/stargate"; +import { setupWasmExtension } from "@cosmjs/cosmwasm"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupWasmExtension); + +const codes = await queryClient.wasm.listCodeInfo(); +const contracts = await queryClient.wasm.listContractsByCodeId(1); +const contractInfo = await queryClient.wasm.getContractInfo("osmo1contractaddr..."); +const history = await queryClient.wasm.getContractCodeHistory("osmo1contractaddr..."); +const allState = await queryClient.wasm.getAllContractState("osmo1contractaddr..."); +``` + + + + All available query methods and extensions. + + + Write query extensions for custom modules. + + diff --git a/cosmjs/v0.38.x/guides/query/custom-extensions.mdx b/cosmjs/v0.38.x/guides/query/custom-extensions.mdx new file mode 100644 index 000000000..118ba2217 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/custom-extensions.mdx @@ -0,0 +1,78 @@ +--- +title: "Custom Query Extensions" +description: "Write your own query extensions for custom chain modules and integrate them with QueryClient" +--- + +If your chain has custom modules, you can write your own query extensions that integrate seamlessly with `QueryClient`. This works with or without protobuf definitions. + +## From Protobuf Definitions + +If you have generated TypeScript types from your `.proto` files (using `ts-proto` or similar), wire them up with `createProtobufRpcClient`: + +```typescript +import { createProtobufRpcClient, QueryClient } from "@cosmjs/stargate"; +import { QueryClientImpl } from "./generated/mymodule/query"; + +export interface MyModuleExtension { + readonly mymodule: { + readonly myQuery: (param: string) => Promise; + }; +} + +export function setupMyModuleExtension(base: QueryClient): MyModuleExtension { + const rpc = createProtobufRpcClient(base); + const queryService = new QueryClientImpl(rpc); + + return { + mymodule: { + myQuery: async (param: string) => { + return queryService.MyQuery({ param }); + }, + }, + }; +} +``` + +## Using the Extension + +Compose your custom extension alongside built-in ones: + +```typescript +import { QueryClient, setupBankExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions( + cometClient, + setupBankExtension, + setupMyModuleExtension, +); + +const result = await queryClient.mymodule.myQuery("foo"); +``` + +## Without Protobuf Definitions + +You can also query any ABCI path directly using the raw query interface: + +```typescript +import { connectComet } from "@cosmjs/tendermint-rpc"; +import { QueryClient } from "@cosmjs/stargate"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = new QueryClient(cometClient); + +const response = await queryClient.queryAbci( + "/my.custom.module.Query/MyMethod", + encodedRequest, +); +``` + + + + All built-in query extensions. + + + Smart contract queries using the wasm extension. + + diff --git a/cosmjs/v0.38.x/guides/query/distribution-and-mint.mdx b/cosmjs/v0.38.x/guides/query/distribution-and-mint.mdx new file mode 100644 index 000000000..ea85801bb --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/distribution-and-mint.mdx @@ -0,0 +1,78 @@ +--- +title: "Distribution & Mint Queries" +description: "Query staking rewards, validator commission, community pool, inflation, and minting parameters" +--- + +The distribution and mint extensions cover staking rewards, validator commission, community pool, and inflation parameters. + +## Distribution Queries + +```typescript +import { QueryClient, setupDistributionExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupDistributionExtension); + +const rewards = await queryClient.distribution.delegationRewards( + "cosmos1...", + "cosmosvaloper1...", +); +console.info(rewards.rewards); + +const totalRewards = await queryClient.distribution.delegationTotalRewards("cosmos1..."); +console.info(totalRewards.total); + +const commission = await queryClient.distribution.validatorCommission("cosmosvaloper1..."); +console.info(commission.commission); + +const pool = await queryClient.distribution.communityPool(); +console.info(pool.pool); + +const withdrawAddr = await queryClient.distribution.delegatorWithdrawAddress("cosmos1..."); +console.info(withdrawAddr.withdrawAddress); +``` + +### Available Methods + +| Method | Parameters | Paginated | +|--------|-----------|-----------| +| `delegationRewards` | `delegatorAddress, validatorAddress` | No | +| `delegationTotalRewards` | `delegatorAddress` | No | +| `delegatorValidators` | `delegatorAddress` | No | +| `delegatorWithdrawAddress` | `delegatorAddress` | No | +| `validatorCommission` | `validatorAddress` | No | +| `validatorOutstandingRewards` | `validatorAddress` | No | +| `validatorSlashes` | `validatorAddress, startHeight, endHeight, paginationKey?` | Yes | +| `communityPool` | — | No | +| `params` | — | No | + +## Mint Queries + +The mint extension queries inflation rate and minting parameters. + +```typescript +import { QueryClient, setupMintExtension } from "@cosmjs/stargate"; + +const queryClient = QueryClient.withExtensions(cometClient, setupMintExtension); + +const inflation = await queryClient.mint.inflation(); +console.info(inflation.toString()); + +const annualProvisions = await queryClient.mint.annualProvisions(); +console.info(annualProvisions.toString()); + +const params = await queryClient.mint.params(); +console.info(params.mintDenom); +console.info(params.inflationMin.toString()); +console.info(params.inflationMax.toString()); +``` + + + + Validators and delegations tied to these rewards. + + + Proposals that can modify distribution and mint parameters. + + diff --git a/cosmjs/v0.38.x/guides/query/error-handling.mdx b/cosmjs/v0.38.x/guides/query/error-handling.mdx new file mode 100644 index 000000000..262781203 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/error-handling.mdx @@ -0,0 +1,79 @@ +--- +title: "Query Error Handling" +description: "Handle missing accounts, NotFound errors, broadcast failures, and timeouts" +--- + +CosmJS queries can throw errors for various reasons. The high-level clients handle common cases gracefully, but you should be aware of the patterns for each type of failure. + +## Missing Accounts + +`getAccount` returns `null` when the address has never received tokens. It catches `rpc error: code = NotFound` from the chain and converts it to `null`: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const account = await client.getAccount("cosmos1unknown..."); +if (account === null) { + console.info("Account does not exist on chain"); +} +``` + + +`getSequence` throws if the account does not exist — call `getAccount` first if the address might not be funded. + + +## Missing Delegations + +`getDelegation` returns `null` when there is no delegation between the given delegator and validator. It catches `"key not found"` errors: + +```typescript +const delegation = await client.getDelegation("cosmos1...", "cosmosvaloper1..."); +if (delegation === null) { + console.info("No delegation to this validator"); +} +``` + +## NotFound Errors on Extensions + +Extension methods do not catch errors automatically. A query for a non-existent resource (e.g., a denom that doesn't exist) throws with a message matching `rpc error: code = NotFound`: + +```typescript +try { + const metadata = await queryClient.bank.denomMetadata("nonexistent"); +} catch (error) { + if (error instanceof Error && /code = NotFound/i.test(error.message)) { + console.info("Denomination not found"); + } else { + throw error; + } +} +``` + +## Broadcast Errors + +When broadcasting fails at the CheckTx stage, a `BroadcastTxError` is thrown with `code`, `codespace`, and `log` fields. If the transaction is accepted but not included in a block within the timeout, a `TimeoutError` is thrown with the `txId` so you can check later: + +```typescript +import { TimeoutError, BroadcastTxError } from "@cosmjs/stargate"; + +try { + const result = await client.broadcastTx(signedTx); +} catch (error) { + if (error instanceof BroadcastTxError) { + console.info("Rejected:", error.code, error.codespace, error.log); + } else if (error instanceof TimeoutError) { + console.info("Timed out, check later with txId:", error.txId); + } +} +``` + + + + Search and decode transactions. + + + All available query methods and extensions. + + diff --git a/cosmjs/v0.38.x/guides/query/governance.mdx b/cosmjs/v0.38.x/guides/query/governance.mdx new file mode 100644 index 000000000..a03473149 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/governance.mdx @@ -0,0 +1,83 @@ +--- +title: "Governance Queries" +description: "Query proposals, votes, deposits, tallies, and governance parameters" +--- + +The governance extension queries proposals, votes, deposits, and tallies. + +```typescript +import { QueryClient, setupGovExtension } from "@cosmjs/stargate"; +import { ProposalStatus } from "cosmjs-types/cosmos/gov/v1beta1/gov"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupGovExtension); +``` + +## Proposals + +```typescript +const allProposals = await queryClient.gov.proposals( + ProposalStatus.PROPOSAL_STATUS_UNSPECIFIED, + "", + "", +); +console.info(allProposals.proposals); + +const votingProposals = await queryClient.gov.proposals( + ProposalStatus.PROPOSAL_STATUS_VOTING_PERIOD, + "", + "", +); + +const proposal = await queryClient.gov.proposal(1); +console.info(proposal.proposal); +``` + +## Votes and Deposits + +```typescript +const votes = await queryClient.gov.votes(1); +console.info(votes.votes); + +const vote = await queryClient.gov.vote(1, "cosmos1..."); +console.info(vote.vote); + +const deposits = await queryClient.gov.deposits(1); +console.info(deposits.deposits); + +const deposit = await queryClient.gov.deposit(1, "cosmos1..."); +``` + +## Tally and Params + +```typescript +const tally = await queryClient.gov.tally(1); +console.info(tally.tally); + +const votingParams = await queryClient.gov.params("voting"); +const depositParams = await queryClient.gov.params("deposit"); +const tallyParams = await queryClient.gov.params("tallying"); +``` + +## Available Methods + +| Method | Parameters | Paginated | +|--------|-----------|-----------| +| `proposals` | `proposalStatus, depositor, voter, paginationKey?` | Yes | +| `proposal` | `proposalId` | No | +| `votes` | `proposalId, paginationKey?` | Yes | +| `vote` | `proposalId, voterAddress` | No | +| `deposits` | `proposalId, paginationKey?` | Yes | +| `deposit` | `proposalId, depositorAddress` | No | +| `tally` | `proposalId` | No | +| `params` | `parametersType` | No | + + + + Validators and delegations. + + + Navigate paginated result sets. + + diff --git a/cosmjs/v0.38.x/guides/query/ibc.mdx b/cosmjs/v0.38.x/guides/query/ibc.mdx new file mode 100644 index 000000000..8c29eb8b9 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/ibc.mdx @@ -0,0 +1,58 @@ +--- +title: "IBC Queries" +description: "Query IBC channels, connections, clients, and transfer denomination traces" +--- + +The IBC extension provides queries for channels, connections, clients, and transfer denominations. It is the largest extension, organized into four namespaces: `channel`, `client`, `connection`, and `transfer`. + +```typescript +import { QueryClient, setupIbcExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupIbcExtension); +``` + +## Channels + +```typescript +const channel = await queryClient.ibc.channel.channel("transfer", "channel-0"); +const allChannels = await queryClient.ibc.channel.allChannels(); +const connChannels = await queryClient.ibc.channel.allConnectionChannels("connection-0"); +``` + +## Connections + +```typescript +const connection = await queryClient.ibc.connection.connection("connection-0"); +const allConnections = await queryClient.ibc.connection.allConnections(); +``` + +## Clients + +```typescript +const clientState = await queryClient.ibc.client.state("07-tendermint-0"); +const allStates = await queryClient.ibc.client.allStates(); +const allStatesTm = await queryClient.ibc.client.allStatesTm(); +``` + +## Transfer + +```typescript +const denomTrace = await queryClient.ibc.transfer.denomTrace("hash..."); +const allDenomTraces = await queryClient.ibc.transfer.allDenomTraces(); +const transferParams = await queryClient.ibc.transfer.params(); +``` + + +The IBC extension provides `all*` helper methods that automatically paginate through all results internally, so you don't need to handle pagination yourself. + + + + + Manual pagination for IBC queries that don't have `all*` helpers. + + + All available query extensions. + + diff --git a/cosmjs/v0.38.x/guides/query/pagination.mdx b/cosmjs/v0.38.x/guides/query/pagination.mdx new file mode 100644 index 000000000..c1508fc3a --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/pagination.mdx @@ -0,0 +1,105 @@ +--- +title: "Pagination" +description: "Navigate large result sets page by page using CosmJS pagination keys" +--- + +Many Cosmos SDK queries return paginated results. CosmJS query extensions accept an optional `paginationKey` parameter on paginated methods. Responses include a `pagination` field with a `nextKey` for fetching subsequent pages. + +## Manual Page-by-Page + +```typescript +import { QueryClient, setupStakingExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupStakingExtension); + +let paginationKey: Uint8Array | undefined = undefined; + +do { + const response = await queryClient.staking.validators( + "BOND_STATUS_BONDED", + paginationKey, + ); + + for (const validator of response.validators) { + console.info(validator.description?.moniker); + } + + paginationKey = response.pagination?.nextKey; +} while (paginationKey !== undefined && paginationKey.length !== 0); +``` + +## How It Works + + + +Omit `paginationKey` (or pass `undefined`). CosmJS sends an empty `PageRequest` to the chain. + + +The response includes `pagination.nextKey` — a `Uint8Array` cursor pointing to the next page. + + +Pass the `nextKey` into the next call to fetch the following page. + + +When `nextKey` is `undefined` or empty, you've reached the last page. + + + +## Collecting All Results + +A common pattern is to accumulate all pages into a single array: + +```typescript +import { QueryClient, StakingExtension } from "@cosmjs/stargate"; +import { Validator } from "cosmjs-types/cosmos/staking/v1beta1/staking"; + +async function getAllValidators( + queryClient: QueryClient & StakingExtension, +): Promise { + const allValidators: Validator[] = []; + let paginationKey: Uint8Array | undefined = undefined; + + do { + const { validators, pagination } = await queryClient.staking.validators( + "BOND_STATUS_BONDED", + paginationKey, + ); + allValidators.push(...validators); + paginationKey = pagination?.nextKey; + } while (paginationKey !== undefined && paginationKey.length !== 0); + + return allValidators; +} +``` + + +`StargateClient.getBalanceStaked` uses this exact pattern internally to sum all delegations across pages. + + +## Paginated Methods by Module + +| Module | Paginated Methods | +|--------|------------------| +| **Bank** | `totalSupply` | +| **Staking** | `validators`, `delegatorDelegations`, `delegatorUnbondingDelegations`, `delegatorValidators`, `validatorDelegations`, `validatorUnbondingDelegations`, `redelegations` | +| **Gov** | `proposals`, `votes`, `deposits` | +| **Distribution** | `validatorSlashes` | +| **Authz** | `grants`, `granteeGrants`, `granterGrants` | +| **Feegrant** | `allowances` | +| **Slashing** | `signingInfos` | +| **IBC** | `channels`, `connectionChannels`, `packetCommitments`, `packetAcknowledgements`, `states`, `consensusStates`, `connections`, `denomTraces` | + + +The IBC extension provides `all*` convenience methods (e.g., `allChannels()`, `allConnections()`, `allDenomTraces()`) that handle pagination internally and return all results in one call. + + + + + All available query extensions. + + + Example of paginated supply queries. + + diff --git a/cosmjs/v0.38.x/guides/query/querying.mdx b/cosmjs/v0.38.x/guides/query/querying.mdx new file mode 100644 index 000000000..80985da88 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/querying.mdx @@ -0,0 +1,158 @@ +--- +title: "Querying On-Chain Data" +description: "Read blockchain state using high-level client methods and composable QueryClient extensions" +--- + +CosmJS provides two ways to query on-chain data: convenience methods on the high-level clients (`StargateClient`, `CosmWasmClient`) and a low-level `QueryClient` with composable module extensions. Choose the approach that fits your needs — high-level methods for common tasks, extensions for full module coverage. + +## Quick Start + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const balance = await client.getBalance("cosmos1...", "uatom"); +console.info(balance); // { denom: "uatom", amount: "1000000" } + +const account = await client.getAccount("cosmos1..."); +console.info(account); // { address, pubkey, accountNumber, sequence } + +client.disconnect(); +``` + +## High-Level Client Methods + +`StargateClient` bundles the most common queries behind simple methods. These cover bank, staking, auth, and transaction queries out of the box. + +| Method | Returns | Description | +|--------|---------|-------------| +| `getChainId()` | `string` | Chain identifier | +| `getHeight()` | `number` | Latest block height | +| `getBlock(height?)` | `Block` | Block data at the given or latest height | +| `getAccount(address)` | `Account \| null` | Account info (address, pubkey, sequence) | +| `getSequence(address)` | `SequenceResponse` | Account number and sequence | +| `getBalance(address, denom)` | `Coin` | Single-denom balance | +| `getAllBalances(address)` | `Coin[]` | All balances for an address | +| `getBalanceStaked(address)` | `Coin \| null` | Total staked balance across all validators | +| `getDelegation(delegator, validator)` | `Coin \| null` | Delegation to a specific validator | +| `getTx(id)` | `IndexedTx \| null` | Transaction by hash | +| `searchTx(query)` | `IndexedTx[]` | Search transactions by events | + +`CosmWasmClient` extends these with contract-specific queries: + +| Method | Returns | Description | +|--------|---------|-------------| +| `getCodes()` | `Code[]` | All uploaded WASM codes | +| `getCodeDetails(codeId)` | `CodeDetails` | Code metadata and bytecode | +| `getContracts(codeId)` | `string[]` | Contract addresses for a code ID | +| `getContractsByCreator(creator)` | `string[]` | Contracts created by an address | +| `getContract(address)` | `Contract` | Contract metadata | +| `getContractCodeHistory(address)` | `ContractCodeHistoryEntry[]` | Migration history | +| `queryContractRaw(address, key)` | `Uint8Array \| null` | Raw contract state by key | +| `queryContractSmart(address, query)` | `JsonObject` | JSON smart query | + +## Using QueryClient with Extensions + +For queries beyond what the high-level clients expose, build a `QueryClient` with the exact extensions you need. This gives you typed access to every query endpoint in each Cosmos SDK module. + +```typescript +import { + QueryClient, + setupBankExtension, + setupStakingExtension, + setupGovExtension, + setupDistributionExtension, + setupMintExtension, +} from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions( + cometClient, + setupBankExtension, + setupStakingExtension, + setupGovExtension, + setupDistributionExtension, + setupMintExtension, +); +``` + +Extensions are merged into the `QueryClient` instance. Each one adds a namespace — `queryClient.bank`, `queryClient.staking`, `queryClient.gov`, etc. You can compose up to 18 extensions in a single call. + +## Combining Multiple Extensions + +You can compose any combination of extensions to build a query client tailored to your needs: + +```typescript +import { + QueryClient, + setupBankExtension, + setupStakingExtension, + setupGovExtension, + setupDistributionExtension, + setupMintExtension, + setupSlashingExtension, + setupAuthzExtension, + setupFeegrantExtension, + setupIbcExtension, +} from "@cosmjs/stargate"; + +const queryClient = QueryClient.withExtensions( + cometClient, + setupBankExtension, + setupStakingExtension, + setupGovExtension, + setupDistributionExtension, + setupMintExtension, + setupSlashingExtension, + setupAuthzExtension, + setupFeegrantExtension, + setupIbcExtension, +); + +const balance = await queryClient.bank.balance("cosmos1...", "uatom"); +const validators = await queryClient.staking.validators("BOND_STATUS_BONDED"); +const inflation = await queryClient.mint.inflation(); +``` + +Each extension is independently typed — TypeScript knows exactly which namespaces and methods are available based on the setup functions you pass. + + + + Token balances, supply, and denomination metadata. + + + Validators, delegations, unbonding, and staking pool. + + + Proposals, votes, deposits, and tallies. + + + Account info, auth extension, and custom parsers. + + + Staking rewards, commission, inflation, and community pool. + + + Channels, connections, clients, and transfer denominations. + + + Search, decode, and inspect transactions and events. + + + Smart contract state and metadata queries. + + + Navigate large result sets page by page. + + + Block data, chain status, and CometBFT RPC. + + + Write query extensions for custom chain modules. + + + Handle missing data, NotFound errors, and broadcast failures. + + diff --git a/cosmjs/v0.38.x/guides/query/slashing-authz-feegrant.mdx b/cosmjs/v0.38.x/guides/query/slashing-authz-feegrant.mdx new file mode 100644 index 000000000..6cc7ba792 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/slashing-authz-feegrant.mdx @@ -0,0 +1,78 @@ +--- +title: "Slashing, Authz & Fee Grant Queries" +description: "Query validator signing info, authorization grants, and fee allowances" +--- + +These extensions cover validator slashing info, account-to-account authorization grants, and fee allowances. + +## Slashing Queries + +The slashing extension queries validator signing info and slashing parameters. + +```typescript +import { QueryClient, setupSlashingExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupSlashingExtension); + +const signingInfo = await queryClient.slashing.signingInfo("cosmosvalcons1..."); +console.info(signingInfo.valSigningInfo); + +const allSigningInfos = await queryClient.slashing.signingInfos(); +console.info(allSigningInfos.info); + +const params = await queryClient.slashing.params(); +console.info(params.params); +``` + +## Authz Queries + +The authz extension queries authorization grants between accounts. + +```typescript +import { QueryClient, setupAuthzExtension } from "@cosmjs/stargate"; + +const queryClient = QueryClient.withExtensions(cometClient, setupAuthzExtension); + +const grants = await queryClient.authz.grants( + "cosmos1granter...", + "cosmos1grantee...", + "/cosmos.bank.v1beta1.MsgSend", +); +console.info(grants.grants); + +const granteeGrants = await queryClient.authz.granteeGrants("cosmos1grantee..."); +console.info(granteeGrants.grants); + +const granterGrants = await queryClient.authz.granterGrants("cosmos1granter..."); +console.info(granterGrants.grants); +``` + +## Fee Grant Queries + +The feegrant extension queries fee allowances between accounts. + +```typescript +import { QueryClient, setupFeegrantExtension } from "@cosmjs/stargate"; + +const queryClient = QueryClient.withExtensions(cometClient, setupFeegrantExtension); + +const allowance = await queryClient.feegrant.allowance( + "cosmos1granter...", + "cosmos1grantee...", +); +console.info(allowance.allowance); + +const allAllowances = await queryClient.feegrant.allowances("cosmos1grantee..."); +console.info(allAllowances.allowances); +``` + + + + Validators and delegations. + + + All available query extensions. + + diff --git a/cosmjs/v0.38.x/guides/query/staking.mdx b/cosmjs/v0.38.x/guides/query/staking.mdx new file mode 100644 index 000000000..044181f2a --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/staking.mdx @@ -0,0 +1,96 @@ +--- +title: "Staking Queries" +description: "Query validators, delegations, unbonding, redelegations, and staking pool parameters" +--- + +The staking extension queries validators, delegations, unbonding, and redelegations. + +```typescript +import { QueryClient, setupStakingExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupStakingExtension); +``` + +## Validators + +```typescript +const bonded = await queryClient.staking.validators("BOND_STATUS_BONDED"); +console.info(bonded.validators); + +const unbonding = await queryClient.staking.validators("BOND_STATUS_UNBONDING"); +const unbonded = await queryClient.staking.validators("BOND_STATUS_UNBONDED"); + +const singleValidator = await queryClient.staking.validator("cosmosvaloper1..."); +console.info(singleValidator.validator); +``` + +## Delegations + +```typescript +const delegation = await queryClient.staking.delegation( + "cosmos1...", + "cosmosvaloper1...", +); +console.info(delegation.delegationResponse?.balance); + +const allDelegations = await queryClient.staking.delegatorDelegations("cosmos1..."); +console.info(allDelegations.delegationResponses); +``` + +## Unbonding and Redelegations + +```typescript +const unbonding = await queryClient.staking.unbondingDelegation( + "cosmos1...", + "cosmosvaloper1...", +); + +const allUnbonding = await queryClient.staking.delegatorUnbondingDelegations("cosmos1..."); + +const redelegations = await queryClient.staking.redelegations( + "cosmos1...", + "cosmosvaloper1source...", + "cosmosvaloper1dest...", +); +``` + +## Staking Pool and Params + +```typescript +const pool = await queryClient.staking.pool(); +console.info(pool.pool?.bondedTokens); +console.info(pool.pool?.notBondedTokens); + +const params = await queryClient.staking.params(); +console.info(params.params?.unbondingTime); +``` + +## Available Methods + +| Method | Parameters | Paginated | +|--------|-----------|-----------| +| `validators` | `status, paginationKey?` | Yes | +| `validator` | `validatorAddress` | No | +| `delegation` | `delegatorAddress, validatorAddress` | No | +| `delegatorDelegations` | `delegatorAddress, paginationKey?` | Yes | +| `delegatorUnbondingDelegations` | `delegatorAddress, paginationKey?` | Yes | +| `delegatorValidator` | `delegatorAddress, validatorAddress` | No | +| `delegatorValidators` | `delegatorAddress, paginationKey?` | Yes | +| `unbondingDelegation` | `delegatorAddress, validatorAddress` | No | +| `redelegations` | `delegatorAddress, srcValidator, dstValidator, paginationKey?` | Yes | +| `validatorDelegations` | `validatorAddress, paginationKey?` | Yes | +| `validatorUnbondingDelegations` | `validatorAddress, paginationKey?` | Yes | +| `historicalInfo` | `height` | No | +| `pool` | — | No | +| `params` | — | No | + + + + Staking rewards, commission, and inflation. + + + Navigate large result sets page by page. + + diff --git a/cosmjs/v0.38.x/guides/query/transactions.mdx b/cosmjs/v0.38.x/guides/query/transactions.mdx new file mode 100644 index 000000000..1df98e146 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/transactions.mdx @@ -0,0 +1,221 @@ +--- +title: "Transaction Queries" +description: "Search transactions by hash or events, decode raw bytes, parse events, and simulate gas" +--- + +You can look up transactions by hash, search by events, decode raw transaction bytes, and simulate gas usage — all without broadcasting anything on-chain. + +## Lookup by Hash + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const tx = await client.getTx("A1B2C3D4..."); +if (tx) { + console.info(tx.height); + console.info(tx.code); // 0 = success + console.info(tx.events); + console.info(tx.gasUsed); +} +``` + +## Search by Events + +```typescript +const txs = await client.searchTx("message.sender='cosmos1...'"); + +const txs = await client.searchTx([ + { key: "message.sender", value: "cosmos1..." }, + { key: "message.action", value: "/cosmos.bank.v1beta1.MsgSend" }, +]); +``` + +Event queries use Tendermint's query syntax. Multiple conditions are combined with `AND`. + +### Structured Query Syntax + +`searchTx` accepts either a raw query string or a structured `SearchPair[]`. Structured queries are safer — string values are automatically quoted and numeric values are left unquoted (required by Tendermint): + +```typescript +import { SearchPair } from "@cosmjs/stargate"; + +const query: SearchPair[] = [ + { key: "transfer.sender", value: "cosmos1..." }, + { key: "tx.height", value: 12345 }, +]; + +const txs = await client.searchTx(query); +``` + +## Decoding Raw Transaction Bytes + +`IndexedTx.tx` contains the raw transaction bytes. Use `decodeTxRaw` to inspect the messages, memo, fee, and signer info: + +```typescript +import { decodeTxRaw } from "@cosmjs/proto-signing"; + +const result = await client.getTx("A1B2C3D4..."); +if (result) { + const decoded = decodeTxRaw(result.tx); + + console.info(decoded.body.messages); + console.info(decoded.body.memo); + console.info(decoded.authInfo.fee); + console.info(decoded.signatures); +} +``` + +## Working with IndexedTx Fields + +The `IndexedTx` response provides several useful fields beyond the raw bytes: + +```typescript +const result = await client.getTx("A1B2C3D4..."); +if (result) { + console.info(result.height); + console.info(result.txIndex); + console.info(result.code); // 0 = success + console.info(result.gasUsed); // bigint + console.info(result.gasWanted); // bigint + console.info(result.events); // Event[] + console.info(result.msgResponses); // { typeUrl, value }[] (Cosmos SDK 0.46+) +} +``` + + +`rawLog` is deprecated and empty on Cosmos SDK 0.50+. Use `events` instead. + + +## Parsing Transaction Events + +Transaction results include events emitted by Cosmos SDK modules. You can extract specific attributes from these events. + +### From DeliverTxResponse + +After broadcasting, use events directly from the response: + +```typescript +import { assertIsDeliverTxSuccess } from "@cosmjs/stargate"; + +const result = await client.signAndBroadcast(sender, messages, "auto"); +assertIsDeliverTxSuccess(result); + +for (const event of result.events) { + if (event.type === "transfer") { + for (const attr of event.attributes) { + console.info(`${attr.key} = ${attr.value}`); + } + } +} +``` + +### From IndexedTx + +Events from searched transactions follow the same structure: + +```typescript +const tx = await client.getTx("A1B2C3D4..."); +if (tx) { + const transferEvents = tx.events.filter((e) => e.type === "transfer"); + for (const event of transferEvents) { + const recipient = event.attributes.find((a) => a.key === "recipient"); + const amount = event.attributes.find((a) => a.key === "amount"); + console.info(`${recipient?.value} received ${amount?.value}`); + } +} +``` + +### Extracting Contract Addresses (CosmWasm) + +After uploading or instantiating a CosmWasm contract, the contract address is in the events. Use the same filtering pattern to extract it: + +```typescript +const result = await client.signAndBroadcast(sender, [instantiateMsg], "auto"); + +const instantiateEvent = result.events.find((e) => e.type === "instantiate"); +const contractAddress = instantiateEvent?.attributes.find( + (a) => a.key === "_contract_address", +); +console.info(contractAddress?.value); +``` + + +`SigningCosmWasmClient.instantiate` returns the contract address directly in its result, so you typically don't need to parse events manually for instantiation. + + +### Using parseRawLog (Legacy) + +For chains running Cosmos SDK < 0.50, you can parse the `rawLog` field through the `logs` namespace: + +```typescript +import { logs } from "@cosmjs/stargate"; + +const parsed = logs.parseRawLog(result.rawLog); +const attr = logs.findAttribute(parsed, "transfer", "amount"); +``` + + +`rawLog` is empty on Cosmos SDK 0.50+. Prefer working with `events` directly. + + +## Using the Tx Extension + +The tx extension provides a lower-level `getTx` and a `simulate` method for gas estimation: + +```typescript +import { QueryClient, setupTxExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupTxExtension); + +const txResponse = await queryClient.tx.getTx("A1B2C3D4..."); +console.info(txResponse.tx); +console.info(txResponse.txResponse); +``` + +## Gas Simulation + +Signing clients can simulate a transaction against the chain to estimate gas usage before broadcasting. Nothing is committed on-chain. + +```typescript +import { SigningStargateClient, GasPrice, calculateFee } from "@cosmjs/stargate"; + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const messages = [ + { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: { + fromAddress: "cosmos1sender...", + toAddress: "cosmos1recipient...", + amount: [{ denom: "uatom", amount: "1000000" }], + }, + }, +]; + +const gasEstimate = await client.simulate("cosmos1sender...", messages, "memo"); +console.info(gasEstimate); // e.g. 85432 + +const fee = calculateFee(Math.round(gasEstimate * 1.3), GasPrice.fromString("0.025uatom")); +console.info(fee); // { amount: [...], gas: "111062" } +``` + + +When you use `"auto"` as the fee in `signAndBroadcast`, the client calls `simulate` internally and applies a 1.4x multiplier to the result. + + + + + Handle broadcast errors and timeouts. + + + Block data and chain status. + + diff --git a/cosmjs/v0.38.x/guides/transactions/building-messages.mdx b/cosmjs/v0.38.x/guides/transactions/building-messages.mdx new file mode 100644 index 000000000..7b7fbb5ca --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/building-messages.mdx @@ -0,0 +1,63 @@ +--- +title: "Building Messages" +description: "Construct message objects for token transfers, staking, and multi-message transactions" +--- + +Every Cosmos SDK transaction contains one or more **messages** — typed instructions that tell the chain what to do. In CosmJS, messages are represented as `EncodeObject` values: a `typeUrl` string paired with a Protobuf message value. + +## Token Transfer (MsgSend) + +```typescript +import { MsgSend } from "cosmjs-types/cosmos/bank/v1beta1/tx"; +import { coins } from "@cosmjs/proto-signing"; + +const sendMsg = { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: MsgSend.fromPartial({ + fromAddress: senderAddress, + toAddress: "cosmos1recipientaddress...", + amount: coins(1_000_000, "uatom"), + }), +}; +``` + +`MsgSend.fromPartial()` creates a message from a partial object, filling in defaults for missing fields. The `coins` helper builds the `[{ denom, amount }]` array. + +## Staking Delegation + +```typescript +import { MsgDelegate } from "cosmjs-types/cosmos/staking/v1beta1/tx"; + +const delegateMsg = { + typeUrl: "/cosmos.staking.v1beta1.MsgDelegate", + value: MsgDelegate.fromPartial({ + delegatorAddress: senderAddress, + validatorAddress: "cosmosvaloper1...", + amount: { denom: "uatom", amount: "1000000" }, + }), +}; +``` + +## Multiple Messages in One Transaction + +A single transaction can carry multiple messages. They execute atomically — all succeed or all fail: + +```typescript +const messages = [sendMsg, delegateMsg]; +const result = await client.signAndBroadcast(senderAddress, messages, "auto"); +``` + + +For type-safe message construction, use typed encode objects like `MsgSendEncodeObject` from `@cosmjs/stargate`. See [EncodeObject](/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects) for the full list. + + +## Next Steps + + + + Estimate how much gas your messages will consume before broadcasting. + + + Register your own Protobuf message types with the Registry. + + diff --git a/cosmjs/v0.38.x/guides/transactions/confirmation.mdx b/cosmjs/v0.38.x/guides/transactions/confirmation.mdx new file mode 100644 index 000000000..f16f9bbe1 --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/confirmation.mdx @@ -0,0 +1,64 @@ +--- +title: "Waiting for Confirmation" +description: "Configure polling timeouts and handle transactions that take too long to land in a block" +--- + +When you call `signAndBroadcast`, the client handles confirmation automatically: + +1. The signed transaction is submitted via `broadcastTxSync` (CheckTx) +2. The client polls `getTx(txHash)` every 3 seconds (configurable) +3. Once the transaction appears in a block, the `DeliverTxResponse` is returned + +## Configuring Timeouts + +Control how long the client waits and how often it polls: + +```typescript +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { + gasPrice: GasPrice.fromString("0.025uatom"), + broadcastTimeoutMs: 120_000, + broadcastPollIntervalMs: 5_000, + }, +); +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `broadcastTimeoutMs` | `60_000` (60s) | Maximum time to wait for block inclusion | +| `broadcastPollIntervalMs` | `3_000` (3s) | Interval between `getTx` polls | + +## Handling Timeouts + +If the transaction is not included within the timeout, a `TimeoutError` is thrown. The transaction may still succeed — it could be sitting in the mempool: + +```typescript +import { TimeoutError } from "@cosmjs/stargate"; + +try { + const result = await client.signAndBroadcast(senderAddress, [sendMsg], "auto"); +} catch (error) { + if (error instanceof TimeoutError) { + const txHash = error.txId; + const laterResult = await client.getTx(txHash); + } + throw error; +} +``` + + +A `TimeoutError` does **not** mean the transaction failed. The signed bytes were already submitted to the mempool. Always check with `getTx` before resubmitting, or you risk sending the transaction twice. + + +## Next Steps + + + + Handle CheckTx rejections, execution failures, and timeouts. + + + Read transaction events and look up past transactions. + + diff --git a/cosmjs/v0.38.x/guides/transactions/error-handling.mdx b/cosmjs/v0.38.x/guides/transactions/error-handling.mdx new file mode 100644 index 000000000..1779fbcc9 --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/error-handling.mdx @@ -0,0 +1,119 @@ +--- +title: "Error Handling" +description: "Handle CheckTx rejections, execution failures, and broadcast timeouts" +--- + +Transactions can fail at different stages, each with a distinct error type. A robust flow handles all of them. + +## Stage 1: CheckTx Rejection (`BroadcastTxError`) + +The node validates the transaction before adding it to the mempool. Common failures include invalid signatures, insufficient funds for fees, or unregistered message types. These throw a `BroadcastTxError`: + +```typescript +import { BroadcastTxError } from "@cosmjs/stargate"; + +try { + const result = await client.signAndBroadcast(senderAddress, [sendMsg], "auto"); +} catch (error) { + if (error instanceof BroadcastTxError) { + console.error("Rejected at CheckTx:"); + console.error(" Code:", error.code); + console.error(" Codespace:", error.codespace); + console.error(" Log:", error.log); + } +} +``` + +CheckTx rejections mean the transaction never entered a block and no gas was consumed. + +## Stage 2: Execution Failure (non-zero `code`) + +If the transaction passes CheckTx but fails during execution (out of gas, business logic error, etc.), `signAndBroadcast` still returns a `DeliverTxResponse` — but with a non-zero `code`. Gas is consumed up to the point of failure. + +```typescript +import { isDeliverTxFailure, assertIsDeliverTxSuccess } from "@cosmjs/stargate"; + +const result = await client.signAndBroadcast(senderAddress, [sendMsg], "auto"); + +if (isDeliverTxFailure(result)) { + console.error(`Transaction ${result.transactionHash} failed`); + console.error(` Code: ${result.code}`); + console.error(` Raw log: ${result.rawLog}`); +} + +assertIsDeliverTxSuccess(result); +``` + +`assertIsDeliverTxSuccess` throws an error if the transaction failed, making it useful for fail-fast workflows. + +## Stage 3: Timeout (`TimeoutError`) + +If the transaction is not included in a block before the polling timeout expires, a `TimeoutError` is thrown. The transaction may still succeed later: + +```typescript +import { TimeoutError } from "@cosmjs/stargate"; + +try { + const result = await client.signAndBroadcast(senderAddress, [sendMsg], "auto"); +} catch (error) { + if (error instanceof TimeoutError) { + console.warn("Tx submitted but not confirmed yet:", error.txId); + const laterResult = await client.getTx(error.txId); + } + throw error; +} +``` + +## Full Error Handling Pattern + +A robust transaction flow handles all three failure modes: + +```typescript +import { + SigningStargateClient, + GasPrice, + TimeoutError, + BroadcastTxError, + isDeliverTxSuccess, +} from "@cosmjs/stargate"; + +try { + const result = await client.signAndBroadcast(senderAddress, messages, "auto"); + + if (isDeliverTxSuccess(result)) { + console.info("Success:", result.transactionHash); + console.info("Gas used:", result.gasUsed.toString()); + } else { + console.error( + `Execution failed (code ${result.code}): ${result.rawLog}`, + ); + } +} catch (error) { + if (error instanceof BroadcastTxError) { + console.error(`CheckTx rejected (code ${error.code}): ${error.log}`); + } else if (error instanceof TimeoutError) { + console.warn("Tx submitted but not confirmed yet:", error.txId); + } else { + throw error; + } +} +``` + +## Error Summary + +| Stage | Error Type | Gas Charged? | Retryable? | +|-------|-----------|-------------|------------| +| CheckTx | `BroadcastTxError` | No | Rarely — fix the issue first | +| Block inclusion | `TimeoutError` | Unknown | Query `getTx` later — it may still land | +| Execution (DeliverTx) | `DeliverTxResponse` with `code !== 0` | Yes (up to failure point) | Depends on the error | + +## Next Steps + + + + Detailed reference for all CosmJS error classes. + + + Read transaction events and look up past transactions. + + diff --git a/cosmjs/v0.38.x/guides/transactions/events-and-lookups.mdx b/cosmjs/v0.38.x/guides/transactions/events-and-lookups.mdx new file mode 100644 index 000000000..3c60b7b9c --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/events-and-lookups.mdx @@ -0,0 +1,77 @@ +--- +title: "Events & Lookups" +description: "Read transaction events and look up past transactions by hash or event query" +--- + +After a transaction lands in a block, you can inspect the events it emitted and retrieve it later by hash or search criteria. + +## Reading Transaction Events + +Successful transactions emit **events** that describe what happened on-chain. You can inspect these from the `DeliverTxResponse`: + +```typescript +import { coins } from "@cosmjs/proto-signing"; + +const result = await client.sendTokens( + senderAddress, + "cosmos1recipientaddress...", + coins(1_000_000, "uatom"), + "auto", +); + +for (const event of result.events) { + if (event.type === "transfer") { + for (const attr of event.attributes) { + console.info(`${attr.key}: ${attr.value}`); + } + } +} +``` + +A `MsgSend` transaction typically emits `transfer`, `coin_spent`, `coin_received`, and `message` events. + +## Looking Up by Hash + +After broadcasting, you can retrieve a transaction by its hash: + +```typescript +const tx = await client.getTx(result.transactionHash); +if (tx) { + console.info("Included in block:", tx.height); + console.info("Code:", tx.code); +} +``` + +This is especially useful after a `TimeoutError` or when using `signAndBroadcastSync`, where you need to check the outcome later. + +## Searching by Events + +Search for transactions matching specific event criteria: + +```typescript +const txs = await client.searchTx(`transfer.recipient='cosmos1recipientaddress...'`); +for (const tx of txs) { + console.info(tx.hash, "at height", tx.height); +} +``` + +The query string uses CometBFT's event query syntax. Common patterns: + +| Query | Description | +|-------|-------------| +| `tx.hash='ABC123...'` | Find a specific transaction | +| `transfer.recipient='cosmos1...'` | Transfers received by an address | +| `message.sender='cosmos1...'` | Transactions sent by an address | +| `message.action='/cosmos.bank.v1beta1.MsgSend'` | All MsgSend transactions | +| `tx.height=12345` | Transactions at a specific block height | + +## Next Steps + + + + Decode raw transaction bytes and search with advanced filters. + + + Upload, instantiate, and execute smart contracts. + + diff --git a/cosmjs/v0.38.x/guides/transactions/send-transactions.mdx b/cosmjs/v0.38.x/guides/transactions/send-transactions.mdx new file mode 100644 index 000000000..606351654 --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/send-transactions.mdx @@ -0,0 +1,122 @@ +--- +title: "Send Transactions" +description: "Build messages, estimate gas, sign, broadcast, and handle the full transaction lifecycle with CosmJS" +--- + +Sending a transaction on a Cosmos SDK chain is a multi-step process: you build one or more messages, estimate gas, sign the transaction, broadcast it to a node, and then wait for block inclusion. This guide walks through each step using `SigningStargateClient`. + +## Prerequisites + +- **Node.js** v22 or later +- `@cosmjs/stargate` and `@cosmjs/proto-signing` installed +- An RPC endpoint for the target chain + + +```bash npm +npm install @cosmjs/stargate @cosmjs/proto-signing cosmjs-types +``` +```bash yarn +yarn add @cosmjs/stargate @cosmjs/proto-signing cosmjs-types +``` +```bash pnpm +pnpm add @cosmjs/stargate @cosmjs/proto-signing cosmjs-types +``` + + +## Set Up a Signing Client + +Create a wallet and connect a signing client. This example uses a mnemonic-based wallet for simplicity — see [Local Wallets](/cosmjs/v0.38.x/concepts/account/local-wallets) and [Injected Wallets](/cosmjs/v0.38.x/concepts/account/injected-wallets) for production options. + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic( + "your mnemonic words here ...", + { prefix: "cosmos" }, +); +const [{ address: senderAddress }] = await wallet.getAccounts(); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); +``` + + +Never hard-code mnemonics in source files. Use environment variables or a secrets manager. + + +Setting `gasPrice` in the client options enables `"auto"` fee estimation for all transactions. Without it, you must pass an explicit `StdFee` to every transaction method. + +## Transaction Lifecycle + +Every transaction follows these steps: + +1. **Build messages** — describe what the transaction should do +2. **Estimate gas** — simulate execution to determine fees +3. **Sign** — produce a cryptographic signature over the transaction bytes +4. **Broadcast** — send the signed transaction to a node +5. **Confirm** — wait for the transaction to be included in a block + +The simplest path combines all steps in a single call: + +```typescript +const result = await client.sendTokens( + senderAddress, + "cosmos1recipientaddress...", + [{ denom: "uatom", amount: "1000000" }], + "auto", +); + +console.info("Tx hash:", result.transactionHash); +``` + +The following pages break down each step in detail. + +## Convenience Methods + +`SigningStargateClient` provides high-level methods for the most common transactions. They construct the message internally and call `signAndBroadcast`: + +```typescript +const result = await client.sendTokens( + senderAddress, + "cosmos1recipientaddress...", + [{ denom: "uatom", amount: "1000000" }], + "auto", + "thanks for lunch", +); +``` + +| Method | Description | +|--------|-------------| +| `sendTokens(sender, recipient, amount, fee, memo?)` | Transfer tokens (`MsgSend`) | +| `delegateTokens(delegator, validator, amount, fee, memo?)` | Delegate to a validator (`MsgDelegate`) | +| `undelegateTokens(delegator, validator, amount, fee, memo?)` | Undelegate from a validator (`MsgUndelegate`) | +| `withdrawRewards(delegator, validator, fee, memo?)` | Withdraw staking rewards (`MsgWithdrawDelegatorReward`) | + +These convenience methods accept the same three fee forms — `"auto"`, a number multiplier, or an explicit `StdFee`. + +## Next Steps + + + + Construct message objects for token transfers, staking, and multi-message transactions. + + + Estimate gas with auto fees, manual simulation, or explicit fee objects. + + + Sign and broadcast transactions, or separate the two steps for advanced workflows. + + + Configure polling timeouts and handle transactions that take too long. + + + Handle CheckTx rejections, execution failures, and timeouts. + + + Read transaction events and look up past transactions by hash or query. + + diff --git a/cosmjs/v0.38.x/guides/transactions/signing-broadcasting.mdx b/cosmjs/v0.38.x/guides/transactions/signing-broadcasting.mdx new file mode 100644 index 000000000..1493e8e54 --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/signing-broadcasting.mdx @@ -0,0 +1,87 @@ +--- +title: "Signing & Broadcasting" +description: "Sign and broadcast transactions, or separate the two steps for advanced workflows" +--- + +Once you have your messages and fee, `SigningStargateClient` handles signing and broadcasting. There are three approaches depending on how much control you need. + +## `signAndBroadcast` — The Standard Flow + +Signs the transaction, broadcasts it, and polls until it is included in a block: + +```typescript +const result = await client.signAndBroadcast( + senderAddress, + [sendMsg], + "auto", + "payment for services", +); +``` + +The returned `DeliverTxResponse` contains everything about the executed transaction: + +| Field | Type | Description | +|-------|------|-------------| +| `transactionHash` | `string` | Hex-encoded transaction hash | +| `code` | `number` | `0` on success, non-zero on failure | +| `height` | `number` | Block height where the tx was included | +| `txIndex` | `number` | 0-based index of the transaction within the block | +| `gasUsed` | `bigint` | Actual gas consumed | +| `gasWanted` | `bigint` | Gas limit from the fee | +| `events` | `readonly Event[]` | Transaction events emitted during execution | +| `rawLog` | `string \| undefined` | Raw log string (often contains error details on failure) | +| `msgResponses` | `Array<{ typeUrl: string; value: Uint8Array }>` | Protobuf-encoded response for each message | + +## `signAndBroadcastSync` — Fire and Forget + +Signs and broadcasts but returns immediately with the transaction hash, without waiting for block inclusion: + +```typescript +const txHash = await client.signAndBroadcastSync( + senderAddress, + [sendMsg], + "auto", + "payment for services", +); +``` + +Use this when you want to submit a transaction and check the result later (e.g. via `client.getTx(txHash)`). + +## Separate Sign and Broadcast + +For advanced workflows (offline signing, multi-sig, or inspecting the signed bytes before broadcasting), separate the two steps: + +```typescript +import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; +import { calculateFee } from "@cosmjs/stargate"; + +const fee = calculateFee(200_000, "0.025uatom"); +const txRaw = await client.sign(senderAddress, [sendMsg], fee, "memo"); + +const txBytes = TxRaw.encode(txRaw).finish(); +const result = await client.broadcastTx(txBytes); +``` + +The `sign` method accepts an optional `explicitSignerData` parameter for offline signing, where account number, sequence, and chain ID must be provided manually: + +```typescript +const txRaw = await client.sign(senderAddress, [sendMsg], fee, "memo", { + accountNumber: 42, + sequence: 7, + chainId: "cosmoshub-4", +}); +``` + +## Next Steps + + + + Configure polling timeouts and handle transactions that take too long. + + + Offline signing, IBC transfers, and inspecting signed transactions. + + + Create wallets from mnemonics, or integrate browser extensions like Keplr. + + diff --git a/cosmjs/v0.38.x/guides/transactions/simulating-gas.mdx b/cosmjs/v0.38.x/guides/transactions/simulating-gas.mdx new file mode 100644 index 000000000..1dab5e04f --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/simulating-gas.mdx @@ -0,0 +1,67 @@ +--- +title: "Simulating Gas" +description: "Estimate gas consumption with auto fees, manual simulation, or explicit fee objects" +--- + +Before broadcasting, you can simulate the transaction to estimate how much gas it will consume. This prevents out-of-gas failures. + +## Automatic Simulation with `"auto"` + +The simplest approach — pass `"auto"` as the fee and the client simulates internally: + +```typescript +const result = await client.signAndBroadcast(senderAddress, [sendMsg], "auto"); +``` + +Behind the scenes, the client: + +1. Sends the transaction to the chain's `Simulate` endpoint (without actually executing it) +2. Receives the estimated `gasUsed` +3. Multiplies by a safety buffer (default 1.4x) to get the gas limit +4. Calculates the fee from the gas limit and the configured `gasPrice` + +You can override the multiplier by passing a number instead of `"auto"`: + +```typescript +const result = await client.signAndBroadcast(senderAddress, [sendMsg], 1.6); +``` + +## Manual Simulation + +For more control, call `simulate` directly and build the fee yourself: + +```typescript +import { calculateFee, GasPrice } from "@cosmjs/stargate"; + +const gasEstimate = await client.simulate(senderAddress, [sendMsg], "optional memo"); +const gasLimit = Math.ceil(gasEstimate * 1.5); +const fee = calculateFee(gasLimit, GasPrice.fromString("0.025uatom")); + +const result = await client.signAndBroadcast(senderAddress, [sendMsg], fee, "optional memo"); +``` + +## Explicit Fee (No Simulation) + +When you know the gas cost ahead of time, skip simulation entirely by passing a `StdFee`: + +```typescript +import { calculateFee } from "@cosmjs/stargate"; + +const fee = calculateFee(200_000, "0.025uatom"); +const result = await client.signAndBroadcast(senderAddress, [sendMsg], fee); +``` + + +Simulation is an estimate. If chain state changes between simulation and broadcast (e.g. many concurrent transactions), actual gas may differ. The safety multiplier accounts for this, but high-contention scenarios may need a larger buffer (1.5–2.0x). + + +## Next Steps + + + + Understand gas pricing, fee calculation, and dynamic fee markets in depth. + + + Sign and send your transaction to the chain. + + diff --git a/cosmjs/v0.38.x/quick-start.mdx b/cosmjs/v0.38.x/quick-start.mdx index 9885ac91a..ada89f208 100644 --- a/cosmjs/v0.38.x/quick-start.mdx +++ b/cosmjs/v0.38.x/quick-start.mdx @@ -9,7 +9,7 @@ This guide walks you through installing CosmJS, connecting to a Cosmos SDK chain - **Node.js** v22 or later - **npm**, **yarn**, or **pnpm** -- A Cosmos SDK chain RPC endpoint (e.g. `https://rpc.cosmos.network` for the Cosmos Hub) +- A Cosmos SDK chain RPC endpoint (e.g. `https://rpc.my-chain.network` for the Cosmos Hub) diff --git a/docs.json b/docs.json index cd06e5fb2..acbd7e690 100644 --- a/docs.json +++ b/docs.json @@ -7105,6 +7105,97 @@ ] } ] + }, + { + "group": "Guides", + "pages": [ + { + "group": "Connect", + "pages": [ + "cosmjs/v0.38.x/guides/connect/connect", + "cosmjs/v0.38.x/guides/connect/http", + "cosmjs/v0.38.x/guides/connect/websocket", + "cosmjs/v0.38.x/guides/connect/timeouts", + "cosmjs/v0.38.x/guides/connect/custom-endpoints", + "cosmjs/v0.38.x/guides/connect/version-detection", + "cosmjs/v0.38.x/guides/connect/errors" + ] + }, + { + "group": "Transactions", + "pages": [ + "cosmjs/v0.38.x/guides/transactions/send-transactions", + "cosmjs/v0.38.x/guides/transactions/building-messages", + "cosmjs/v0.38.x/guides/transactions/simulating-gas", + "cosmjs/v0.38.x/guides/transactions/signing-broadcasting", + "cosmjs/v0.38.x/guides/transactions/confirmation", + "cosmjs/v0.38.x/guides/transactions/error-handling", + "cosmjs/v0.38.x/guides/transactions/events-and-lookups" + ] + }, + { + "group": "CosmWasm", + "pages": [ + "cosmjs/v0.38.x/guides/cosmwasm/cosmwasm", + "cosmjs/v0.38.x/guides/cosmwasm/querying", + "cosmjs/v0.38.x/guides/cosmwasm/uploading", + "cosmjs/v0.38.x/guides/cosmwasm/instantiating", + "cosmjs/v0.38.x/guides/cosmwasm/executing", + "cosmjs/v0.38.x/guides/cosmwasm/administration", + "cosmjs/v0.38.x/guides/cosmwasm/gas-and-advanced" + ] + }, + { + "group": "Querying", + "pages": [ + "cosmjs/v0.38.x/guides/query/querying", + "cosmjs/v0.38.x/guides/query/bank", + "cosmjs/v0.38.x/guides/query/staking", + "cosmjs/v0.38.x/guides/query/governance", + "cosmjs/v0.38.x/guides/query/accounts", + "cosmjs/v0.38.x/guides/query/distribution-and-mint", + "cosmjs/v0.38.x/guides/query/slashing-authz-feegrant", + "cosmjs/v0.38.x/guides/query/ibc", + "cosmjs/v0.38.x/guides/query/transactions", + "cosmjs/v0.38.x/guides/query/cosmwasm", + "cosmjs/v0.38.x/guides/query/pagination", + "cosmjs/v0.38.x/guides/query/blocks-and-chain-info", + "cosmjs/v0.38.x/guides/query/custom-extensions", + "cosmjs/v0.38.x/guides/query/error-handling" + ] + }, + { + "group": "Extending", + "pages": [ + "cosmjs/v0.38.x/guides/extending/extending", + "cosmjs/v0.38.x/guides/extending/custom-types", + "cosmjs/v0.38.x/guides/extending/query-extensions", + "cosmjs/v0.38.x/guides/extending/amino-converters", + "cosmjs/v0.38.x/guides/extending/custom-modules", + "cosmjs/v0.38.x/guides/extending/new-chains", + "cosmjs/v0.38.x/guides/extending/code-generation" + ] + } + ] + }, + { + "group": "API Reference", + "pages": [ + "cosmjs/v0.38.x/api-reference/stargate", + "cosmjs/v0.38.x/api-reference/cosmwasm", + "cosmjs/v0.38.x/api-reference/proto-signing", + "cosmjs/v0.38.x/api-reference/amino", + "cosmjs/v0.38.x/api-reference/crypto", + "cosmjs/v0.38.x/api-reference/encoding", + "cosmjs/v0.38.x/api-reference/math", + "cosmjs/v0.38.x/api-reference/tendermint-rpc", + "cosmjs/v0.38.x/api-reference/socket", + "cosmjs/v0.38.x/api-reference/stream", + "cosmjs/v0.38.x/api-reference/json-rpc", + "cosmjs/v0.38.x/api-reference/utils", + "cosmjs/v0.38.x/api-reference/faucet-client", + "cosmjs/v0.38.x/api-reference/ledger-amino" + ] } ] } From 292910da153672fb1b1e844b548696409b256fad Mon Sep 17 00:00:00 2001 From: Nur Fikri Date: Fri, 13 Mar 2026 13:11:46 +0700 Subject: [PATCH 09/17] feat (documentation): refine descriptions for clients and methods, clarify gas estimation processes, and enhance error handling examples. Improve overall structure and add next steps sections for better navigation. --- cosmjs/v0.38.x/api-reference/cosmwasm.mdx | 2 +- cosmjs/v0.38.x/api-reference/faucet-client.mdx | 2 +- cosmjs/v0.38.x/api-reference/ledger-amino.mdx | 17 ++++++++++------- cosmjs/v0.38.x/api-reference/math.mdx | 18 +++++++++++------- cosmjs/v0.38.x/api-reference/proto-signing.mdx | 2 +- .../v0.38.x/api-reference/tendermint-rpc.mdx | 4 ++-- cosmjs/v0.38.x/concepts/account/account.mdx | 11 +++++++++++ .../v0.38.x/concepts/account/local-wallets.mdx | 4 ++++ .../concepts/clients/read-only-clients.mdx | 17 ++++++++++++++--- .../concepts/clients/signing-clients.mdx | 13 ++++++++++++- .../concepts/cosmos-evm/full-example.mdx | 2 +- .../concepts/cosmos-evm/key-differences.mdx | 11 +++++++++++ .../v0.38.x/concepts/errors/error-handling.mdx | 12 ++++++++++++ cosmjs/v0.38.x/concepts/errors/transport.mdx | 4 ++-- .../v0.38.x/concepts/fees-gas/gas-and-fees.mdx | 11 +++++++++++ .../v0.38.x/concepts/fees-gas/simulation.mdx | 4 ++-- .../concepts/messages-encoding/registry.mdx | 11 +++++++++++ .../v0.38.x/concepts/transactions/advanced.mdx | 3 ++- .../concepts/transactions/custom-messages.mdx | 5 +++-- .../concepts/transactions/sign-broadcast.mdx | 11 +++++++++++ cosmjs/v0.38.x/concepts/transports/http.mdx | 2 +- .../v0.38.x/concepts/transports/rpc-client.mdx | 4 ++-- .../v0.38.x/concepts/transports/websocket.mdx | 4 ++-- cosmjs/v0.38.x/guides/connect/connect.mdx | 9 +++++++-- .../guides/connect/custom-endpoints.mdx | 4 ++-- cosmjs/v0.38.x/guides/connect/http.mdx | 4 ++-- .../guides/connect/version-detection.mdx | 2 +- cosmjs/v0.38.x/guides/connect/websocket.mdx | 2 +- cosmjs/v0.38.x/guides/extending/new-chains.mdx | 2 ++ cosmjs/v0.38.x/guides/query/accounts.mdx | 5 ++++- cosmjs/v0.38.x/guides/query/bank.mdx | 2 ++ .../guides/query/blocks-and-chain-info.mdx | 2 ++ cosmjs/v0.38.x/guides/query/cosmwasm.mdx | 2 ++ .../v0.38.x/guides/query/custom-extensions.mdx | 4 +++- .../guides/query/distribution-and-mint.mdx | 2 ++ cosmjs/v0.38.x/guides/query/error-handling.mdx | 2 ++ cosmjs/v0.38.x/guides/query/governance.mdx | 2 ++ cosmjs/v0.38.x/guides/query/ibc.mdx | 2 ++ cosmjs/v0.38.x/guides/query/pagination.mdx | 2 ++ cosmjs/v0.38.x/guides/query/querying.mdx | 7 +++++++ .../guides/query/slashing-authz-feegrant.mdx | 2 ++ cosmjs/v0.38.x/guides/query/staking.mdx | 2 ++ cosmjs/v0.38.x/guides/query/transactions.mdx | 2 ++ cosmjs/v0.38.x/overview.mdx | 4 ++-- cosmjs/v0.38.x/quick-start.mdx | 6 ++---- 45 files changed, 193 insertions(+), 52 deletions(-) diff --git a/cosmjs/v0.38.x/api-reference/cosmwasm.mdx b/cosmjs/v0.38.x/api-reference/cosmwasm.mdx index 0d43df7ac..3d5899a96 100644 --- a/cosmjs/v0.38.x/api-reference/cosmwasm.mdx +++ b/cosmjs/v0.38.x/api-reference/cosmwasm.mdx @@ -15,7 +15,7 @@ npm install @cosmjs/cosmwasm ## CosmWasmClient -Read-only client for querying blockchain state and smart contracts. Extends `StargateClient` functionality with contract-specific methods. +Read-only client for querying blockchain state and smart contracts. Provides common query methods plus contract-specific operations. ### Static Methods diff --git a/cosmjs/v0.38.x/api-reference/faucet-client.mdx b/cosmjs/v0.38.x/api-reference/faucet-client.mdx index 45f600c5a..c740c8ed2 100644 --- a/cosmjs/v0.38.x/api-reference/faucet-client.mdx +++ b/cosmjs/v0.38.x/api-reference/faucet-client.mdx @@ -14,7 +14,7 @@ npm install @cosmjs/faucet-client | Method | Parameters | Returns | |--------|------------|---------| | `constructor` | `baseUrl: string` | `FaucetClient` | -| `credit` | `address: string`, `denom?: string` | `Promise` | +| `credit` | `address: string`, `denom: string` | `Promise` | ### Usage diff --git a/cosmjs/v0.38.x/api-reference/ledger-amino.mdx b/cosmjs/v0.38.x/api-reference/ledger-amino.mdx index 8492c600e..79eb6fc08 100644 --- a/cosmjs/v0.38.x/api-reference/ledger-amino.mdx +++ b/cosmjs/v0.38.x/api-reference/ledger-amino.mdx @@ -19,17 +19,19 @@ Implements `OfflineAminoSigner` using a Ledger hardware wallet. | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `transport: Transport`, `options?: LedgerSignerOptions` | `LedgerSigner` | +| `constructor` | `transport: Transport`, `options?: LedgerConnectorOptions` | `LedgerSigner` | | `getAccounts` | — | `Promise` | | `signAmino` | `signerAddress: string`, `signDoc: StdSignDoc` | `Promise` | ### Options ```typescript -interface LedgerSignerOptions { +interface LedgerConnectorOptions { readonly hdPaths?: readonly HdPath[]; readonly prefix?: string; + readonly testModeAllowed?: boolean; readonly ledgerAppName?: string; + readonly minLedgerAppVersion?: string; } ``` @@ -69,16 +71,17 @@ Low-level interface for direct communication with the Cosmos Ledger app. | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `transport: Transport`, `options?: { ledgerAppName?: string }` | `LedgerConnector` | -| `getPublicKey` | `hdPath: HdPath` | `Promise` | -| `getPubkeyAndAddress` | `hdPath: HdPath`, `prefix: string` | `Promise` | -| `sign` | `message: Uint8Array`, `hdPath: HdPath` | `Promise` | +| `constructor` | `transport: Transport`, `options?: LedgerConnectorOptions` | `LedgerConnector` | +| `getPubkey` | `hdPath?: HdPath` | `Promise` | +| `getCosmosAddress` | `pubkey?: Uint8Array` | `Promise` | +| `sign` | `message: Uint8Array`, `hdPath?: HdPath` | `Promise` | +| `showAddress` | `hdPath?: HdPath` | `Promise` | ### Types ```typescript interface AddressAndPubkey { - readonly pubkey: Uint8Array; readonly address: string; + readonly pubkey: Secp256k1Pubkey; } ``` diff --git a/cosmjs/v0.38.x/api-reference/math.mdx b/cosmjs/v0.38.x/api-reference/math.mdx index 6f9fc6846..1c274d200 100644 --- a/cosmjs/v0.38.x/api-reference/math.mdx +++ b/cosmjs/v0.38.x/api-reference/math.mdx @@ -69,11 +69,10 @@ Arbitrary-precision decimal type for safe financial calculations. Internally sto | Method | Parameters | Returns | |--------|------------|---------| -| `fromAtomics` | `atomics: string`, `fractionalDigits: number` | `Decimal` | +| `fromAtomics` | `atomics: string \| bigint`, `fractionalDigits: number` | `Decimal` | | `fromUserInput` | `input: string`, `fractionalDigits: number` | `Decimal` | | `zero` | `fractionalDigits: number` | `Decimal` | | `one` | `fractionalDigits: number` | `Decimal` | -| `fromPlanck` | `planckValue: string`, `fractionalDigits: number` | `Decimal` | ### Instance Methods @@ -81,7 +80,12 @@ Arbitrary-precision decimal type for safe financial calculations. Internally sto |--------|------------|---------| | `plus` | `other: Decimal` | `Decimal` | | `minus` | `other: Decimal` | `Decimal` | -| `multiply` | `other: Decimal` | `Decimal` | +| `multiply` | `b: Uint32 \| Uint53 \| Uint64` | `Decimal` | +| `floor` | — | `Decimal` | +| `ceil` | — | `Decimal` | +| `neg` | — | `Decimal` | +| `isNegative` | — | `boolean` | +| `adjustFractionalDigits` | `newFractionalDigits: number` | `Decimal` | | `equals` | `other: Decimal` | `boolean` | | `isLessThan` | `other: Decimal` | `boolean` | | `isLessThanOrEqual` | `other: Decimal` | `boolean` | @@ -100,7 +104,7 @@ Arbitrary-precision decimal type for safe financial calculations. Internally sto ### Usage ```typescript -import { Decimal } from "@cosmjs/math"; +import { Decimal, Uint32 } from "@cosmjs/math"; const amount = Decimal.fromAtomics("1000000", 6); amount.toString(); // "1" @@ -111,7 +115,7 @@ const total = amount.plus(fee); total.toString(); // "1.005" total.atomics; // "1005000" -const price = Decimal.fromUserInput("12.5", 6); -const cost = amount.multiply(price); -cost.toString(); // "12.5" +const quantity = new Uint32(3); +const cost = amount.multiply(quantity); +cost.toString(); // "3" ``` diff --git a/cosmjs/v0.38.x/api-reference/proto-signing.mdx b/cosmjs/v0.38.x/api-reference/proto-signing.mdx index a61e067ed..cc6183184 100644 --- a/cosmjs/v0.38.x/api-reference/proto-signing.mdx +++ b/cosmjs/v0.38.x/api-reference/proto-signing.mdx @@ -182,7 +182,7 @@ interface DecodedTxRaw { | Function | Parameters | Returns | |----------|------------|---------| -| `makeAuthInfoBytes` | `signers: readonly SignerData[]`, `feeAmount: readonly Coin[]`, `gasLimit: number`, `feeGranter?: string`, `feePayer?: string`, `signMode?: SignMode` | `Uint8Array` | +| `makeAuthInfoBytes` | `signers: ReadonlyArray<{ pubkey: Any; sequence: bigint \| number }>`, `feeAmount: readonly Coin[]`, `gasLimit: number`, `feeGranter?: string`, `feePayer?: string`, `signMode?: SignMode` | `Uint8Array` | | `makeSignDoc` | `bodyBytes: Uint8Array`, `authInfoBytes: Uint8Array`, `chainId: string`, `accountNumber: number` | `SignDoc` | | `makeSignBytes` | `signDoc: SignDoc` | `Uint8Array` | | `decodeTxRaw` | `tx: Uint8Array` | `DecodedTxRaw` | diff --git a/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx b/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx index 0b4603300..a1069724d 100644 --- a/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx +++ b/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx @@ -166,7 +166,7 @@ enum BlockIdFlag { | Function | Parameters | Returns | |----------|------------|---------| -| `pubkeyToAddress` | `type: string`, `data: Uint8Array` | `Uint8Array` | -| `pubkeyToRawAddress` | `type: string`, `data: Uint8Array` | `Uint8Array` | +| `pubkeyToAddress` | `type: "ed25519" \| "secp256k1"`, `data: Uint8Array` | `string` | +| `pubkeyToRawAddress` | `type: "ed25519" \| "secp256k1"`, `data: Uint8Array` | `Uint8Array` | | `rawSecp256k1PubkeyToRawAddress` | `pubkeyRaw: Uint8Array` | `Uint8Array` | | `rawEd25519PubkeyToRawAddress` | `pubkeyRaw: Uint8Array` | `Uint8Array` | diff --git a/cosmjs/v0.38.x/concepts/account/account.mdx b/cosmjs/v0.38.x/concepts/account/account.mdx index e92656766..7bcafd406 100644 --- a/cosmjs/v0.38.x/concepts/account/account.mdx +++ b/cosmjs/v0.38.x/concepts/account/account.mdx @@ -52,3 +52,14 @@ interface AccountData { This is the wallet telling you "I hold the private key for this address and can sign with this algorithm." It does not include on-chain state like sequence or account number — that comes from querying the chain. + +## Next Steps + + + + Create and manage HD wallets from mnemonic phrases. + + + Implement the OfflineSigner interface for custom signing. + + diff --git a/cosmjs/v0.38.x/concepts/account/local-wallets.mdx b/cosmjs/v0.38.x/concepts/account/local-wallets.mdx index 7ae3e0c0e..3a7594502 100644 --- a/cosmjs/v0.38.x/concepts/account/local-wallets.mdx +++ b/cosmjs/v0.38.x/concepts/account/local-wallets.mdx @@ -83,6 +83,10 @@ const accounts = await wallet.getAccounts(); ## Encrypted Serialization + + The `serialize()` and `deserialize()` methods are deprecated and will be removed in a future version of CosmJS. If you rely on this feature, comment at [cosmos/cosmjs#1796](https://github.com/cosmos/cosmjs/issues/1796). + + Wallets can be serialized to an encrypted JSON string for storage: ```typescript diff --git a/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx b/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx index da6557eab..69faa8a16 100644 --- a/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx +++ b/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx @@ -49,7 +49,7 @@ const client = await StargateClient.connect("https://rpc.my-chain.network"); | `getBalanceStaked(address)` | `Coin \| null` | Total staked balance | | `getDelegation(delegator, validator)` | `Coin \| null` | Delegation to a specific validator | | `getTx(hash)` | `IndexedTx \| null` | Transaction by hash | -| `searchTx(query)` | `readonly IndexedTx[]` | Search transactions by events | +| `searchTx(query)` | `IndexedTx[]` | Search transactions by events | ```typescript const balance = await client.getBalance("cosmos1...", "uatom"); @@ -67,8 +67,8 @@ interface StargateClientOptions { ## CosmWasmClient -The read-only client for CosmWasm-enabled chains. Provides the same core query -methods as `StargateClient` plus smart contract queries. +The read-only client for CosmWasm-enabled chains. Provides common query methods +(`getBalance`, `getAccount`, `getBlock`, `getTx`, `searchTx`) plus smart contract queries. ```typescript import { CosmWasmClient } from "@cosmjs/cosmwasm"; @@ -145,3 +145,14 @@ const rewards = await queryClient.distribution.delegationTotalRewards("cosmos1.. | `setupFeegrantExtension` | `feegrant` | Fee allowances | | `setupTxExtension` | `tx` | Transaction lookup, simulation | | `setupWasmExtension` | `wasm` | Smart contract queries (from `@cosmjs/cosmwasm`) | + +## Next Steps + + + + Build and broadcast transactions with a signing client. + + + Explore query methods and extensions in depth. + + diff --git a/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx index 474122d6f..dc93eb1e2 100644 --- a/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx +++ b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx @@ -119,7 +119,7 @@ const client = await SigningCosmWasmClient.connectWithSigner( | Method | Description | |--------|-------------| -| `upload(sender, wasmCode, fee, memo?)` | Upload wasm bytecode | +| `upload(sender, wasmCode, fee, memo?, instantiatePermission?)` | Upload wasm bytecode | | `instantiate(sender, codeId, msg, label, fee, options?)` | Instantiate a contract | | `instantiate2(sender, codeId, salt, msg, label, fee, options?)` | Instantiate with predictable address | | `execute(sender, contract, msg, fee, memo?, funds?)` | Execute a contract message | @@ -150,3 +150,14 @@ const execResult = await client.execute( "auto", ); ``` + +## Next Steps + + + + Step-by-step guide to sending transactions. + + + Understand gas limits and fee calculation. + + diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx index 874fcd9cb..75790dac1 100644 --- a/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx @@ -7,7 +7,7 @@ This end-to-end example creates an EVM-compatible wallet, connects to a Cosmos E ```typescript import { DirectEthSecp256k1HdWallet } from "@cosmjs/proto-signing"; -import { SigningStargateClient, GasPrice, calculateFee } from "@cosmjs/stargate"; +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; const mnemonic = "copper push brief egg scan entry inform record adjust fossil boss egg " + diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx index ef42f145e..4faee8fa5 100644 --- a/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx @@ -38,3 +38,14 @@ This means: | Gas (send) | ~100,000 | ~120,000 | | Denom decimals | Typically 6 | Typically 18 | | Amino signing | Supported | Not supported (Direct signing only) | + +## Next Steps + + + + Use DirectEthSecp256k1HdWallet for EVM chains. + + + See a complete EVM-compatible chain integration. + + diff --git a/cosmjs/v0.38.x/concepts/errors/error-handling.mdx b/cosmjs/v0.38.x/concepts/errors/error-handling.mdx index f014b7c4d..caf3acd37 100644 --- a/cosmjs/v0.38.x/concepts/errors/error-handling.mdx +++ b/cosmjs/v0.38.x/concepts/errors/error-handling.mdx @@ -13,6 +13,7 @@ import { TimeoutError, BroadcastTxError, isDeliverTxSuccess, + Coin, } from "@cosmjs/stargate"; async function sendTokens( @@ -62,3 +63,14 @@ async function sendTokens( | DeliverTx | `DeliverTxResponse` | Depends | `code`, `rawLog`, `events` | | Query | `Error` | Depends | Error message | | Simulation | `Error` | Fix input | Error message | + +## Next Steps + + + + Explore CosmJS error types and their properties. + + + Handle CheckTx failures and execution errors. + + diff --git a/cosmjs/v0.38.x/concepts/errors/transport.mdx b/cosmjs/v0.38.x/concepts/errors/transport.mdx index 45b226869..56b73d8ed 100644 --- a/cosmjs/v0.38.x/concepts/errors/transport.mdx +++ b/cosmjs/v0.38.x/concepts/errors/transport.mdx @@ -15,7 +15,7 @@ The `cause` property carries the status code and response body: ```typescript try { - const client = await StargateClient.connect("https://rpc.example.com"); + const client = await StargateClient.connect("https://rpc.my-chain.network"); } catch (error) { // "Bad status on response: 429" const { status, body } = (error as Error).cause as { status: number; body: string }; @@ -39,7 +39,7 @@ When an HTTP client is configured with a timeout, requests that exceed it throw ```typescript import { HttpClient } from "@cosmjs/tendermint-rpc"; -const httpClient = new HttpClient("https://rpc.example.com", 10_000); // 10s timeout +const httpClient = new HttpClient("https://rpc.my-chain.network", 10_000); // 10s timeout ``` **Invalid URL** diff --git a/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx b/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx index e92244345..0400cab62 100644 --- a/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx +++ b/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx @@ -172,3 +172,14 @@ simulation-based approach adapts to the actual cost of your transaction. | Fee-sensitive application | Simulate first, apply a conservative multiplier (1.5–2.0x) | | Offline or air-gapped signing | Calculate fees manually with `calculateFee` | | Sponsored transactions | Use fee grants with the `granter` field | + +## Next Steps + + + + Simulate transactions to estimate gas. + + + Use fee market pricing for chains like Osmosis. + + diff --git a/cosmjs/v0.38.x/concepts/fees-gas/simulation.mdx b/cosmjs/v0.38.x/concepts/fees-gas/simulation.mdx index 7d8db1f0f..164414395 100644 --- a/cosmjs/v0.38.x/concepts/fees-gas/simulation.mdx +++ b/cosmjs/v0.38.x/concepts/fees-gas/simulation.mdx @@ -32,8 +32,8 @@ When you pass `"auto"` or a number, the client calls `simulate` internally: 1. The transaction is built with an empty signature and sent to the chain's `Simulate` endpoint 2. The chain executes it in a read-only context and returns `gasUsed` -3. The client multiplies by the gas multiplier (default 1.4x for static prices, - or the value you passed) +3. The client multiplies by the gas multiplier (default 1.4x, or the value you + passed) 4. `calculateFee` converts the gas limit to a `StdFee` using the configured gas price diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx index 4b9097883..64a2b6908 100644 --- a/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx +++ b/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx @@ -111,3 +111,14 @@ When you call `signAndBroadcast`, this is what happens to your messages: v SignDoc.encode().finish() signBytes (Uint8Array) --> SHA-256 --> signature ``` + +## Next Steps + + + + Register custom protobuf types for your chain. + + + Understand the EncodeObject format. + + diff --git a/cosmjs/v0.38.x/concepts/transactions/advanced.mdx b/cosmjs/v0.38.x/concepts/transactions/advanced.mdx index 03c2f1db4..508970266 100644 --- a/cosmjs/v0.38.x/concepts/transactions/advanced.mdx +++ b/cosmjs/v0.38.x/concepts/transactions/advanced.mdx @@ -79,6 +79,7 @@ const result = await client.signAndBroadcast(address, messages, "auto"); if (isDeliverTxSuccess(result)) { console.info("Success:", result.transactionHash); } else if (isDeliverTxFailure(result)) { - console.error("Failed with code", result.code, ":", result.rawLog); + const errorLog = result.events.map((e) => `${e.type}: ${JSON.stringify(e.attributes)}`).join("\n"); + console.error("Failed with code", result.code, ":", errorLog); } ``` diff --git a/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx b/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx index 10572ba29..31b14a216 100644 --- a/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx +++ b/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx @@ -10,7 +10,7 @@ has custom modules with their own message types, you need to register them. ```typescript import { Registry } from "@cosmjs/proto-signing"; -import { defaultRegistryTypes, SigningStargateClient } from "@cosmjs/stargate"; +import { defaultRegistryTypes, SigningStargateClient, GasPrice } from "@cosmjs/stargate"; import { MsgCreatePost } from "./generated/blog/tx"; const registry = new Registry(defaultRegistryTypes); @@ -40,10 +40,11 @@ If your custom messages also need Amino signing (e.g. for Ledger support), you need to register Amino converters alongside the Protobuf registry: ```typescript -import { AminoTypes } from "@cosmjs/stargate"; import { + AminoTypes, createDefaultAminoConverters, SigningStargateClient, + GasPrice, } from "@cosmjs/stargate"; import { Registry } from "@cosmjs/proto-signing"; diff --git a/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx b/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx index 7aab6b1f7..183274861 100644 --- a/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx +++ b/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx @@ -105,3 +105,14 @@ const result = await client.sendTokens( "optional memo", ); ``` + +## Next Steps + + + + Construct messages for your transactions. + + + Handle transaction failures and retries. + + diff --git a/cosmjs/v0.38.x/concepts/transports/http.mdx b/cosmjs/v0.38.x/concepts/transports/http.mdx index 9c9a3a679..0ed1b584b 100644 --- a/cosmjs/v0.38.x/concepts/transports/http.mdx +++ b/cosmjs/v0.38.x/concepts/transports/http.mdx @@ -125,7 +125,7 @@ const batchClient = new HttpBatchClient("https://rpc.my-chain.network", { dispatchInterval: 50, }); -const cometClient = await Comet38Client.create(batchClient); +const cometClient = Comet38Client.create(batchClient); ``` diff --git a/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx b/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx index 345c3fee2..8048b0646 100644 --- a/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx +++ b/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx @@ -72,7 +72,7 @@ import { Comet38Client, HttpClient } from "@cosmjs/tendermint-rpc"; // HTTP with 15-second timeout const rpcClient = new HttpClient("https://rpc.my-chain.network", 15_000); -const cometClient = await Comet38Client.create(rpcClient); +const cometClient = Comet38Client.create(rpcClient); const client = StargateClient.create(cometClient); ``` @@ -86,7 +86,7 @@ const rpcClient = new HttpBatchClient("https://rpc.my-chain.network", { dispatchInterval: 50, httpTimeout: 15_000, }); -const cometClient = await Comet38Client.create(rpcClient); +const cometClient = Comet38Client.create(rpcClient); const client = StargateClient.create(cometClient); ``` diff --git a/cosmjs/v0.38.x/concepts/transports/websocket.mdx b/cosmjs/v0.38.x/concepts/transports/websocket.mdx index 39e2d76e8..e3b20ac16 100644 --- a/cosmjs/v0.38.x/concepts/transports/websocket.mdx +++ b/cosmjs/v0.38.x/concepts/transports/websocket.mdx @@ -28,7 +28,7 @@ replacement for `HttpClient` when you need a persistent connection: import { Comet38Client, WebsocketClient } from "@cosmjs/tendermint-rpc"; const wsClient = new WebsocketClient("wss://rpc.my-chain.network"); -const cometClient = await Comet38Client.create(wsClient); +const cometClient = Comet38Client.create(wsClient); ``` ## Subscriptions @@ -58,7 +58,7 @@ The CometBFT client classes provide typed subscription helpers: import { Comet38Client, WebsocketClient } from "@cosmjs/tendermint-rpc"; const wsClient = new WebsocketClient("wss://rpc.my-chain.network"); -const cometClient = await Comet38Client.create(wsClient); +const cometClient = Comet38Client.create(wsClient); const newBlocks = cometClient.subscribeNewBlock(); const subscription = newBlocks.subscribe({ diff --git a/cosmjs/v0.38.x/guides/connect/connect.mdx b/cosmjs/v0.38.x/guides/connect/connect.mdx index af6fa1733..37c1e43c2 100644 --- a/cosmjs/v0.38.x/guides/connect/connect.mdx +++ b/cosmjs/v0.38.x/guides/connect/connect.mdx @@ -5,6 +5,11 @@ description: "Establish a connection to any Cosmos SDK chain using CosmJS client CosmJS clients communicate with Cosmos SDK chains through [CometBFT RPC](https://docs.cometbft.com/v1/spec/rpc/) over HTTP or WebSocket. Pass an RPC URL to any client's `connect` factory method to get started. +## Prerequisites + +- `@cosmjs/stargate` installed (`npm install @cosmjs/stargate`) +- An RPC endpoint for a Cosmos SDK chain (e.g. `https://rpc.cosmos.network`) + ## Quick Start ```typescript @@ -30,8 +35,8 @@ The transport is selected automatically based on the endpoint you provide: | `"https://..."` or `"http://..."` | HTTP | No | | `"wss://..."` or `"ws://..."` | WebSocket | Yes | | `HttpEndpoint` object | HTTP (always) | No | -| `HttpBatchClient` instance | Batched HTTP | No | -| `WebsocketClient` instance | WebSocket | Yes | + +When using `HttpBatchClient` or `WebsocketClient` instances directly, create a CometBFT client manually with `Comet38Client.create(rpcClient)` instead of passing them to `connect()`. ## Disconnecting diff --git a/cosmjs/v0.38.x/guides/connect/custom-endpoints.mdx b/cosmjs/v0.38.x/guides/connect/custom-endpoints.mdx index ae6b8877d..4cbf2fcff 100644 --- a/cosmjs/v0.38.x/guides/connect/custom-endpoints.mdx +++ b/cosmjs/v0.38.x/guides/connect/custom-endpoints.mdx @@ -46,7 +46,7 @@ const rpcClient = new HttpBatchClient(endpoint, { httpTimeout: 15_000, }); -const cometClient = await Comet38Client.create(rpcClient); +const cometClient = Comet38Client.create(rpcClient); const client = StargateClient.create(cometClient); ``` @@ -85,7 +85,7 @@ const rpcClient = new HttpBatchClient(endpoint, { httpTimeout: 15_000, }); -const cometClient = await Comet38Client.create(rpcClient); +const cometClient = Comet38Client.create(rpcClient); const client = SigningStargateClient.createWithSigner(cometClient, wallet, { gasPrice: GasPrice.fromString("0.025uatom"), diff --git a/cosmjs/v0.38.x/guides/connect/http.mdx b/cosmjs/v0.38.x/guides/connect/http.mdx index 87e58b0a6..1ea744ad3 100644 --- a/cosmjs/v0.38.x/guides/connect/http.mdx +++ b/cosmjs/v0.38.x/guides/connect/http.mdx @@ -27,7 +27,7 @@ import { StargateClient } from "@cosmjs/stargate"; import { Comet38Client, HttpClient } from "@cosmjs/tendermint-rpc"; const rpcClient = new HttpClient("https://rpc.my-chain.network"); -const cometClient = await Comet38Client.create(rpcClient); +const cometClient = Comet38Client.create(rpcClient); const client = StargateClient.create(cometClient); ``` @@ -48,7 +48,7 @@ const rpcClient = new HttpBatchClient("https://rpc.my-chain.network", { dispatchInterval: 50, }); -const cometClient = await Comet38Client.create(rpcClient); +const cometClient = Comet38Client.create(rpcClient); const client = StargateClient.create(cometClient); ``` diff --git a/cosmjs/v0.38.x/guides/connect/version-detection.mdx b/cosmjs/v0.38.x/guides/connect/version-detection.mdx index 01dac696b..cb3ee2e35 100644 --- a/cosmjs/v0.38.x/guides/connect/version-detection.mdx +++ b/cosmjs/v0.38.x/guides/connect/version-detection.mdx @@ -30,7 +30,7 @@ import { StargateClient } from "@cosmjs/stargate"; import { Comet1Client, HttpClient } from "@cosmjs/tendermint-rpc"; const rpcClient = new HttpClient("https://rpc.my-chain.network"); -const cometClient = await Comet1Client.create(rpcClient); +const cometClient = Comet1Client.create(rpcClient); const client = StargateClient.create(cometClient); ``` diff --git a/cosmjs/v0.38.x/guides/connect/websocket.mdx b/cosmjs/v0.38.x/guides/connect/websocket.mdx index dd674e18c..99b767d8c 100644 --- a/cosmjs/v0.38.x/guides/connect/websocket.mdx +++ b/cosmjs/v0.38.x/guides/connect/websocket.mdx @@ -23,7 +23,7 @@ WebSocket connections can subscribe to new blocks and transactions: import { Comet38Client, WebsocketClient } from "@cosmjs/tendermint-rpc"; const wsClient = new WebsocketClient("wss://rpc.my-chain.network"); -const cometClient = await Comet38Client.create(wsClient); +const cometClient = Comet38Client.create(wsClient); const newBlocks = cometClient.subscribeNewBlock(); const subscription = newBlocks.subscribe({ diff --git a/cosmjs/v0.38.x/guides/extending/new-chains.mdx b/cosmjs/v0.38.x/guides/extending/new-chains.mdx index 481c8826b..eeb16db52 100644 --- a/cosmjs/v0.38.x/guides/extending/new-chains.mdx +++ b/cosmjs/v0.38.x/guides/extending/new-chains.mdx @@ -82,6 +82,7 @@ Many popular chains have pre-built TypeScript libraries generated with Telescope Some chains use non-standard account types (e.g. `EthAccount` on EVM-compatible chains). The default `accountFromAny` parser won't recognize them, causing account lookups to fail. Pass a custom `accountParser` to handle these: ```typescript +import { decodePubkey } from "@cosmjs/proto-signing"; import { accountFromAny, AccountParser } from "@cosmjs/stargate"; import { EthAccount } from "./generated/ethermint/types/v1/account"; import { Any } from "cosmjs-types/google/protobuf/any"; @@ -116,6 +117,7 @@ Different chains may use different [BIP-44](https://github.com/bitcoin/bips/blob ```typescript import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { stringToPath } from "@cosmjs/crypto"; const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { prefix: "evmos", diff --git a/cosmjs/v0.38.x/guides/query/accounts.mdx b/cosmjs/v0.38.x/guides/query/accounts.mdx index e9e7a1d89..36931aae1 100644 --- a/cosmjs/v0.38.x/guides/query/accounts.mdx +++ b/cosmjs/v0.38.x/guides/query/accounts.mdx @@ -60,7 +60,8 @@ The auth extension returns the raw protobuf `Any` type. `StargateClient` parses Chains with non-standard account types require a custom `AccountParser`: ```typescript -import { StargateClient, accountFromAny } from "@cosmjs/stargate"; +import { StargateClient, Account, accountFromAny } from "@cosmjs/stargate"; +import { Any } from "cosmjs-types/google/protobuf/any"; function myAccountParser(any: Any): Account { if (any.typeUrl === "/my.chain.CustomAccount") { @@ -84,6 +85,8 @@ const client = await StargateClient.connect("https://rpc.my-chain.network", { Fall back to `accountFromAny` for standard types so your parser stays forward-compatible with Cosmos SDK updates. +## Next Steps + Token balances and supply. diff --git a/cosmjs/v0.38.x/guides/query/bank.mdx b/cosmjs/v0.38.x/guides/query/bank.mdx index a4684db7a..48cb8e140 100644 --- a/cosmjs/v0.38.x/guides/query/bank.mdx +++ b/cosmjs/v0.38.x/guides/query/bank.mdx @@ -46,6 +46,8 @@ if (firstPage.pagination?.nextKey?.length) { `totalSupply` is the only paginated method in the bank module. See [Pagination](/cosmjs/v0.38.x/guides/query/pagination) for the general pattern. +## Next Steps + Validators, delegations, and staking pool. diff --git a/cosmjs/v0.38.x/guides/query/blocks-and-chain-info.mdx b/cosmjs/v0.38.x/guides/query/blocks-and-chain-info.mdx index 1e6701182..9e3e29135 100644 --- a/cosmjs/v0.38.x/guides/query/blocks-and-chain-info.mdx +++ b/cosmjs/v0.38.x/guides/query/blocks-and-chain-info.mdx @@ -86,6 +86,8 @@ const queryClient = QueryClient.withExtensions(cometClient, setupBankExtension); The built-in extensions do not expose height parameters directly. For historical queries, use the lower-level `queryAbci` method or construct an RPC client that targets a specific height. This is primarily useful for building block explorers or auditing state changes. +## Next Steps + Search and decode transactions. diff --git a/cosmjs/v0.38.x/guides/query/cosmwasm.mdx b/cosmjs/v0.38.x/guides/query/cosmwasm.mdx index 2fe77ef5e..bb5ad8200 100644 --- a/cosmjs/v0.38.x/guides/query/cosmwasm.mdx +++ b/cosmjs/v0.38.x/guides/query/cosmwasm.mdx @@ -45,6 +45,8 @@ const history = await queryClient.wasm.getContractCodeHistory("osmo1contractaddr const allState = await queryClient.wasm.getAllContractState("osmo1contractaddr..."); ``` +## Next Steps + All available query methods and extensions. diff --git a/cosmjs/v0.38.x/guides/query/custom-extensions.mdx b/cosmjs/v0.38.x/guides/query/custom-extensions.mdx index 118ba2217..74f88b394 100644 --- a/cosmjs/v0.38.x/guides/query/custom-extensions.mdx +++ b/cosmjs/v0.38.x/guides/query/custom-extensions.mdx @@ -48,7 +48,7 @@ const queryClient = QueryClient.withExtensions( setupMyModuleExtension, ); -const result = await queryClient.mymodule.myQuery("foo"); +const result = await queryClient.mymodule.myQuery("cosmos1senderaddress..."); ``` ## Without Protobuf Definitions @@ -68,6 +68,8 @@ const response = await queryClient.queryAbci( ); ``` +## Next Steps + All built-in query extensions. diff --git a/cosmjs/v0.38.x/guides/query/distribution-and-mint.mdx b/cosmjs/v0.38.x/guides/query/distribution-and-mint.mdx index ea85801bb..00ae9fb91 100644 --- a/cosmjs/v0.38.x/guides/query/distribution-and-mint.mdx +++ b/cosmjs/v0.38.x/guides/query/distribution-and-mint.mdx @@ -68,6 +68,8 @@ console.info(params.inflationMin.toString()); console.info(params.inflationMax.toString()); ``` +## Next Steps + Validators and delegations tied to these rewards. diff --git a/cosmjs/v0.38.x/guides/query/error-handling.mdx b/cosmjs/v0.38.x/guides/query/error-handling.mdx index 262781203..3065fdb81 100644 --- a/cosmjs/v0.38.x/guides/query/error-handling.mdx +++ b/cosmjs/v0.38.x/guides/query/error-handling.mdx @@ -69,6 +69,8 @@ try { } ``` +## Next Steps + Search and decode transactions. diff --git a/cosmjs/v0.38.x/guides/query/governance.mdx b/cosmjs/v0.38.x/guides/query/governance.mdx index a03473149..c5045bcba 100644 --- a/cosmjs/v0.38.x/guides/query/governance.mdx +++ b/cosmjs/v0.38.x/guides/query/governance.mdx @@ -73,6 +73,8 @@ const tallyParams = await queryClient.gov.params("tallying"); | `tally` | `proposalId` | No | | `params` | `parametersType` | No | +## Next Steps + Validators and delegations. diff --git a/cosmjs/v0.38.x/guides/query/ibc.mdx b/cosmjs/v0.38.x/guides/query/ibc.mdx index 8c29eb8b9..65090af48 100644 --- a/cosmjs/v0.38.x/guides/query/ibc.mdx +++ b/cosmjs/v0.38.x/guides/query/ibc.mdx @@ -48,6 +48,8 @@ const transferParams = await queryClient.ibc.transfer.params(); The IBC extension provides `all*` helper methods that automatically paginate through all results internally, so you don't need to handle pagination yourself. +## Next Steps + Manual pagination for IBC queries that don't have `all*` helpers. diff --git a/cosmjs/v0.38.x/guides/query/pagination.mdx b/cosmjs/v0.38.x/guides/query/pagination.mdx index c1508fc3a..3b04d77b1 100644 --- a/cosmjs/v0.38.x/guides/query/pagination.mdx +++ b/cosmjs/v0.38.x/guides/query/pagination.mdx @@ -95,6 +95,8 @@ async function getAllValidators( The IBC extension provides `all*` convenience methods (e.g., `allChannels()`, `allConnections()`, `allDenomTraces()`) that handle pagination internally and return all results in one call. +## Next Steps + All available query extensions. diff --git a/cosmjs/v0.38.x/guides/query/querying.mdx b/cosmjs/v0.38.x/guides/query/querying.mdx index 80985da88..f051264e1 100644 --- a/cosmjs/v0.38.x/guides/query/querying.mdx +++ b/cosmjs/v0.38.x/guides/query/querying.mdx @@ -5,6 +5,11 @@ description: "Read blockchain state using high-level client methods and composab CosmJS provides two ways to query on-chain data: convenience methods on the high-level clients (`StargateClient`, `CosmWasmClient`) and a low-level `QueryClient` with composable module extensions. Choose the approach that fits your needs — high-level methods for common tasks, extensions for full module coverage. +## Prerequisites + +- `@cosmjs/stargate` installed (`npm install @cosmjs/stargate`) +- A connected client (see [Connect to a Chain](/cosmjs/v0.38.x/guides/connect/connect)) + ## Quick Start ```typescript @@ -118,6 +123,8 @@ const inflation = await queryClient.mint.inflation(); Each extension is independently typed — TypeScript knows exactly which namespaces and methods are available based on the setup functions you pass. +## Next Steps + Token balances, supply, and denomination metadata. diff --git a/cosmjs/v0.38.x/guides/query/slashing-authz-feegrant.mdx b/cosmjs/v0.38.x/guides/query/slashing-authz-feegrant.mdx index 6cc7ba792..2de3dfd7d 100644 --- a/cosmjs/v0.38.x/guides/query/slashing-authz-feegrant.mdx +++ b/cosmjs/v0.38.x/guides/query/slashing-authz-feegrant.mdx @@ -68,6 +68,8 @@ const allAllowances = await queryClient.feegrant.allowances("cosmos1grantee...") console.info(allAllowances.allowances); ``` +## Next Steps + Validators and delegations. diff --git a/cosmjs/v0.38.x/guides/query/staking.mdx b/cosmjs/v0.38.x/guides/query/staking.mdx index 044181f2a..110fc3ddc 100644 --- a/cosmjs/v0.38.x/guides/query/staking.mdx +++ b/cosmjs/v0.38.x/guides/query/staking.mdx @@ -86,6 +86,8 @@ console.info(params.params?.unbondingTime); | `pool` | — | No | | `params` | — | No | +## Next Steps + Staking rewards, commission, and inflation. diff --git a/cosmjs/v0.38.x/guides/query/transactions.mdx b/cosmjs/v0.38.x/guides/query/transactions.mdx index 1df98e146..54109b145 100644 --- a/cosmjs/v0.38.x/guides/query/transactions.mdx +++ b/cosmjs/v0.38.x/guides/query/transactions.mdx @@ -211,6 +211,8 @@ console.info(fee); // { amount: [...], gas: "111062" } When you use `"auto"` as the fee in `signAndBroadcast`, the client calls `simulate` internally and applies a 1.4x multiplier to the result. +## Next Steps + Handle broadcast errors and timeouts. diff --git a/cosmjs/v0.38.x/overview.mdx b/cosmjs/v0.38.x/overview.mdx index 90278f75d..e1a78cca5 100644 --- a/cosmjs/v0.38.x/overview.mdx +++ b/cosmjs/v0.38.x/overview.mdx @@ -13,7 +13,7 @@ CosmJS is published as a set of scoped npm packages. Use the ones that match you | --- | --- | | `@cosmjs/stargate` | High-level client for querying and broadcasting on Cosmos SDK 0.40+ chains | | `@cosmjs/proto-signing` | Wallet primitives and Protobuf-based transaction signing | -| `@cosmjs/cosmwasm` | Client extensions for CosmWasm-enabled chains | +| `@cosmjs/cosmwasm` | Client for CosmWasm-enabled chains | | `@cosmjs/amino` | Amino signing support for legacy compatibility | | `@cosmjs/tendermint-rpc` | Low-level Tendermint/CometBFT RPC client | | `@cosmjs/encoding` | Encoding utilities (hex, base64, bech32, UTF-8) | @@ -22,7 +22,7 @@ CosmJS is published as a set of scoped npm packages. Use the ones that match you ## Key Features -- **Query chain state** — balances, accounts, staking, governance, and arbitrary module queries via gRPC or RPC +- **Query chain state** — balances, accounts, staking, governance, and arbitrary module queries via Tendermint/CometBFT RPC - **Sign transactions** — Protobuf (`SIGN_MODE_DIRECT`) and Amino (`SIGN_MODE_LEGACY_AMINO_JSON`) signing - **Broadcast transactions** — submit signed transactions and monitor results - **Wallet support** — generate wallets from mnemonics or integrate browser extensions like [Keplr](https://keplr.app) and [Leap](https://leapwallet.io) diff --git a/cosmjs/v0.38.x/quick-start.mdx b/cosmjs/v0.38.x/quick-start.mdx index ada89f208..cf80d6de0 100644 --- a/cosmjs/v0.38.x/quick-start.mdx +++ b/cosmjs/v0.38.x/quick-start.mdx @@ -90,8 +90,6 @@ Never hard-code or commit mnemonics. Use environment variables or a secrets mana ```typescript -import { SigningStargateClient } from "@cosmjs/stargate"; - const chainId = "cosmoshub-4"; await window.keplr.enable(chainId); const offlineSigner = window.keplr.getOfflineSigner(chainId); @@ -128,7 +126,7 @@ console.log("Gas used:", result.gasUsed); ``` -Setting gas to `"auto"` lets CosmJS simulate the transaction and estimate gas automatically. You can also pass an explicit fee object for fine-grained control. +Setting fee to `"auto"` lets CosmJS simulate the transaction and estimate gas automatically. You can also pass an explicit `StdFee` object for fine-grained control. @@ -155,7 +153,7 @@ console.log("Tx hash:", result.transactionHash); -## Next steps +## Next Steps From f35d4ea7edb2bb7011da6fce8e272b0004a959cf Mon Sep 17 00:00:00 2001 From: Nur Fikri Date: Fri, 13 Mar 2026 13:25:08 +0700 Subject: [PATCH 10/17] feat (documentation): enhance CosmJS v0.38.x overview and quick start sections with additional resources; update crypto and encoding API references for clarity and accuracy; improve gas and fees documentation for better understanding. --- cosmjs/v0.38.x/api-reference/crypto.mdx | 18 +++++++++++------- cosmjs/v0.38.x/api-reference/encoding.mdx | 6 +++--- cosmjs/v0.38.x/api-reference/stargate.mdx | 2 +- .../v0.38.x/concepts/fees-gas/gas-and-fees.mdx | 4 ++-- cosmjs/v0.38.x/overview.mdx | 13 +++++++++++-- cosmjs/v0.38.x/quick-start.mdx | 14 ++++++++++---- 6 files changed, 38 insertions(+), 19 deletions(-) diff --git a/cosmjs/v0.38.x/api-reference/crypto.mdx b/cosmjs/v0.38.x/api-reference/crypto.mdx index e3167985d..630889dbd 100644 --- a/cosmjs/v0.38.x/api-reference/crypto.mdx +++ b/cosmjs/v0.38.x/api-reference/crypto.mdx @@ -46,7 +46,7 @@ const incrementalHash = hasher.digest(); | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `hashFunction: HashFunction`, `key: Uint8Array` | `Hmac` | +| `constructor` | `hashFunctionConstructor: new () => HashFunction`, `key: Uint8Array` | `Hmac` | | `update` | `data: Uint8Array` | `Hmac` | | `digest` | — | `Uint8Array` | @@ -64,9 +64,9 @@ Elliptic curve operations for Cosmos, Bitcoin, and Ethereum signing. | Method | Parameters | Returns | |--------|------------|---------| -| `makeKeypair` (static) | `privkey: Uint8Array` | `Promise` | -| `createSignature` (static) | `messageHash: Uint8Array`, `privkey: Uint8Array` | `Promise` | -| `verifySignature` (static) | `signature: Secp256k1Signature`, `messageHash: Uint8Array`, `pubkey: Uint8Array` | `Promise` | +| `makeKeypair` (static) | `privkey: Uint8Array` | `Secp256k1Keypair` | +| `createSignature` (static) | `messageHash: Uint8Array`, `privkey: Uint8Array` | `ExtendedSecp256k1Signature` | +| `verifySignature` (static) | `signature: Secp256k1Signature`, `messageHash: Uint8Array`, `pubkey: Uint8Array` | `boolean` | | `compressPubkey` (static) | `pubkey: Uint8Array` | `Uint8Array` | | `uncompressPubkey` (static) | `pubkey: Uint8Array` | `Uint8Array` | | `trimRecoveryByte` (static) | `signature: Uint8Array` | `Uint8Array` | @@ -83,10 +83,10 @@ interface Secp256k1Keypair { ```typescript import { Secp256k1, sha256 } from "@cosmjs/crypto"; -const keypair = await Secp256k1.makeKeypair(privkey); +const keypair = Secp256k1.makeKeypair(privkey); const hash = sha256(message); -const signature = await Secp256k1.createSignature(hash, keypair.privkey); -const valid = await Secp256k1.verifySignature(signature, hash, keypair.pubkey); +const signature = Secp256k1.createSignature(hash, keypair.privkey); +const valid = Secp256k1.verifySignature(signature, hash, keypair.pubkey); ``` ## Secp256k1Signature / ExtendedSecp256k1Signature @@ -206,6 +206,10 @@ The constant `xchacha20NonceLength` is `24`. ### Argon2id + +`Argon2id` is deprecated and will be removed in a future release. Use `argon2id` from `@noble/hashes` directly instead. See [cosmos/cosmjs#1796](https://github.com/cosmos/cosmjs/issues/1796). + + Password-based key derivation. | Method | Parameters | Returns | diff --git a/cosmjs/v0.38.x/api-reference/encoding.mdx b/cosmjs/v0.38.x/api-reference/encoding.mdx index 37b385bf4..b1c2f2483 100644 --- a/cosmjs/v0.38.x/api-reference/encoding.mdx +++ b/cosmjs/v0.38.x/api-reference/encoding.mdx @@ -79,7 +79,7 @@ Throws if the input contains non-ASCII characters (code points above 127). | Function | Parameters | Returns | |----------|------------|---------| -| `toRfc3339` | `date: Date` | `string` | +| `toRfc3339` | `date: Date \| ReadonlyDate` | `string` | | `fromRfc3339` | `str: string` | `Date` | ```typescript @@ -93,6 +93,6 @@ const date = fromRfc3339("2024-01-15T10:30:00.000Z"); | Function | Parameters | Returns | |----------|------------|---------| -| `fixUint8Array` | `data: ArrayLike` | `Uint8Array` | +| `fixUint8Array` | `source: Uint8Array` | `Uint8Array` | -Ensures a value is a proper `Uint8Array` instance, which is necessary in some cross-environment scenarios. +Ensures a value is a proper `Uint8Array` instance with a direct `ArrayBuffer` backing, which is necessary in some cross-environment scenarios (e.g. when `Uint8Array` subclass instances from protobuf libraries need normalization). diff --git a/cosmjs/v0.38.x/api-reference/stargate.mdx b/cosmjs/v0.38.x/api-reference/stargate.mdx index b1b3b4e16..5febdc6e5 100644 --- a/cosmjs/v0.38.x/api-reference/stargate.mdx +++ b/cosmjs/v0.38.x/api-reference/stargate.mdx @@ -304,7 +304,7 @@ interface SequenceResponse { | `coins` | `amount: number \| string`, `denom: string` | `Coin[]` | | `parseCoins` | `input: string` | `Coin[]` | | `makeCosmoshubPath` | `account: number` | `HdPath` | -| `createPagination` | `paginationKey?: Uint8Array` | `PageRequest \| undefined` | +| `createPagination` | `paginationKey?: Uint8Array` | `PageRequest` | | `createProtobufRpcClient` | `base: QueryClient` | `ProtobufRpcClient` | | `decodeCosmosSdkDecFromProto` | `input: string \| Uint8Array` | `Decimal` | diff --git a/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx b/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx index 0400cab62..bbae52696 100644 --- a/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx +++ b/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx @@ -73,8 +73,8 @@ const gasPrice = new GasPrice(Decimal.fromUserInput("0.025", 18), "uatom"); ``` `GasPrice.fromString` parses a `` string and validates the denom -against Cosmos SDK rules (3–128 characters, alphanumeric with `/`, `:`, `.`, -`_`, `-` allowed). +against Cosmos SDK rules (3–128 characters, must start with a letter, followed +by alphanumeric characters or `/`, `:`, `.`, `_`, `-`). ## Three Ways to Specify Fees diff --git a/cosmjs/v0.38.x/overview.mdx b/cosmjs/v0.38.x/overview.mdx index e1a78cca5..562809e39 100644 --- a/cosmjs/v0.38.x/overview.mdx +++ b/cosmjs/v0.38.x/overview.mdx @@ -31,10 +31,19 @@ CosmJS is published as a set of scoped npm packages. Use the ones that match you ## Getting Started - - + + Install CosmJS, connect to a node, query state, and send your first transaction. + + Understand read-only and signing clients. + + + Query balances, accounts, staking, governance, and more. + + + Send tokens and broadcast arbitrary messages. + ## Further Resources diff --git a/cosmjs/v0.38.x/quick-start.mdx b/cosmjs/v0.38.x/quick-start.mdx index cf80d6de0..c9f63e986 100644 --- a/cosmjs/v0.38.x/quick-start.mdx +++ b/cosmjs/v0.38.x/quick-start.mdx @@ -156,10 +156,16 @@ console.log("Tx hash:", result.transactionHash); ## Next Steps - - Browse the full API documentation for all CosmJS packages. + + Understand read-only and signing client architecture. - - Source code, examples, and issue tracker. + + Query balances, staking, governance, and custom modules. + + + Configure gas pricing, simulation, and fee calculation. + + + Deploy, instantiate, and execute smart contracts. From 8027a94aba998dc115d6a19cc0c7aea517a21566 Mon Sep 17 00:00:00 2001 From: evanorti <87997759+evanorti@users.noreply.github.com> Date: Thu, 23 Apr 2026 08:27:25 -0400 Subject: [PATCH 11/17] ok, you need to review every line of the cosmjs documentation in docs/co --- CLAUDE.md | 18 +++ changes.md | 136 ++++++++++++++++++ cosmjs/v0.38.x/api-reference/amino.mdx | 9 +- cosmjs/v0.38.x/api-reference/crypto.mdx | 33 +++-- cosmjs/v0.38.x/api-reference/encoding.mdx | 2 +- .../v0.38.x/api-reference/faucet-client.mdx | 2 +- cosmjs/v0.38.x/api-reference/json-rpc.mdx | 9 +- .../v0.38.x/api-reference/proto-signing.mdx | 1 + cosmjs/v0.38.x/api-reference/socket.mdx | 29 ++-- cosmjs/v0.38.x/api-reference/stargate.mdx | 3 + cosmjs/v0.38.x/api-reference/stream.mdx | 3 +- .../v0.38.x/api-reference/tendermint-rpc.mdx | 8 +- cosmjs/v0.38.x/api-reference/utils.mdx | 1 + .../concepts/errors/gas-estimation.mdx | 1 + .../concepts/fees-gas/dynamic-gas-pricing.mdx | 1 + .../concepts/fees-gas/gas-and-fees.mdx | 4 +- .../v0.38.x/concepts/transports/timeouts.mdx | 1 + cosmjs/v0.38.x/guides/connect/http.mdx | 1 + 18 files changed, 222 insertions(+), 40 deletions(-) create mode 100644 changes.md diff --git a/CLAUDE.md b/CLAUDE.md index 57cef270e..2134c503a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -175,3 +175,21 @@ npm run reset # clean + reinstall The Cosmos SDK example chain tutorials (`sdk/next/tutorials/example/`, files `00-overview.mdx` through `05-run-and-test.mdx`) are kept in sync with the `cosmos/example` repo via a bidirectional GitHub Actions workflow. When either side merges a change, a PR is opened on the other repo with content transformed between formats. The transform script lives at `scripts/docs-sync/transform.py` and is tracked in git. When editing these tutorial pages, `title:` is owned by the sync — other front matter (e.g. `description:`) is preserved. + +## CosmJS Documentation + +CosmJS docs live in `docs/cosmjs/` with versioned subdirectories (e.g. `v0.38.x/`). The source repo is **`cosmos/cosmjs`** (not `cosmjs-team/cosmjs` — wrong org that makes all citations unresolvable). + +### Source citation format + +Factual claims in docs can be backed by inline MDX comments: + +```mdx +Some claim. {/* cosmos/cosmjs packages/stargate/src/stargateclient.ts:42 */} +``` + +**Critical MDX gotcha**: A blank line inside a Markdown table **terminates the table**. Never place a `{/* citation */}` comment after a blank line mid-table — it will cause all remaining rows to render as raw pipe-separated text. Place table citations after the last row of the table, or on the same line as a row. + +**TypeScript generics in MDX table cells**: Don't embed generic type constraints inside a type argument slot (e.g. `ArrayLike` is invalid TypeScript syntax). Use `ArrayLike` in the parameter column and describe the constraint in prose below the table. + +**Output/summary files**: When writing `changes.md` or other output files that reference source code, use repo slugs (`cosmos/cosmjs`) not local absolute paths (`/Users/evan/...`) — local paths are meaningless outside this machine. diff --git a/changes.md b/changes.md new file mode 100644 index 000000000..230690456 --- /dev/null +++ b/changes.md @@ -0,0 +1,136 @@ +# CosmJS Documentation Inaccuracies + +Changes needed to align documentation with the actual source code in `cosmos/cosmjs`. + +--- + +## `cosmjs/v0.38.x/api-reference/amino.mdx` + +### 1. `makeSignDoc` missing `timeout_height` parameter + +The table shows only 6 parameters but the actual source (`amino/src/signdoc.ts`) has a 7th optional parameter: + +```typescript +// Source signature: +export function makeSignDoc( + msgs: readonly AminoMsg[], + fee: StdFee, + chainId: string, + memo: string | undefined, // also accepts undefined, not just string + accountNumber: number | string, + sequence: number | string, + timeout_height?: bigint, // ← missing from docs +): StdSignDoc +``` + +**Fix:** Add `timeout_height?: bigint` as a 7th parameter in the table row for `makeSignDoc`. Also update `memo` type to `string | undefined`. + +--- + +## `cosmjs/v0.38.x/api-reference/socket.mdx` + +This file has the most inaccuracies. The public APIs differ from what is documented in multiple places. + +### 2. `SocketWrapper.constructor` — `errorHandler` is required, not optional + +The docs show `errorHandler?:` (optional) but the source (`socket/src/socketwrapper.ts:53-59`) has `errorHandler` as a required positional parameter (no `?`, no default): + +```typescript +// Source: +public constructor( + url: string, + messageHandler: (event: SocketWrapperMessageEvent) => void, + errorHandler: (event: SocketWrapperErrorEvent) => void, // required + openHandler?: () => void, + closeHandler?: (event: SocketWrapperCloseEvent) => void, + timeout = 10_000, // missing from docs +) +``` + +**Fix:** Remove the `?` from `errorHandler` and add the `timeout = 10_000` parameter at the end. + +### 3. `SocketWrapper.send` return type is wrong + +Docs show `send(data: string)` returns `void`, but source (`socketwrapper.ts:161`) declares it `async send(data: string): Promise`. + +**Fix:** Change return type from `void` to `Promise`. + +### 4. `SocketWrapperErrorEvent` fields are optional, not required + +The docs show: +```typescript +interface SocketWrapperErrorEvent { + readonly message: string; // required + readonly type: string; // required +} +``` + +But source (`socketwrapper.ts:17-24`) has both fields as optional: +```typescript +export interface SocketWrapperErrorEvent { + readonly isTrusted?: boolean; // also not in docs + readonly type?: string; + readonly message?: string; +} +``` + +**Fix:** Mark both `type` and `message` as optional (`type?: string`, `message?: string`). Also add the `isTrusted?: boolean` field. + +### 5. `StreamingSocket.send` return type is wrong + +Same issue as `SocketWrapper.send`. Source (`streamingsocket.ts:60`) declares it `async send(data: string): Promise`. + +**Fix:** Change return type from `void` to `Promise`. + +### 6. `QueueingStreamingSocket` — `send` method does not exist; it's `queueRequest` + +The docs list a `send(data: string): void` method, but `QueueingStreamingSocket` has no `send()` method. Source (`queueingstreamingsocket.ts:98`) has `queueRequest(request: string): void`. + +**Fix:** Replace `send(data: string): void` with `queueRequest(request: string): void` in the method table. + +### 7. `QueueingStreamingSocket.constructor` missing `reconnectedHandler` parameter + +Docs show `constructor(url: string, timeout?: number)` but source (`queueingstreamingsocket.ts:30`) has: +```typescript +public constructor(url: string, timeout = 10_000, reconnectedHandler?: () => void) +``` + +**Fix:** Add `reconnectedHandler?: () => void` as the third constructor parameter. + +### 8. `ReconnectingSocket.constructor` — wrong parameters + +Docs show: +``` +constructor(url: string, reconnectInterval?: number, timeout?: number) +``` + +The source (`reconnectingsocket.ts:26`) has: +```typescript +public constructor(url: string, timeout = 10_000, reconnectedHandler?: () => void) +``` + +The `reconnectInterval` parameter **does not exist**. The backoff is computed internally with exponential logic (`Math.min(2 ** index * 100, 5_000)`), not via a config parameter. + +**Fix:** Replace with the correct signature: `constructor(url: string, timeout?: number, reconnectedHandler?: () => void)`. + +### 9. `ReconnectingSocket` — `send` method does not exist; it's `queueRequest` + +Same issue as `QueueingStreamingSocket`. Source (`reconnectingsocket.ts:85`) has `queueRequest(request: string): void`, not `send()`. + +**Fix:** Replace `send(data: string): void` with `queueRequest(request: string): void`. + +--- + +## Summary + +| File | Issue | Severity | +|------|-------|----------| +| `amino.mdx` | `makeSignDoc` missing `timeout_height?: bigint` parameter | Medium | +| `socket.mdx` | `SocketWrapper.constructor` errorHandler shown as optional (it's required), missing `timeout` param | High | +| `socket.mdx` | `SocketWrapper.send` return type: `void` → `Promise` | High | +| `socket.mdx` | `SocketWrapperErrorEvent` fields shown as required; both are optional | Medium | +| `socket.mdx` | `StreamingSocket.send` return type: `void` → `Promise` | High | +| `socket.mdx` | `QueueingStreamingSocket.send` doesn't exist; correct method is `queueRequest` | High | +| `socket.mdx` | `QueueingStreamingSocket.constructor` missing `reconnectedHandler` param | Medium | +| `socket.mdx` | `ReconnectingSocket.constructor` lists `reconnectInterval` which doesn't exist | High | +| `socket.mdx` | `ReconnectingSocket.send` doesn't exist; correct method is `queueRequest` | High | diff --git a/cosmjs/v0.38.x/api-reference/amino.mdx b/cosmjs/v0.38.x/api-reference/amino.mdx index 5e72ca36d..345fd3f5e 100644 --- a/cosmjs/v0.38.x/api-reference/amino.mdx +++ b/cosmjs/v0.38.x/api-reference/amino.mdx @@ -47,6 +47,7 @@ interface Secp256k1HdWalletOptions { } ``` + ### Usage ```typescript @@ -122,7 +123,7 @@ const total = addCoins(coin(100, "uatom"), coin(50, "uatom")); | Function | Parameters | Returns | |----------|------------|---------| -| `makeSignDoc` | `msgs: readonly AminoMsg[]`, `fee: StdFee`, `chainId: string`, `memo: string`, `accountNumber: number \| string`, `sequence: number \| string` | `StdSignDoc` | +| `makeSignDoc` | `msgs: readonly AminoMsg[]`, `fee: StdFee`, `chainId: string`, `memo: string \| undefined`, `accountNumber: number \| string`, `sequence: number \| string`, `timeout_height?: bigint` | `StdSignDoc` | | `serializeSignDoc` | `signDoc: StdSignDoc` | `Uint8Array` | ## Multisig @@ -158,10 +159,11 @@ interface StdFee { ```typescript interface AminoMsg { readonly type: string; - readonly value: any; + readonly value: Record; } ``` + ### StdSignDoc ```typescript @@ -172,9 +174,11 @@ interface StdSignDoc { readonly fee: StdFee; readonly msgs: readonly AminoMsg[]; readonly memo: string; + readonly timeout_height?: string; } ``` + ### AccountData ```typescript @@ -251,3 +255,4 @@ interface MultisigThresholdPubkey { | `executeKdf(password, config)` | Execute key derivation function | | `isEthereumSecp256k1Account(account)` | Check if account uses Ethereum secp256k1 | | `getAminoPubkey(account)` | Get amino pubkey from account data | + diff --git a/cosmjs/v0.38.x/api-reference/crypto.mdx b/cosmjs/v0.38.x/api-reference/crypto.mdx index 630889dbd..cb76ee8eb 100644 --- a/cosmjs/v0.38.x/api-reference/crypto.mdx +++ b/cosmjs/v0.38.x/api-reference/crypto.mdx @@ -71,15 +71,18 @@ Elliptic curve operations for Cosmos, Bitcoin, and Ethereum signing. | `uncompressPubkey` (static) | `pubkey: Uint8Array` | `Uint8Array` | | `trimRecoveryByte` (static) | `signature: Uint8Array` | `Uint8Array` | + ### Types ```typescript interface Secp256k1Keypair { - readonly pubkey: Uint8Array; // 33 bytes (compressed) or 65 bytes - readonly privkey: Uint8Array; // 32 bytes + readonly pubkey: Uint8Array; + readonly privkey: Uint8Array; } ``` +The interface itself does not constrain the byte length of `pubkey`. When produced by `makeKeypair`, the key is always 65 bytes (uncompressed). Use `compressPubkey()` before passing it to Cosmos nodes, which expect 33-byte compressed keys. + ```typescript import { Secp256k1, sha256 } from "@cosmjs/crypto"; @@ -93,16 +96,17 @@ const valid = Secp256k1.verifySignature(signature, hash, keypair.pubkey); | Property | Type | Description | |----------|------|-------------| -| `r` | `Uint8Array` | 32 bytes | -| `s` | `Uint8Array` | 32 bytes | -| `recovery` | `number` | 0 or 1 (extended only) | +| `recovery` | `number` | 0–3 (extended only) | + +| Method | Parameters | Returns | Description | +|--------|------------|---------|-------------| +| `r(length?)` | `length?: number` | `Uint8Array` | r component, optionally zero-padded to `length` bytes | +| `s(length?)` | `length?: number` | `Uint8Array` | s component, optionally zero-padded to `length` bytes | +| `toFixedLength()` | — | `Uint8Array` | 64 bytes for `Secp256k1Signature`, 65 bytes for `ExtendedSecp256k1Signature` | +| `toDer()` | — | `Uint8Array` | DER-encoded signature | +| `fromFixedLength(data)` (static) | `data: Uint8Array` | `Secp256k1Signature` / `ExtendedSecp256k1Signature` | 64-byte input for base class, 65-byte for extended | +| `fromDer(data)` (static) | `data: Uint8Array` | `Secp256k1Signature` | Parse DER-encoded signature | -| Method | Returns | -|--------|---------| -| `toFixedLength()` | `Uint8Array` (64 bytes) | -| `toDer()` | `Uint8Array` | -| `fromFixedLength(data)` (static) | `Secp256k1Signature` / `ExtendedSecp256k1Signature` | -| `fromDer(data)` (static) | `Secp256k1Signature` | ## Ed25519 @@ -118,6 +122,7 @@ Edwards-curve digital signature algorithm for fast, deterministic signing. Ed25519 hashes the message internally. Do not pre-hash the message before signing. + ```typescript import { Ed25519 } from "@cosmjs/crypto"; @@ -182,6 +187,7 @@ enum Slip10Curve { } ``` + ```typescript import { Slip10, Slip10Curve, stringToPath, Bip39, EnglishMnemonic } from "@cosmjs/crypto"; @@ -199,8 +205,9 @@ Authenticated encryption using XChaCha20-Poly1305. | Method | Parameters | Returns | |--------|------------|---------| -| `encrypt` (static) | `plaintext: Uint8Array`, `key: Uint8Array`, `nonce: Uint8Array` | `Uint8Array` | -| `decrypt` (static) | `ciphertext: Uint8Array`, `key: Uint8Array`, `nonce: Uint8Array` | `Uint8Array` | +| `encrypt` (static) | `plaintext: Uint8Array`, `key: Uint8Array`, `nonce: Uint8Array` | `Promise` | +| `decrypt` (static) | `ciphertext: Uint8Array`, `key: Uint8Array`, `nonce: Uint8Array` | `Promise` | + The constant `xchacha20NonceLength` is `24`. diff --git a/cosmjs/v0.38.x/api-reference/encoding.mdx b/cosmjs/v0.38.x/api-reference/encoding.mdx index b1c2f2483..4b920d95e 100644 --- a/cosmjs/v0.38.x/api-reference/encoding.mdx +++ b/cosmjs/v0.38.x/api-reference/encoding.mdx @@ -73,7 +73,7 @@ const str = fromUtf8(bytes); // "hello world" | `toAscii` | `str: string` | `Uint8Array` | | `fromAscii` | `data: Uint8Array` | `string` | -Throws if the input contains non-ASCII characters (code points above 127). +Throws if the input contains characters outside the printable ASCII range (code points below 0x20 or above 0x7E). ## RFC 3339 Timestamps diff --git a/cosmjs/v0.38.x/api-reference/faucet-client.mdx b/cosmjs/v0.38.x/api-reference/faucet-client.mdx index c740c8ed2..d6921ea7a 100644 --- a/cosmjs/v0.38.x/api-reference/faucet-client.mdx +++ b/cosmjs/v0.38.x/api-reference/faucet-client.mdx @@ -26,4 +26,4 @@ const faucet = new FaucetClient("http://localhost:8000"); await faucet.credit("cosmos1youraddress...", "uatom"); ``` -The `credit` method throws if the faucet request fails (cooldown not met, faucet out of funds, etc.). +The `credit` method sends a POST to `{baseUrl}/credit`. It will throw on network errors (e.g. unreachable host) but does not inspect the HTTP response status code for faucet-level errors such as cooldowns or insufficient funds. diff --git a/cosmjs/v0.38.x/api-reference/json-rpc.mdx b/cosmjs/v0.38.x/api-reference/json-rpc.mdx index 9cf9f5aec..473332767 100644 --- a/cosmjs/v0.38.x/api-reference/json-rpc.mdx +++ b/cosmjs/v0.38.x/api-reference/json-rpc.mdx @@ -69,10 +69,11 @@ interface JsonRpcRequest { readonly jsonrpc: "2.0"; readonly id: JsonRpcId; readonly method: string; - readonly params: Record; + readonly params: JsonCompatibleArray | JsonCompatibleDictionary; } ``` + ### JsonRpcSuccessResponse ```typescript @@ -88,21 +89,23 @@ interface JsonRpcSuccessResponse { ```typescript interface JsonRpcErrorResponse { readonly jsonrpc: "2.0"; - readonly id: JsonRpcId; + readonly id: JsonRpcId | null; readonly error: JsonRpcError; } ``` + ### JsonRpcError ```typescript interface JsonRpcError { readonly code: number; readonly message: string; - readonly data?: string; + readonly data?: JsonCompatibleValue; } ``` + ### JsonRpcId ```typescript diff --git a/cosmjs/v0.38.x/api-reference/proto-signing.mdx b/cosmjs/v0.38.x/api-reference/proto-signing.mdx index cc6183184..55885c9d3 100644 --- a/cosmjs/v0.38.x/api-reference/proto-signing.mdx +++ b/cosmjs/v0.38.x/api-reference/proto-signing.mdx @@ -47,6 +47,7 @@ interface DirectSecp256k1HdWalletOptions { } ``` + ### Usage ```typescript diff --git a/cosmjs/v0.38.x/api-reference/socket.mdx b/cosmjs/v0.38.x/api-reference/socket.mdx index a7cde82c0..e6bea1de4 100644 --- a/cosmjs/v0.38.x/api-reference/socket.mdx +++ b/cosmjs/v0.38.x/api-reference/socket.mdx @@ -15,10 +15,10 @@ Thin abstraction over the native WebSocket API that works in both browsers and N | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `url: string`, `messageHandler: (event: SocketWrapperMessageEvent) => void`, `errorHandler?: (event: SocketWrapperErrorEvent) => void`, `openHandler?: () => void`, `closeHandler?: (event: SocketWrapperCloseEvent) => void` | `SocketWrapper` | +| `constructor` | `url: string`, `messageHandler: (event: SocketWrapperMessageEvent) => void`, `errorHandler: (event: SocketWrapperErrorEvent) => void`, `openHandler?: () => void`, `closeHandler?: (event: SocketWrapperCloseEvent) => void`, `timeout?: number` | `SocketWrapper` | | `connect` | — | `void` | | `disconnect` | — | `void` | -| `send` | `data: string` | `void` | +| `send` | `data: string` | `Promise` | ## StreamingSocket @@ -29,7 +29,7 @@ WebSocket client that exposes received messages as an xstream `Stream`. | `constructor` | `url: string`, `timeout?: number` | `StreamingSocket` | | `connect` | — | `void` | | `disconnect` | — | `void` | -| `send` | `data: string` | `void` | +| `send` | `data: string` | `Promise` | | Property | Type | |----------|------| @@ -41,10 +41,10 @@ WebSocket client with automatic reconnection logic. | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `url: string`, `reconnectInterval?: number`, `timeout?: number` | `ReconnectingSocket` | +| `constructor` | `url: string`, `timeout?: number`, `reconnectedHandler?: () => void` | `ReconnectingSocket` | | `connect` | — | `void` | | `disconnect` | — | `void` | -| `send` | `data: string` | `void` | +| `queueRequest` | `request: string` | `void` | | Property | Type | |----------|------| @@ -56,10 +56,10 @@ WebSocket that queues outgoing messages until the connection is established. | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `url: string`, `timeout?: number` | `QueueingStreamingSocket` | +| `constructor` | `url: string`, `timeout?: number`, `reconnectedHandler?: () => void` | `QueueingStreamingSocket` | | `connect` | — | `void` | | `disconnect` | — | `void` | -| `send` | `data: string` | `void` | +| `queueRequest` | `request: string` | `void` | | `getQueueLength` | — | `number` | | Property | Type | @@ -76,8 +76,9 @@ interface SocketWrapperMessageEvent { } interface SocketWrapperErrorEvent { - readonly message: string; - readonly type: string; + readonly isTrusted?: boolean; + readonly type?: string; + readonly message?: string; } interface SocketWrapperCloseEvent { @@ -90,10 +91,10 @@ interface SocketWrapperCloseEvent { ```typescript enum ConnectionStatus { - Unconnected = "unconnected", - Connecting = "connecting", - Connected = "connected", - Disconnecting = "disconnecting", - Disconnected = "disconnected", + Unconnected, // 0 + Connecting, // 1 + Connected, // 2 + Disconnected, // 3 } ``` + diff --git a/cosmjs/v0.38.x/api-reference/stargate.mdx b/cosmjs/v0.38.x/api-reference/stargate.mdx index 5febdc6e5..2cefcc2c9 100644 --- a/cosmjs/v0.38.x/api-reference/stargate.mdx +++ b/cosmjs/v0.38.x/api-reference/stargate.mdx @@ -135,6 +135,7 @@ Calculates transaction fees from a gas limit and gas price. function calculateFee(gasLimit: number, gasPrice: GasPrice | string): StdFee ``` + ```typescript import { calculateFee, GasPrice } from "@cosmjs/stargate"; @@ -212,6 +213,7 @@ interface DeliverTxResponse { } ``` + ### IndexedTx ```typescript @@ -262,6 +264,7 @@ interface SigningStargateClientOptions extends StargateClientOptions { } ``` + ### SignerData ```typescript diff --git a/cosmjs/v0.38.x/api-reference/stream.mdx b/cosmjs/v0.38.x/api-reference/stream.mdx index b4ed5e5ff..67bb7c792 100644 --- a/cosmjs/v0.38.x/api-reference/stream.mdx +++ b/cosmjs/v0.38.x/api-reference/stream.mdx @@ -59,7 +59,8 @@ const items = await toListPromise(stream, 5); | Function | Parameters | Returns | |----------|------------|---------| | `concat` | `...streams: Array>` | `Stream` | -| `dropDuplicates` | `comparator?: (a: T, b: T) => boolean` | `SameTypeStreamOperator` | +| `dropDuplicates` | `valueToKey: (x: T) => string` | `SameTypeStreamOperator` | + ## Reducer diff --git a/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx b/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx index a1069724d..fba0c1b4d 100644 --- a/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx +++ b/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx @@ -106,11 +106,13 @@ Batches multiple RPC requests into a single HTTP call. ```typescript interface HttpBatchClientOptions { - readonly dispatchInterval: number; - readonly batchSizeLimit: number; + dispatchInterval: number; + batchSizeLimit: number; + httpTimeout?: number; } ``` + ### WebsocketClient WebSocket client for streaming subscriptions. @@ -150,9 +152,11 @@ enum BlockIdFlag { Absent = 1, Commit = 2, Nil = 3, + Unrecognized = -1, } ``` + ## Date Utilities | Function | Parameters | Returns | diff --git a/cosmjs/v0.38.x/api-reference/utils.mdx b/cosmjs/v0.38.x/api-reference/utils.mdx index 4fea3c148..c4a58ab78 100644 --- a/cosmjs/v0.38.x/api-reference/utils.mdx +++ b/cosmjs/v0.38.x/api-reference/utils.mdx @@ -58,3 +58,4 @@ await sleep(1000); // wait 1 second |----------|------------|---------| | `arrayContentEquals` | `a: ArrayLike`, `b: ArrayLike` | `boolean` | | `arrayContentStartsWith` | `a: ArrayLike`, `b: ArrayLike` | `boolean` | + diff --git a/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx b/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx index 3239fa042..77f97364f 100644 --- a/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx +++ b/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx @@ -13,6 +13,7 @@ Thrown when using `"auto"` fee without setting a gas price: "Gas price must be set in the client options when auto gas is used." ``` + Fix: pass `gasPrice` when creating the signing client: ```typescript diff --git a/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx b/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx index a0941b5cd..ec19ac03b 100644 --- a/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx +++ b/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx @@ -57,6 +57,7 @@ When `"auto"` fee is used with a `DynamicGasPriceConfig`: | `maxGasPrice` | `GasPrice` | No | Ceiling price. If not set, no maximum is enforced | | `multiplier` | `number` | No | Multiplier on the queried price. Defaults to 1.3 | + ## Checking Support You can verify whether a chain supports dynamic gas pricing before configuring diff --git a/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx b/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx index bbae52696..d3a41f66f 100644 --- a/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx +++ b/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx @@ -72,9 +72,7 @@ import { GasPrice } from "@cosmjs/stargate"; const gasPrice = new GasPrice(Decimal.fromUserInput("0.025", 18), "uatom"); ``` -`GasPrice.fromString` parses a `` string and validates the denom -against Cosmos SDK rules (3–128 characters, must start with a letter, followed -by alphanumeric characters or `/`, `:`, `.`, `_`, `-`). +`GasPrice.fromString` parses a `` string. The input regex requires the denom to start with a letter followed by alphanumeric characters or `/`, `:`, `.`, `_`, `-`. It also validates that the denom is 3–128 characters in length. ## Three Ways to Specify Fees diff --git a/cosmjs/v0.38.x/concepts/transports/timeouts.mdx b/cosmjs/v0.38.x/concepts/transports/timeouts.mdx index ecb541106..95a72661f 100644 --- a/cosmjs/v0.38.x/concepts/transports/timeouts.mdx +++ b/cosmjs/v0.38.x/concepts/transports/timeouts.mdx @@ -31,6 +31,7 @@ interface SigningStargateClientOptions { } ``` + These are not transport timeouts — they control how long `signAndBroadcast()` waits for the transaction to appear in a block after it has been submitted. diff --git a/cosmjs/v0.38.x/guides/connect/http.mdx b/cosmjs/v0.38.x/guides/connect/http.mdx index 1ea744ad3..a8599a7fa 100644 --- a/cosmjs/v0.38.x/guides/connect/http.mdx +++ b/cosmjs/v0.38.x/guides/connect/http.mdx @@ -58,6 +58,7 @@ const client = StargateClient.create(cometClient); | `dispatchInterval` | `number` | 20 | Milliseconds between automatic queue flushes. | | `httpTimeout` | `number` | — | Request timeout in milliseconds. | + Batching is useful when your application fires many independent queries in rapid succession — for example, fetching balances for a list of addresses. ## Next Steps From 46873ecd2dcb18a15dac4a5455851d83112e08e5 Mon Sep 17 00:00:00 2001 From: Evan <87997759+evanorti@users.noreply.github.com> Date: Thu, 23 Apr 2026 08:29:29 -0400 Subject: [PATCH 12/17] Remove duplicate content from CLAUDE.md Removed redundant section on relative imports and CosmJS documentation. --- CLAUDE.md | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 2134c503a..57cef270e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -175,21 +175,3 @@ npm run reset # clean + reinstall The Cosmos SDK example chain tutorials (`sdk/next/tutorials/example/`, files `00-overview.mdx` through `05-run-and-test.mdx`) are kept in sync with the `cosmos/example` repo via a bidirectional GitHub Actions workflow. When either side merges a change, a PR is opened on the other repo with content transformed between formats. The transform script lives at `scripts/docs-sync/transform.py` and is tracked in git. When editing these tutorial pages, `title:` is owned by the sync — other front matter (e.g. `description:`) is preserved. - -## CosmJS Documentation - -CosmJS docs live in `docs/cosmjs/` with versioned subdirectories (e.g. `v0.38.x/`). The source repo is **`cosmos/cosmjs`** (not `cosmjs-team/cosmjs` — wrong org that makes all citations unresolvable). - -### Source citation format - -Factual claims in docs can be backed by inline MDX comments: - -```mdx -Some claim. {/* cosmos/cosmjs packages/stargate/src/stargateclient.ts:42 */} -``` - -**Critical MDX gotcha**: A blank line inside a Markdown table **terminates the table**. Never place a `{/* citation */}` comment after a blank line mid-table — it will cause all remaining rows to render as raw pipe-separated text. Place table citations after the last row of the table, or on the same line as a row. - -**TypeScript generics in MDX table cells**: Don't embed generic type constraints inside a type argument slot (e.g. `ArrayLike` is invalid TypeScript syntax). Use `ArrayLike` in the parameter column and describe the constraint in prose below the table. - -**Output/summary files**: When writing `changes.md` or other output files that reference source code, use repo slugs (`cosmos/cosmjs`) not local absolute paths (`/Users/evan/...`) — local paths are meaningless outside this machine. From 158c9b67179b1ddd120e824cd46b24e54a1a7ade Mon Sep 17 00:00:00 2001 From: Evan <87997759+evanorti@users.noreply.github.com> Date: Thu, 23 Apr 2026 08:30:04 -0400 Subject: [PATCH 13/17] Delete changes.md --- changes.md | 136 ----------------------------------------------------- 1 file changed, 136 deletions(-) delete mode 100644 changes.md diff --git a/changes.md b/changes.md deleted file mode 100644 index 230690456..000000000 --- a/changes.md +++ /dev/null @@ -1,136 +0,0 @@ -# CosmJS Documentation Inaccuracies - -Changes needed to align documentation with the actual source code in `cosmos/cosmjs`. - ---- - -## `cosmjs/v0.38.x/api-reference/amino.mdx` - -### 1. `makeSignDoc` missing `timeout_height` parameter - -The table shows only 6 parameters but the actual source (`amino/src/signdoc.ts`) has a 7th optional parameter: - -```typescript -// Source signature: -export function makeSignDoc( - msgs: readonly AminoMsg[], - fee: StdFee, - chainId: string, - memo: string | undefined, // also accepts undefined, not just string - accountNumber: number | string, - sequence: number | string, - timeout_height?: bigint, // ← missing from docs -): StdSignDoc -``` - -**Fix:** Add `timeout_height?: bigint` as a 7th parameter in the table row for `makeSignDoc`. Also update `memo` type to `string | undefined`. - ---- - -## `cosmjs/v0.38.x/api-reference/socket.mdx` - -This file has the most inaccuracies. The public APIs differ from what is documented in multiple places. - -### 2. `SocketWrapper.constructor` — `errorHandler` is required, not optional - -The docs show `errorHandler?:` (optional) but the source (`socket/src/socketwrapper.ts:53-59`) has `errorHandler` as a required positional parameter (no `?`, no default): - -```typescript -// Source: -public constructor( - url: string, - messageHandler: (event: SocketWrapperMessageEvent) => void, - errorHandler: (event: SocketWrapperErrorEvent) => void, // required - openHandler?: () => void, - closeHandler?: (event: SocketWrapperCloseEvent) => void, - timeout = 10_000, // missing from docs -) -``` - -**Fix:** Remove the `?` from `errorHandler` and add the `timeout = 10_000` parameter at the end. - -### 3. `SocketWrapper.send` return type is wrong - -Docs show `send(data: string)` returns `void`, but source (`socketwrapper.ts:161`) declares it `async send(data: string): Promise`. - -**Fix:** Change return type from `void` to `Promise`. - -### 4. `SocketWrapperErrorEvent` fields are optional, not required - -The docs show: -```typescript -interface SocketWrapperErrorEvent { - readonly message: string; // required - readonly type: string; // required -} -``` - -But source (`socketwrapper.ts:17-24`) has both fields as optional: -```typescript -export interface SocketWrapperErrorEvent { - readonly isTrusted?: boolean; // also not in docs - readonly type?: string; - readonly message?: string; -} -``` - -**Fix:** Mark both `type` and `message` as optional (`type?: string`, `message?: string`). Also add the `isTrusted?: boolean` field. - -### 5. `StreamingSocket.send` return type is wrong - -Same issue as `SocketWrapper.send`. Source (`streamingsocket.ts:60`) declares it `async send(data: string): Promise`. - -**Fix:** Change return type from `void` to `Promise`. - -### 6. `QueueingStreamingSocket` — `send` method does not exist; it's `queueRequest` - -The docs list a `send(data: string): void` method, but `QueueingStreamingSocket` has no `send()` method. Source (`queueingstreamingsocket.ts:98`) has `queueRequest(request: string): void`. - -**Fix:** Replace `send(data: string): void` with `queueRequest(request: string): void` in the method table. - -### 7. `QueueingStreamingSocket.constructor` missing `reconnectedHandler` parameter - -Docs show `constructor(url: string, timeout?: number)` but source (`queueingstreamingsocket.ts:30`) has: -```typescript -public constructor(url: string, timeout = 10_000, reconnectedHandler?: () => void) -``` - -**Fix:** Add `reconnectedHandler?: () => void` as the third constructor parameter. - -### 8. `ReconnectingSocket.constructor` — wrong parameters - -Docs show: -``` -constructor(url: string, reconnectInterval?: number, timeout?: number) -``` - -The source (`reconnectingsocket.ts:26`) has: -```typescript -public constructor(url: string, timeout = 10_000, reconnectedHandler?: () => void) -``` - -The `reconnectInterval` parameter **does not exist**. The backoff is computed internally with exponential logic (`Math.min(2 ** index * 100, 5_000)`), not via a config parameter. - -**Fix:** Replace with the correct signature: `constructor(url: string, timeout?: number, reconnectedHandler?: () => void)`. - -### 9. `ReconnectingSocket` — `send` method does not exist; it's `queueRequest` - -Same issue as `QueueingStreamingSocket`. Source (`reconnectingsocket.ts:85`) has `queueRequest(request: string): void`, not `send()`. - -**Fix:** Replace `send(data: string): void` with `queueRequest(request: string): void`. - ---- - -## Summary - -| File | Issue | Severity | -|------|-------|----------| -| `amino.mdx` | `makeSignDoc` missing `timeout_height?: bigint` parameter | Medium | -| `socket.mdx` | `SocketWrapper.constructor` errorHandler shown as optional (it's required), missing `timeout` param | High | -| `socket.mdx` | `SocketWrapper.send` return type: `void` → `Promise` | High | -| `socket.mdx` | `SocketWrapperErrorEvent` fields shown as required; both are optional | Medium | -| `socket.mdx` | `StreamingSocket.send` return type: `void` → `Promise` | High | -| `socket.mdx` | `QueueingStreamingSocket.send` doesn't exist; correct method is `queueRequest` | High | -| `socket.mdx` | `QueueingStreamingSocket.constructor` missing `reconnectedHandler` param | Medium | -| `socket.mdx` | `ReconnectingSocket.constructor` lists `reconnectInterval` which doesn't exist | High | -| `socket.mdx` | `ReconnectingSocket.send` doesn't exist; correct method is `queueRequest` | High | From a31f355ec737eff2f3cb7d12f571a8d7d7c854ad Mon Sep 17 00:00:00 2001 From: Evan <87997759+evanorti@users.noreply.github.com> Date: Thu, 23 Apr 2026 10:44:30 -0400 Subject: [PATCH 14/17] Update cosmjs/v0.38.x/api-reference/stream.mdx Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- cosmjs/v0.38.x/api-reference/stream.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmjs/v0.38.x/api-reference/stream.mdx b/cosmjs/v0.38.x/api-reference/stream.mdx index 67bb7c792..2ed08231d 100644 --- a/cosmjs/v0.38.x/api-reference/stream.mdx +++ b/cosmjs/v0.38.x/api-reference/stream.mdx @@ -59,7 +59,7 @@ const items = await toListPromise(stream, 5); | Function | Parameters | Returns | |----------|------------|---------| | `concat` | `...streams: Array>` | `Stream` | -| `dropDuplicates` | `valueToKey: (x: T) => string` | `SameTypeStreamOperator` | +| `dropDuplicates` | `valueToKey?: (x: T) => string` | `SameTypeStreamOperator` | ## Reducer From 7689135a596930b3095e64056bcd4aa331f50096 Mon Sep 17 00:00:00 2001 From: Nur Fikri Date: Fri, 24 Apr 2026 04:37:04 +0700 Subject: [PATCH 15/17] fix: correct 18 API inaccuracies in CosmJS v0.38.x docs Verified every fix against cosmos/cosmjs main branch on GitHub. API reference fixes: - stream.mdx: dropDuplicates valueToKey is required, not optional - stargate.mdx: remove nonexistent auth.accounts method - tendermint-rpc.mdx: fix CometClient as union type (not interface), WebsocketClient.listen returns Stream (not JsonRpcEvent), add missing HttpClient timeout param, fix HttpBatchClient Partial<> options, correct date helper return types to DateWithNanoseconds - proto-signing.mdx: decodePubkey accepts Any (not null), add decodeOptionalPubkey, makeAuthInfoBytes feeGranter/feePayer are required positional args, DirectEthSecp256k1HdWallet differs from DirectSecp256k1HdWallet - math.mdx: Uint64 uses bigint internally, not string - cosmwasm.mdx: toBinary/fromBinary use any, not JsonObject Concept page fixes: - errors/queries.mdx: getContract throws on not-found, does not return null - cosmos-evm/signing-client.mdx: add warning about simulate() pubkey encoding - protobuf-encoding.mdx: signMode is global, not per-signer - dynamic-gas-pricing.mdx: document Osmosis vs feemarket query paths - signing-clients.mdx: simulate() memo is required (string | undefined) Made-with: Cursor --- cosmjs/v0.38.x/api-reference/cosmwasm.mdx | 4 ++-- cosmjs/v0.38.x/api-reference/math.mdx | 2 +- cosmjs/v0.38.x/api-reference/proto-signing.mdx | 9 +++++---- cosmjs/v0.38.x/api-reference/stargate.mdx | 2 +- cosmjs/v0.38.x/api-reference/stream.mdx | 2 +- cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx | 14 +++++++------- .../v0.38.x/concepts/clients/signing-clients.mdx | 2 +- .../v0.38.x/concepts/cosmos-evm/signing-client.mdx | 11 +++++++++-- cosmjs/v0.38.x/concepts/errors/queries.mdx | 7 +++++-- .../concepts/fees-gas/dynamic-gas-pricing.mdx | 2 +- .../messages-encoding/protobuf-encoding.mdx | 4 +++- 11 files changed, 36 insertions(+), 23 deletions(-) diff --git a/cosmjs/v0.38.x/api-reference/cosmwasm.mdx b/cosmjs/v0.38.x/api-reference/cosmwasm.mdx index 3d5899a96..696d48881 100644 --- a/cosmjs/v0.38.x/api-reference/cosmwasm.mdx +++ b/cosmjs/v0.38.x/api-reference/cosmwasm.mdx @@ -296,8 +296,8 @@ interface SigningCosmWasmClientOptions extends CosmWasmClientOptions { | `setupWasmExtension` | `base: QueryClient` | `WasmExtension` | | `createWasmAminoConverters` | — | `AminoConverters` | | `instantiate2Address` | `checksum: Uint8Array`, `creator: string`, `salt: Uint8Array`, `prefix: string` | `string` | -| `toBinary` | `obj: JsonObject` | `string` | -| `fromBinary` | `binary: string` | `JsonObject` | +| `toBinary` | `obj: any` | `string` | +| `fromBinary` | `binary: string` | `any` | ## Encode Objects diff --git a/cosmjs/v0.38.x/api-reference/math.mdx b/cosmjs/v0.38.x/api-reference/math.mdx index 1c274d200..ed84c966f 100644 --- a/cosmjs/v0.38.x/api-reference/math.mdx +++ b/cosmjs/v0.38.x/api-reference/math.mdx @@ -44,7 +44,7 @@ npm install @cosmjs/math ## Uint64 -64-bit unsigned integer. Uses string-based internal representation for values beyond JavaScript's safe integer range. +64-bit unsigned integer. Uses `bigint` internal representation for values beyond JavaScript's safe integer range. | Method | Parameters | Returns | |--------|------------|---------| diff --git a/cosmjs/v0.38.x/api-reference/proto-signing.mdx b/cosmjs/v0.38.x/api-reference/proto-signing.mdx index 55885c9d3..15f0b6a9a 100644 --- a/cosmjs/v0.38.x/api-reference/proto-signing.mdx +++ b/cosmjs/v0.38.x/api-reference/proto-signing.mdx @@ -74,11 +74,11 @@ Single-key wallet for Protobuf Direct signing. Implements `OfflineDirectSigner`. ## DirectEthSecp256k1HdWallet -HD wallet using Ethereum's secp256k1 curve for chains with EVM compatibility. Same API as `DirectSecp256k1HdWallet`. +HD wallet using Ethereum's secp256k1 curve for chains with EVM compatibility. Supports `generate`, `fromMnemonic`, `getAccounts`, and `signDirect` like `DirectSecp256k1HdWallet`, but uses the Ethereum HD path `m/44'/60'/0'/0/0` by default and Keccak-256 for address derivation. Does not support wallet serialization (`serialize`/`deserialize`). ## DirectEthSecp256k1Wallet -Single-key wallet using Ethereum's secp256k1 curve. Same API as `DirectSecp256k1Wallet`. +Single-key wallet using Ethereum's secp256k1 curve. Supports `fromKey`, `getAccounts`, and `signDirect` like `DirectSecp256k1Wallet`, but reports `algo: "eth_secp256k1"` and uses Keccak-256 for signing. ## Registry @@ -183,12 +183,13 @@ interface DecodedTxRaw { | Function | Parameters | Returns | |----------|------------|---------| -| `makeAuthInfoBytes` | `signers: ReadonlyArray<{ pubkey: Any; sequence: bigint \| number }>`, `feeAmount: readonly Coin[]`, `gasLimit: number`, `feeGranter?: string`, `feePayer?: string`, `signMode?: SignMode` | `Uint8Array` | +| `makeAuthInfoBytes` | `signers: ReadonlyArray<{ pubkey: Any; sequence: bigint \| number }>`, `feeAmount: readonly Coin[]`, `gasLimit: number`, `feeGranter: string \| undefined`, `feePayer: string \| undefined`, `signMode?: SignMode` | `Uint8Array` | | `makeSignDoc` | `bodyBytes: Uint8Array`, `authInfoBytes: Uint8Array`, `chainId: string`, `accountNumber: number` | `SignDoc` | | `makeSignBytes` | `signDoc: SignDoc` | `Uint8Array` | | `decodeTxRaw` | `tx: Uint8Array` | `DecodedTxRaw` | | `encodePubkey` | `pubkey: Pubkey` | `Any` | -| `decodePubkey` | `pubkey: Any \| null` | `Pubkey \| null` | +| `decodePubkey` | `pubkey: Any` | `Pubkey` | +| `decodeOptionalPubkey` | `pubkey: Any \| null \| undefined` | `Pubkey \| null` | | `makeCosmoshubPath` | `account: number` | `HdPath` | | `coin` | `amount: number \| string`, `denom: string` | `Coin` | | `coins` | `amount: number \| string`, `denom: string` | `Coin[]` | diff --git a/cosmjs/v0.38.x/api-reference/stargate.mdx b/cosmjs/v0.38.x/api-reference/stargate.mdx index 2cefcc2c9..26622d649 100644 --- a/cosmjs/v0.38.x/api-reference/stargate.mdx +++ b/cosmjs/v0.38.x/api-reference/stargate.mdx @@ -163,7 +163,7 @@ Setup functions to add module-specific query methods: | `setupGovExtension` | `gov` | `proposals`, `proposal`, `deposits`, `votes`, `tally` | | `setupDistributionExtension` | `distribution` | `delegationRewards`, `delegationTotalRewards`, `communityPool` | | `setupMintExtension` | `mint` | `inflation`, `annualProvisions`, `params` | -| `setupAuthExtension` | `auth` | `account`, `accounts` | +| `setupAuthExtension` | `auth` | `account` | | `setupIbcExtension` | `ibc` | `channel.channel`, `channel.channels`, `transfer.denomTrace` | | `setupTxExtension` | `tx` | `getTx`, `simulate` | | `setupSlashingExtension` | `slashing` | `signingInfos`, `params` | diff --git a/cosmjs/v0.38.x/api-reference/stream.mdx b/cosmjs/v0.38.x/api-reference/stream.mdx index 2ed08231d..67bb7c792 100644 --- a/cosmjs/v0.38.x/api-reference/stream.mdx +++ b/cosmjs/v0.38.x/api-reference/stream.mdx @@ -59,7 +59,7 @@ const items = await toListPromise(stream, 5); | Function | Parameters | Returns | |----------|------------|---------| | `concat` | `...streams: Array>` | `Stream` | -| `dropDuplicates` | `valueToKey?: (x: T) => string` | `SameTypeStreamOperator` | +| `dropDuplicates` | `valueToKey: (x: T) => string` | `SameTypeStreamOperator` | ## Reducer diff --git a/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx b/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx index fba0c1b4d..08c637df6 100644 --- a/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx +++ b/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx @@ -24,9 +24,9 @@ const client = await connectComet("https://rpc.my-chain.network"); const status = await client.status(); ``` -## CometClient Interface +## CometClient -All version-specific clients (`Tendermint37Client`, `Comet38Client`, `Comet1Client`) implement this interface. +`CometClient` is a union type of all version-specific clients: `Tendermint37Client | Comet38Client | Comet1Client`. They share these methods: | Method | Parameters | Returns | |--------|------------|---------| @@ -90,7 +90,7 @@ Standard HTTP client for request/response RPC. | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `endpoint: string \| HttpEndpoint` | `HttpClient` | +| `constructor` | `endpoint: string \| HttpEndpoint`, `timeout?: number` | `HttpClient` | | `execute` | `request: JsonRpcRequest` | `Promise` | | `disconnect` | — | `void` | @@ -100,7 +100,7 @@ Batches multiple RPC requests into a single HTTP call. | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `endpoint: string \| HttpEndpoint`, `options?: HttpBatchClientOptions` | `HttpBatchClient` | +| `constructor` | `endpoint: string \| HttpEndpoint`, `options?: Partial` | `HttpBatchClient` | | `execute` | `request: JsonRpcRequest` | `Promise` | | `disconnect` | — | `void` | @@ -121,7 +121,7 @@ WebSocket client for streaming subscriptions. |--------|------------|---------| | `constructor` | `endpoint: string`, `onError?: (err: any) => void` | `WebsocketClient` | | `execute` | `request: JsonRpcRequest` | `Promise` | -| `listen` | `request: JsonRpcRequest` | `Stream` | +| `listen` | `request: JsonRpcRequest` | `Stream` | | `disconnect` | — | `void` | ## Key Types @@ -161,9 +161,9 @@ enum BlockIdFlag { | Function | Parameters | Returns | |----------|------------|---------| -| `fromRfc3339WithNanoseconds` | `str: string` | `ReadonlyDateWithNanoseconds` | +| `fromRfc3339WithNanoseconds` | `str: string` | `DateWithNanoseconds` | | `toRfc3339WithNanoseconds` | `date: ReadonlyDateWithNanoseconds` | `string` | -| `fromSeconds` | `seconds: number`, `nanos?: number` | `ReadonlyDateWithNanoseconds` | +| `fromSeconds` | `seconds: number`, `nanos?: number` | `DateWithNanoseconds` | | `toSeconds` | `date: ReadonlyDateWithNanoseconds` | `{ seconds: number; nanos: number }` | ## Address Utilities diff --git a/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx index dc93eb1e2..d38c82905 100644 --- a/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx +++ b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx @@ -56,7 +56,7 @@ const client = await SigningStargateClient.connectWithSigner( | `signAndBroadcast(address, messages, fee, memo?, timeoutHeight?)` | Sign, broadcast, and wait for inclusion | | `signAndBroadcastSync(address, messages, fee, memo?, timeoutHeight?)` | Sign and broadcast, return tx hash immediately | | `sign(address, messages, fee, memo, signerData?, timeoutHeight?)` | Sign without broadcasting (returns `TxRaw`) | -| `simulate(address, messages, memo?)` | Estimate gas for a transaction | +| `simulate(address, messages, memo)` | Estimate gas for a transaction (`memo` is `string \| undefined`, not optional — pass `undefined` explicitly) | ### Convenience Methods diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx index bd4c26b03..5c1994f46 100644 --- a/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx @@ -4,8 +4,15 @@ description: Connecting SigningStargateClient with EVM wallets in CosmJS. --- `SigningStargateClient` works with EVM wallets without any special configuration. -The client inspects the `algo` field from the wallet's `AccountData` and -automatically selects the correct pubkey encoding: +When signing transactions, the client inspects the `algo` field from the wallet's +`AccountData` and automatically selects the correct pubkey encoding. + + +Gas simulation (`simulate()`) always uses standard secp256k1 pubkey encoding +regardless of the wallet's `algo` field. This means `"auto"` fees may produce +incorrect simulations with EVM wallets. Use explicit `StdFee` values instead of +`"auto"` when working with `DirectEthSecp256k1HdWallet`. + ```typescript import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; diff --git a/cosmjs/v0.38.x/concepts/errors/queries.mdx b/cosmjs/v0.38.x/concepts/errors/queries.mdx index 4890e0abc..dc5a51efa 100644 --- a/cosmjs/v0.38.x/concepts/errors/queries.mdx +++ b/cosmjs/v0.38.x/concepts/errors/queries.mdx @@ -7,7 +7,7 @@ These errors occur when querying accounts, contracts, or other on-chain resource ## Account / Resource Not Found -Methods like `getAccount`, `getContract`, and `getDelegation` catch "not found" +Methods like `getAccount` and `getDelegation` catch "not found" gRPC errors internally and return `null` instead of throwing: ```typescript @@ -15,7 +15,10 @@ const account = await client.getAccount("cosmos1nonexistent..."); // Returns null, does not throw ``` -However, `getSequence` throws if the account does not exist because a sequence +`getContract` does not return `null` — it throws if no contract is found at the +given address. + +`getSequence` also throws if the account does not exist because a sequence number is always required for signing: ``` diff --git a/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx b/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx index ec19ac03b..fdb277f85 100644 --- a/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx +++ b/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx @@ -43,7 +43,7 @@ const result = await client.signAndBroadcast(address, messages, "auto"); When `"auto"` fee is used with a `DynamicGasPriceConfig`: -1. The chain's feemarket module is queried for the current base gas price +1. The chain's fee module is queried for the current base gas price (Osmosis uses `/osmosis.txfees.v1beta1.Query/GetEipBaseFee`; other chains use Skip's `/feemarket.feemarket.v1.Query/GasPrices`) 2. The `multiplier` is applied (default 1.3x) to stay above the minimum 3. The result is clamped between `minGasPrice` and `maxGasPrice` 4. If the query fails, `minGasPrice` is used as a fallback diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx index 23da91e1d..d869c7d4d 100644 --- a/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx +++ b/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx @@ -60,7 +60,9 @@ const authInfoBytes = makeAuthInfoBytes( Each signer entry includes: - **pubkey** — the signer's public key, encoded as `Any` - **sequence** — the account's current transaction counter -- **signMode** — `SIGN_MODE_DIRECT` for Protobuf signing + +The `signMode` parameter is a single global setting (not per-signer) that +defaults to `SIGN_MODE_DIRECT`. ## TxRaw From 640931bfed921c18296500a16a846a57c0e3690c Mon Sep 17 00:00:00 2001 From: Nur Fikri Date: Fri, 24 Apr 2026 05:06:12 +0700 Subject: [PATCH 16/17] fix: update API documentation for clarity and accuracy in CosmJS v0.38.x --- cosmjs/v0.38.x/api-reference/amino.mdx | 8 ++-- cosmjs/v0.38.x/api-reference/cosmwasm.mdx | 11 +++++ cosmjs/v0.38.x/api-reference/crypto.mdx | 17 ++++---- cosmjs/v0.38.x/api-reference/encoding.mdx | 12 +++--- cosmjs/v0.38.x/api-reference/json-rpc.mdx | 16 ++++--- cosmjs/v0.38.x/api-reference/ledger-amino.mdx | 5 +++ cosmjs/v0.38.x/api-reference/math.mdx | 19 ++++++-- .../v0.38.x/api-reference/proto-signing.mdx | 3 +- cosmjs/v0.38.x/api-reference/socket.mdx | 6 +++ cosmjs/v0.38.x/api-reference/stargate.mdx | 17 +++++++- cosmjs/v0.38.x/api-reference/stream.mdx | 43 ++++++++++++++++--- .../v0.38.x/api-reference/tendermint-rpc.mdx | 13 +++--- cosmjs/v0.38.x/api-reference/utils.mdx | 16 ++++--- cosmjs/v0.38.x/concepts/account/account.mdx | 2 +- .../concepts/clients/signing-clients.mdx | 2 +- .../concepts/clients/stargate-vs-cosmwasm.mdx | 12 +++++- .../concepts/cosmos-evm/full-example.mdx | 7 ++- .../concepts/cosmos-evm/key-differences.mdx | 10 +++-- .../concepts/cosmos-evm/signing-client.mdx | 8 +++- .../concepts/errors/signing-wallet.mdx | 2 +- .../messages-encoding/encode-objects.mdx | 2 + .../messages-encoding/protobuf-encoding.mdx | 5 ++- .../concepts/messages-encoding/registry.mdx | 2 +- .../concepts/transactions/advanced.mdx | 1 + .../concepts/transactions/custom-messages.mdx | 9 +++- .../concepts/transactions/direct-vs-amino.mdx | 2 + .../concepts/transactions/sign-broadcast.mdx | 5 ++- cosmjs/v0.38.x/guides/connect/errors.mdx | 3 +- cosmjs/v0.38.x/guides/query/transactions.mdx | 31 ++++++++++--- 29 files changed, 214 insertions(+), 75 deletions(-) diff --git a/cosmjs/v0.38.x/api-reference/amino.mdx b/cosmjs/v0.38.x/api-reference/amino.mdx index 345fd3f5e..71f9e5ce9 100644 --- a/cosmjs/v0.38.x/api-reference/amino.mdx +++ b/cosmjs/v0.38.x/api-reference/amino.mdx @@ -88,7 +88,7 @@ Single-key wallet for Amino JSON signing. Implements `OfflineAminoSigner`. | `coin` | `amount: number \| string`, `denom: string` | `Coin` | | `coins` | `amount: number \| string`, `denom: string` | `Coin[]` | | `parseCoins` | `input: string` | `Coin[]` | -| `addCoins` | `a: Coin`, `b: Coin` | `Coin` | +| `addCoins` | `lhs: Coin`, `rhs: Coin` | `Coin` | ```typescript import { coin, coins, parseCoins, addCoins } from "@cosmjs/amino"; @@ -130,7 +130,9 @@ const total = addCoins(coin(100, "uatom"), coin(50, "uatom")); | Function | Parameters | Returns | |----------|------------|---------| -| `createMultisigThresholdPubkey` | `pubkeys: readonly SinglePubkey[]`, `threshold: number` | `MultisigThresholdPubkey` | +| `createMultisigThresholdPubkey` | `pubkeys: readonly SinglePubkey[]`, `threshold: number`, `nosort?: boolean` | `MultisigThresholdPubkey` | + +When `nosort` is `false` (default), pubkeys are sorted by their raw address to match the Cosmos SDK client behavior. Pass `true` to preserve the input order. ## Key Types @@ -230,7 +232,7 @@ interface Ed25519Pubkey { } interface EthSecp256k1Pubkey { - readonly type: "ethermint/PubKeyEthSecp256k1"; + readonly type: "os/PubKeyEthSecp256k1"; readonly value: string; } diff --git a/cosmjs/v0.38.x/api-reference/cosmwasm.mdx b/cosmjs/v0.38.x/api-reference/cosmwasm.mdx index 696d48881..1f0e6efee 100644 --- a/cosmjs/v0.38.x/api-reference/cosmwasm.mdx +++ b/cosmjs/v0.38.x/api-reference/cosmwasm.mdx @@ -116,6 +116,7 @@ Extends `CosmWasmClient` with transaction signing and smart contract management. ### Usage ```typescript +import fs from "node:fs"; import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; import { GasPrice } from "@cosmjs/stargate"; @@ -203,6 +204,8 @@ interface UploadResult { readonly height: number; readonly transactionHash: string; readonly events: readonly Event[]; + /** @deprecated Not filled in Cosmos SDK >= 0.50. Use `events` instead. */ + readonly logs: readonly logs.Log[]; readonly gasWanted: bigint; readonly gasUsed: bigint; } @@ -216,6 +219,8 @@ interface InstantiateResult { readonly height: number; readonly transactionHash: string; readonly events: readonly Event[]; + /** @deprecated Not filled in Cosmos SDK >= 0.50. Use `events` instead. */ + readonly logs: readonly logs.Log[]; readonly gasWanted: bigint; readonly gasUsed: bigint; } @@ -238,6 +243,8 @@ interface ExecuteResult { readonly height: number; readonly transactionHash: string; readonly events: readonly Event[]; + /** @deprecated Not filled in Cosmos SDK >= 0.50. Use `events` instead. */ + readonly logs: readonly logs.Log[]; readonly gasWanted: bigint; readonly gasUsed: bigint; } @@ -260,6 +267,8 @@ interface MigrateResult { readonly height: number; readonly transactionHash: string; readonly events: readonly Event[]; + /** @deprecated Not filled in Cosmos SDK >= 0.50. Use `events` instead. */ + readonly logs: readonly logs.Log[]; readonly gasWanted: bigint; readonly gasUsed: bigint; } @@ -272,6 +281,8 @@ interface ChangeAdminResult { readonly height: number; readonly transactionHash: string; readonly events: readonly Event[]; + /** @deprecated Not filled in Cosmos SDK >= 0.50. Use `events` instead. */ + readonly logs: readonly logs.Log[]; readonly gasWanted: bigint; readonly gasUsed: bigint; } diff --git a/cosmjs/v0.38.x/api-reference/crypto.mdx b/cosmjs/v0.38.x/api-reference/crypto.mdx index cb76ee8eb..cdd915eae 100644 --- a/cosmjs/v0.38.x/api-reference/crypto.mdx +++ b/cosmjs/v0.38.x/api-reference/crypto.mdx @@ -46,7 +46,7 @@ const incrementalHash = hasher.digest(); | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `hashFunctionConstructor: new () => HashFunction`, `key: Uint8Array` | `Hmac` | +| `constructor` | `hashFunctionConstructor: new () => HashFunction`, `originalKey: Uint8Array` | `Hmac` | | `update` | `data: Uint8Array` | `Hmac` | | `digest` | — | `Uint8Array` | @@ -67,6 +67,7 @@ Elliptic curve operations for Cosmos, Bitcoin, and Ethereum signing. | `makeKeypair` (static) | `privkey: Uint8Array` | `Secp256k1Keypair` | | `createSignature` (static) | `messageHash: Uint8Array`, `privkey: Uint8Array` | `ExtendedSecp256k1Signature` | | `verifySignature` (static) | `signature: Secp256k1Signature`, `messageHash: Uint8Array`, `pubkey: Uint8Array` | `boolean` | +| `recoverPubkey` (static) | `signature: ExtendedSecp256k1Signature`, `messageHash: Uint8Array` | `Uint8Array` | | `compressPubkey` (static) | `pubkey: Uint8Array` | `Uint8Array` | | `uncompressPubkey` (static) | `pubkey: Uint8Array` | `Uint8Array` | | `trimRecoveryByte` (static) | `signature: Uint8Array` | `Uint8Array` | @@ -114,8 +115,8 @@ Edwards-curve digital signature algorithm for fast, deterministic signing. | Method | Parameters | Returns | |--------|------------|---------| -| `makeKeypair` (static) | `seed: Uint8Array` | `Promise` | -| `createSignature` (static) | `message: Uint8Array`, `keypair: Ed25519Keypair` | `Promise` | +| `makeKeypair` (static) | `privKey: Uint8Array` (32-byte seed) | `Promise` | +| `createSignature` (static) | `message: Uint8Array`, `keyPair: Ed25519Keypair` | `Promise` | | `verifySignature` (static) | `signature: Uint8Array`, `message: Uint8Array`, `pubkey: Uint8Array` | `Promise` | @@ -167,9 +168,9 @@ const seed = await Bip39.mnemonicToSeed(validated); | Function | Parameters | Returns | |----------|------------|---------| -| `stringToPath` | `pathString: string` | `HdPath` | +| `stringToPath` | `input: string` | `HdPath` | | `pathToString` | `path: HdPath` | `string` | -| `slip10CurveFromString` | `curve: string` | `Slip10Curve` | +| `slip10CurveFromString` | `curveString: string` | `Slip10Curve` | ### Types @@ -177,8 +178,8 @@ const seed = await Bip39.mnemonicToSeed(validated); type HdPath = readonly Slip10RawIndex[]; interface Slip10Result { - readonly privkey: Uint8Array; readonly chainCode: Uint8Array; + readonly privkey: Uint8Array; } enum Slip10Curve { @@ -205,7 +206,7 @@ Authenticated encryption using XChaCha20-Poly1305. | Method | Parameters | Returns | |--------|------------|---------| -| `encrypt` (static) | `plaintext: Uint8Array`, `key: Uint8Array`, `nonce: Uint8Array` | `Promise` | +| `encrypt` (static) | `message: Uint8Array`, `key: Uint8Array`, `nonce: Uint8Array` | `Promise` | | `decrypt` (static) | `ciphertext: Uint8Array`, `key: Uint8Array`, `nonce: Uint8Array` | `Promise` | @@ -221,7 +222,7 @@ Password-based key derivation. | Method | Parameters | Returns | |--------|------------|---------| -| `execute` (static) | `password: string`, `salt: Uint8Array`, `options: Argon2idOptions` | `Promise` | +| `execute` (static) | `password: string`, `salt: Uint8Array` (must be 16 bytes), `options: Argon2idOptions` | `Promise` | ```typescript interface Argon2idOptions { diff --git a/cosmjs/v0.38.x/api-reference/encoding.mdx b/cosmjs/v0.38.x/api-reference/encoding.mdx index 4b920d95e..5ceaff828 100644 --- a/cosmjs/v0.38.x/api-reference/encoding.mdx +++ b/cosmjs/v0.38.x/api-reference/encoding.mdx @@ -14,7 +14,7 @@ npm install @cosmjs/encoding | Function | Parameters | Returns | |----------|------------|---------| | `toHex` | `data: Uint8Array` | `string` | -| `fromHex` | `hexString: string` | `Uint8Array` | +| `fromHex` | `hexstring: string` | `Uint8Array` | ```typescript import { toHex, fromHex } from "@cosmjs/encoding"; @@ -41,8 +41,8 @@ const bytes = fromBase64("AQID"); // Uint8Array [1, 2, 3] | Function | Parameters | Returns | |----------|------------|---------| -| `toBech32` | `prefix: string`, `data: Uint8Array` | `string` | -| `fromBech32` | `address: string` | `{ prefix: string; data: Uint8Array }` | +| `toBech32` | `prefix: string`, `data: Uint8Array`, `limit?: number` | `string` | +| `fromBech32` | `address: string`, `limit?: number` (default `Infinity`) | `{ readonly prefix: string; readonly data: Uint8Array }` | | `normalizeBech32` | `address: string` | `string` | ```typescript @@ -57,7 +57,9 @@ const { prefix, data } = fromBech32("cosmos1abc..."); | Function | Parameters | Returns | |----------|------------|---------| | `toUtf8` | `str: string` | `Uint8Array` | -| `fromUtf8` | `data: Uint8Array` | `string` | +| `fromUtf8` | `data: Uint8Array`, `lossy?: boolean` (default `false`) | `string` | + +`fromUtf8` throws on invalid UTF-8 sequences by default. Pass `lossy: true` to replace invalid bytes with the Unicode replacement character (`U+FFFD`). ```typescript import { toUtf8, fromUtf8 } from "@cosmjs/encoding"; @@ -70,7 +72,7 @@ const str = fromUtf8(bytes); // "hello world" | Function | Parameters | Returns | |----------|------------|---------| -| `toAscii` | `str: string` | `Uint8Array` | +| `toAscii` | `input: string` | `Uint8Array` | | `fromAscii` | `data: Uint8Array` | `string` | Throws if the input contains characters outside the printable ASCII range (code points below 0x20 or above 0x7E). diff --git a/cosmjs/v0.38.x/api-reference/json-rpc.mdx b/cosmjs/v0.38.x/api-reference/json-rpc.mdx index 473332767..03efef3a3 100644 --- a/cosmjs/v0.38.x/api-reference/json-rpc.mdx +++ b/cosmjs/v0.38.x/api-reference/json-rpc.mdx @@ -15,16 +15,18 @@ Sends JSON-RPC requests over a generic messaging connection. | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `connection: SimpleMessagingConnection` | `JsonRpcClient` | +| `constructor` | `connection: SimpleMessagingConnection` | `JsonRpcClient` | | `run` | `request: JsonRpcRequest` | `Promise` | ```typescript -interface SimpleMessagingConnection { - readonly responseStream: Stream; - readonly sendRequest: (request: string) => void; +interface SimpleMessagingConnection { + readonly responseStream: Stream; + readonly sendRequest: (request: Request) => void; } ``` +`JsonRpcClient` uses the instantiation `SimpleMessagingConnection`: the stream emits already-parsed responses, and `sendRequest` receives structured request objects (not strings). + ## Parsing Functions | Function | Parameters | Returns | @@ -33,7 +35,7 @@ interface SimpleMessagingConnection { | `parseJsonRpcSuccessResponse` | `data: unknown` | `JsonRpcSuccessResponse` | | `parseJsonRpcErrorResponse` | `data: unknown` | `JsonRpcErrorResponse` | | `parseJsonRpcRequest` | `data: unknown` | `JsonRpcRequest` | -| `parseJsonRpcId` | `data: unknown` | `JsonRpcId` | +| `parseJsonRpcId` | `data: unknown` | `JsonRpcId \| null` (returns `null` if no valid id is present) | ## Type Guards @@ -58,7 +60,7 @@ if (isJsonRpcErrorResponse(response)) { | Function | Parameters | Returns | |----------|------------|---------| -| `makeJsonRpcId` | — | `JsonRpcId` | +| `makeJsonRpcId` | — | `number` (assignable to `JsonRpcId`) | ## Key Types @@ -129,4 +131,4 @@ The `jsonRpcCode` object provides standard JSON-RPC 2.0 error codes: | -32601 | `methodNotFound` | Method does not exist | | -32602 | `invalidParams` | Invalid method parameters | | -32603 | `internalError` | Internal JSON-RPC error | -| -32000 | `serverError.default` | Server error | +| -32000 | `jsonRpcCode.serverError.default` | Server error (default slot of the `-32000` to `-32099` implementation-defined range) | diff --git a/cosmjs/v0.38.x/api-reference/ledger-amino.mdx b/cosmjs/v0.38.x/api-reference/ledger-amino.mdx index 79eb6fc08..f7bccc5a4 100644 --- a/cosmjs/v0.38.x/api-reference/ledger-amino.mdx +++ b/cosmjs/v0.38.x/api-reference/ledger-amino.mdx @@ -22,6 +22,7 @@ Implements `OfflineAminoSigner` using a Ledger hardware wallet. | `constructor` | `transport: Transport`, `options?: LedgerConnectorOptions` | `LedgerSigner` | | `getAccounts` | — | `Promise` | | `signAmino` | `signerAddress: string`, `signDoc: StdSignDoc` | `Promise` | +| `showAddress` | `path?: HdPath` | `Promise` (asks the device to display an address for user confirmation) | ### Options @@ -72,7 +73,9 @@ Low-level interface for direct communication with the Cosmos Ledger app. | Method | Parameters | Returns | |--------|------------|---------| | `constructor` | `transport: Transport`, `options?: LedgerConnectorOptions` | `LedgerConnector` | +| `getCosmosAppVersion` | — | `Promise` | | `getPubkey` | `hdPath?: HdPath` | `Promise` | +| `getPubkeys` | — | `Promise` (one per configured HD path) | | `getCosmosAddress` | `pubkey?: Uint8Array` | `Promise` | | `sign` | `message: Uint8Array`, `hdPath?: HdPath` | `Promise` | | `showAddress` | `hdPath?: HdPath` | `Promise` | @@ -85,3 +88,5 @@ interface AddressAndPubkey { readonly pubkey: Secp256k1Pubkey; } ``` + +When constructing `LedgerConnector` without options, these defaults apply: `ledgerAppName` is `"Cosmos"`, `minLedgerAppVersion` is `"1.5.3"`, `testModeAllowed` is `false`, `prefix` is `"cosmos"`, and `hdPaths` defaults to `[makeCosmoshubPath(0)]`. diff --git a/cosmjs/v0.38.x/api-reference/math.mdx b/cosmjs/v0.38.x/api-reference/math.mdx index ed84c966f..c435028ed 100644 --- a/cosmjs/v0.38.x/api-reference/math.mdx +++ b/cosmjs/v0.38.x/api-reference/math.mdx @@ -15,7 +15,11 @@ npm install @cosmjs/math | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `value: number` | `Uint32` | +| `constructor` | `input: number` | `Uint32` | +| `fromString` (static) | `str: string` | `Uint32` | +| `fromBytes` (static) | `bytes: ArrayLike`, `endianness?: "be" \| "le"` (default `"be"`) | `Uint32` | +| `toBytesBigEndian` | — | `Uint8Array` | +| `toBytesLittleEndian` | — | `Uint8Array` | | `toNumber` | — | `number` | | `toString` | — | `string` | | `toBigInt` | — | `bigint` | @@ -26,7 +30,8 @@ npm install @cosmjs/math | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `value: number` | `Uint53` | +| `constructor` | `input: number` | `Uint53` | +| `fromString` (static) | `str: string` | `Uint53` | | `toNumber` | — | `number` | | `toString` | — | `string` | | `toBigInt` | — | `bigint` | @@ -37,7 +42,8 @@ npm install @cosmjs/math | Method | Parameters | Returns | |--------|------------|---------| -| `constructor` | `value: number` | `Int53` | +| `constructor` | `input: number` | `Int53` | +| `fromString` (static) | `str: string` | `Int53` | | `toNumber` | — | `number` | | `toString` | — | `string` | | `toBigInt` | — | `bigint` | @@ -49,7 +55,10 @@ npm install @cosmjs/math | Method | Parameters | Returns | |--------|------------|---------| | `fromString` (static) | `str: string` | `Uint64` | -| `fromNumber` (static) | `value: number` | `Uint64` | +| `fromNumber` (static) | `input: number` (must be a safe integer) | `Uint64` | +| `fromBytes` (static) | `bytes: ArrayLike`, `endianness?: "be" \| "le"` (default `"be"`) | `Uint64` | +| `toBytesBigEndian` | — | `Uint8Array` | +| `toBytesLittleEndian` | — | `Uint8Array` | | `toNumber` | — | `number` | | `toString` | — | `string` | | `toBigInt` | — | `bigint` | @@ -73,6 +82,7 @@ Arbitrary-precision decimal type for safe financial calculations. Internally sto | `fromUserInput` | `input: string`, `fractionalDigits: number` | `Decimal` | | `zero` | `fractionalDigits: number` | `Decimal` | | `one` | `fractionalDigits: number` | `Decimal` | +| `compare` | `a: Decimal`, `b: Decimal` | `number` (< 0 if a < b, > 0 if a > b, 0 if equal) | ### Instance Methods @@ -84,6 +94,7 @@ Arbitrary-precision decimal type for safe financial calculations. Internally sto | `floor` | — | `Decimal` | | `ceil` | — | `Decimal` | | `neg` | — | `Decimal` | +| `abs` | — | `Decimal` | | `isNegative` | — | `boolean` | | `adjustFractionalDigits` | `newFractionalDigits: number` | `Decimal` | | `equals` | `other: Decimal` | `boolean` | diff --git a/cosmjs/v0.38.x/api-reference/proto-signing.mdx b/cosmjs/v0.38.x/api-reference/proto-signing.mdx index 15f0b6a9a..c8de1d612 100644 --- a/cosmjs/v0.38.x/api-reference/proto-signing.mdx +++ b/cosmjs/v0.38.x/api-reference/proto-signing.mdx @@ -51,7 +51,7 @@ interface DirectSecp256k1HdWalletOptions { ### Usage ```typescript -import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { DirectSecp256k1HdWallet, makeCosmoshubPath } from "@cosmjs/proto-signing"; const wallet = await DirectSecp256k1HdWallet.generate(24, { prefix: "cosmos" }); const [{ address, pubkey }] = await wallet.getAccounts(); @@ -195,3 +195,4 @@ interface DecodedTxRaw { | `coins` | `amount: number \| string`, `denom: string` | `Coin[]` | | `parseCoins` | `input: string` | `Coin[]` | | `extractKdfConfiguration` | `serialization: string` | `KdfConfiguration` | +| `executeKdf` | `password: string`, `configuration: KdfConfiguration` | `Promise` | diff --git a/cosmjs/v0.38.x/api-reference/socket.mdx b/cosmjs/v0.38.x/api-reference/socket.mdx index e6bea1de4..c736c99de 100644 --- a/cosmjs/v0.38.x/api-reference/socket.mdx +++ b/cosmjs/v0.38.x/api-reference/socket.mdx @@ -20,6 +20,10 @@ Thin abstraction over the native WebSocket API that works in both browsers and N | `disconnect` | — | `void` | | `send` | `data: string` | `Promise` | +| Property | Type | +|----------|------| +| `connected` | `Promise` (resolves once the socket is open) | + ## StreamingSocket WebSocket client that exposes received messages as an xstream `Stream`. @@ -34,6 +38,7 @@ WebSocket client that exposes received messages as an xstream `Stream`. | Property | Type | |----------|------| | `events` | `Stream` | +| `connected` | `Promise` | ## ReconnectingSocket @@ -49,6 +54,7 @@ WebSocket client with automatic reconnection logic. | Property | Type | |----------|------| | `events` | `Stream` | +| `connectionStatus` | `ValueAndUpdates` | ## QueueingStreamingSocket diff --git a/cosmjs/v0.38.x/api-reference/stargate.mdx b/cosmjs/v0.38.x/api-reference/stargate.mdx index 26622d649..cd88d0695 100644 --- a/cosmjs/v0.38.x/api-reference/stargate.mdx +++ b/cosmjs/v0.38.x/api-reference/stargate.mdx @@ -92,6 +92,7 @@ Extends `StargateClient` with transaction signing and broadcasting. Inherits all ```typescript import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { MsgSend } from "cosmjs-types/cosmos/bank/v1beta1/tx"; const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ..."); const [{ address }] = await wallet.getAccounts(); @@ -109,7 +110,16 @@ const result = await client.sendTokens( "auto", ); -await client.signAndBroadcast(address, [msg], "auto", "memo"); +const sendMsg = { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: MsgSend.fromPartial({ + fromAddress: address, + toAddress: "cosmos1recipient...", + amount: [{ denom: "uatom", amount: "1000000" }], + }), +}; + +await client.signAndBroadcast(address, [sendMsg], "auto", "memo"); ``` ## GasPrice @@ -166,7 +176,7 @@ Setup functions to add module-specific query methods: | `setupAuthExtension` | `auth` | `account` | | `setupIbcExtension` | `ibc` | `channel.channel`, `channel.channels`, `transfer.denomTrace` | | `setupTxExtension` | `tx` | `getTx`, `simulate` | -| `setupSlashingExtension` | `slashing` | `signingInfos`, `params` | +| `setupSlashingExtension` | `slashing` | `signingInfo`, `signingInfos`, `params` | | `setupFeegrantExtension` | `feegrant` | `allowance`, `allowances` | | `setupAuthzExtension` | `authz` | `grants` | @@ -206,7 +216,10 @@ interface DeliverTxResponse { readonly code: number; readonly transactionHash: string; readonly events: readonly Event[]; + /** @deprecated Not filled in Cosmos SDK 0.50+. Use `events` instead. */ readonly rawLog?: string; + /** @deprecated Use `msgResponses` instead. */ + readonly data?: readonly MsgData[]; readonly msgResponses: Array<{ readonly typeUrl: string; readonly value: Uint8Array }>; readonly gasUsed: bigint; readonly gasWanted: bigint; diff --git a/cosmjs/v0.38.x/api-reference/stream.mdx b/cosmjs/v0.38.x/api-reference/stream.mdx index 67bb7c792..6030fe270 100644 --- a/cosmjs/v0.38.x/api-reference/stream.mdx +++ b/cosmjs/v0.38.x/api-reference/stream.mdx @@ -11,13 +11,15 @@ npm install @cosmjs/stream ## DefaultValueProducer -An xstream `Producer` that stores a current value and emits updates. +An xstream `Producer` that stores a current value and emits updates. `start` and `stop` implement the xstream `Producer` contract and are normally called by the stream, not application code. | Method | Parameters | Returns | |--------|------------|---------| | `constructor` | `value: T`, `callbacks?: DefaultValueProducerCallsbacks` | `DefaultValueProducer` | | `update` | `value: T` | `void` | | `error` | `error: any` | `void` | +| `start` | `listener: Listener` | `void` | +| `stop` | — | `void` | | Property | Type | |----------|------| @@ -25,25 +27,36 @@ An xstream `Producer` that stores a current value and emits updates. ```typescript interface DefaultValueProducerCallsbacks { - readonly onStarted?: () => void; - readonly onStop?: () => void; + readonly onStarted: () => void; + readonly onStop: () => void; } ``` + + The exported identifier `DefaultValueProducerCallsbacks` contains a spelling typo ("Callsbacks") that is preserved for backwards compatibility. + + ## ValueAndUpdates -Wraps a `DefaultValueProducer` to expose both the current value and a stream of updates. +Wraps a `DefaultValueProducer` to expose both the current value and a `MemoryStream` of updates. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `producer: DefaultValueProducer` | `ValueAndUpdates` | +| `waitFor` | `search: SearchFunction \| T` | `Promise` | | Property | Type | |----------|------| | `value` | `T` | -| `updates` | `Stream` | +| `updates` | `MemoryStream` | + +`waitFor` resolves with the first value matching the predicate (or strict-equal match when a value is passed). ## Promise Utilities | Function | Parameters | Returns | |----------|------------|---------| -| `toListPromise` | `stream: Stream`, `count: number` | `Promise` | +| `toListPromise` | `stream: Stream`, `count: number` | `Promise` | | `firstEvent` | `stream: Stream` | `Promise` | | `fromListPromise` | `promise: Promise>` | `Stream` | @@ -61,7 +74,23 @@ const items = await toListPromise(stream, 5); | `concat` | `...streams: Array>` | `Stream` | | `dropDuplicates` | `valueToKey: (x: T) => string` | `SameTypeStreamOperator` | - ## Reducer Utilities for applying reducer patterns to streams. + +| Export | Kind | Purpose | +|--------|------|---------| +| `Reducer` | class | Subscribes to a stream and materializes state of type `U` from events of type `T` | +| `ReducerFunc` | type | `(acc: U, evt: T) => U` | +| `countStream` | function | Returns `Reducer` that counts events seen on the stream | +| `asArray` | function | Returns `Reducer` that accumulates all events into an array | +| `lastValue` | function | Returns `Reducer` holding the most recently emitted value | + +```typescript +import { Reducer, countStream, asArray, lastValue } from "@cosmjs/stream"; + +const counter = countStream(myStream); +// ... later +counter.value(); // number of events seen so far +await counter.finished(); // resolves when stream completes +``` diff --git a/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx b/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx index 08c637df6..96f24c2e2 100644 --- a/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx +++ b/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx @@ -76,9 +76,11 @@ For CometBFT 1.x nodes. | Function | Parameters | Returns | |----------|------------|---------| -| `isTendermint37Client` | `client: CometClient` | `boolean` | -| `isComet38Client` | `client: CometClient` | `boolean` | -| `isComet1Client` | `client: CometClient` | `boolean` | +| `isTendermint37Client` | `client: CometClient` | `client is Tendermint37Client` | +| `isComet38Client` | `client: CometClient` | `client is Comet38Client` | +| `isComet1Client` | `client: CometClient` | `client is Comet1Client` | + +These are TypeScript type predicates, so the compiler narrows the client type in the branch where the guard returns `true`. ## RPC Clients @@ -122,6 +124,7 @@ WebSocket client for streaming subscriptions. | `constructor` | `endpoint: string`, `onError?: (err: any) => void` | `WebsocketClient` | | `execute` | `request: JsonRpcRequest` | `Promise` | | `listen` | `request: JsonRpcRequest` | `Stream` | +| `connected` | — | `Promise` (resolves when the socket is connected) | | `disconnect` | — | `void` | ## Key Types @@ -172,5 +175,5 @@ enum BlockIdFlag { |----------|------------|---------| | `pubkeyToAddress` | `type: "ed25519" \| "secp256k1"`, `data: Uint8Array` | `string` | | `pubkeyToRawAddress` | `type: "ed25519" \| "secp256k1"`, `data: Uint8Array` | `Uint8Array` | -| `rawSecp256k1PubkeyToRawAddress` | `pubkeyRaw: Uint8Array` | `Uint8Array` | -| `rawEd25519PubkeyToRawAddress` | `pubkeyRaw: Uint8Array` | `Uint8Array` | +| `rawSecp256k1PubkeyToRawAddress` | `pubkeyData: Uint8Array` | `Uint8Array` | +| `rawEd25519PubkeyToRawAddress` | `pubkeyData: Uint8Array` | `Uint8Array` | diff --git a/cosmjs/v0.38.x/api-reference/utils.mdx b/cosmjs/v0.38.x/api-reference/utils.mdx index c4a58ab78..8de351169 100644 --- a/cosmjs/v0.38.x/api-reference/utils.mdx +++ b/cosmjs/v0.38.x/api-reference/utils.mdx @@ -13,9 +13,11 @@ npm install @cosmjs/utils | Function | Parameters | Returns | |----------|------------|---------| -| `assert` | `condition: any`, `msg?: string` | `void` (throws if falsy) | -| `assertDefined` | `value: T \| undefined`, `msg?: string` | `void` (throws if undefined) | -| `assertDefinedAndNotNull` | `value: T \| undefined \| null`, `msg?: string` | `void` (throws if null/undefined) | +| `assert` | `condition: any`, `msg?: string` | `asserts condition` (throws if falsy) | +| `assertDefined` | `value: T \| undefined`, `msg?: string` | `asserts value is T` (throws if undefined) | +| `assertDefinedAndNotNull` | `value: T \| undefined \| null`, `msg?: string` | `asserts value is T` (throws if null/undefined) | + +These helpers use TypeScript assertion signatures, so the compiler narrows the type of the argument in the enclosing scope after a successful call. ```typescript import { assert, assertDefined } from "@cosmjs/utils"; @@ -29,7 +31,7 @@ assertDefined(account, "Account not found"); | Function | Parameters | Returns | |----------|------------|---------| | `isDefined` | `value: T \| undefined` | `value is T` | -| `isNonNullObject` | `value: unknown` | `value is Record` | +| `isNonNullObject` | `data: unknown` | `data is object` (also matches arrays) | | `isUint8Array` | `value: unknown` | `value is Uint8Array` | ```typescript @@ -56,6 +58,8 @@ await sleep(1000); // wait 1 second | Function | Parameters | Returns | |----------|------------|---------| -| `arrayContentEquals` | `a: ArrayLike`, `b: ArrayLike` | `boolean` | -| `arrayContentStartsWith` | `a: ArrayLike`, `b: ArrayLike` | `boolean` | +| `arrayContentEquals` | `a: ArrayLike`, `b: ArrayLike` where `T extends string \| number \| boolean` | `boolean` | +| `arrayContentStartsWith` | `a: ArrayLike`, `b: ArrayLike` where `T extends string \| number \| boolean` | `boolean` | + +Elements are compared with strict equality, so these helpers only support arrays of primitives (string/number/boolean). diff --git a/cosmjs/v0.38.x/concepts/account/account.mdx b/cosmjs/v0.38.x/concepts/account/account.mdx index 7bcafd406..c218165ed 100644 --- a/cosmjs/v0.38.x/concepts/account/account.mdx +++ b/cosmjs/v0.38.x/concepts/account/account.mdx @@ -44,7 +44,7 @@ keys the wallet manages: ```typescript interface AccountData { readonly address: string; - readonly algo: Algo; // "secp256k1" | "ed25519" | "eth_secp256k1" | ... + readonly algo: Algo; // "secp256k1" | "ed25519" | "sr25519" | "eth_secp256k1" | "ethsecp256k1" readonly pubkey: Uint8Array; } ``` diff --git a/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx index d38c82905..5a276ce24 100644 --- a/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx +++ b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx @@ -55,7 +55,7 @@ const client = await SigningStargateClient.connectWithSigner( |--------|-------------| | `signAndBroadcast(address, messages, fee, memo?, timeoutHeight?)` | Sign, broadcast, and wait for inclusion | | `signAndBroadcastSync(address, messages, fee, memo?, timeoutHeight?)` | Sign and broadcast, return tx hash immediately | -| `sign(address, messages, fee, memo, signerData?, timeoutHeight?)` | Sign without broadcasting (returns `TxRaw`) | +| `sign(address, messages, fee, memo, signerData?, timeoutHeight?)` | Sign without broadcasting (returns `TxRaw`). `memo` is required — pass `""` to omit. | | `simulate(address, messages, memo)` | Estimate gas for a transaction (`memo` is `string \| undefined`, not optional — pass `undefined` explicitly) | ### Convenience Methods diff --git a/cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm.mdx b/cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm.mdx index f5a88cfc0..f28e9bc92 100644 --- a/cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm.mdx +++ b/cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm.mdx @@ -34,8 +34,16 @@ contract interaction, use the CosmWasm client for everything. Both signing clients support custom message types through the `Registry`: ```typescript -import { Registry } from "@cosmjs/proto-signing"; -import { defaultRegistryTypes, SigningStargateClient } from "@cosmjs/stargate"; +import { DirectSecp256k1HdWallet, Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes, GasPrice, SigningStargateClient } from "@cosmjs/stargate"; +// Generated message type from your own chain's protos: +import { MsgDoSomething } from "./generated/my/custom/v1/tx"; + +const endpoint = "https://rpc.my-chain.network"; +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "cosmos", +}); +const [{ address }] = await wallet.getAccounts(); const registry = new Registry(defaultRegistryTypes); registry.register("/my.custom.v1.MsgDoSomething", MsgDoSomething); diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx index 75790dac1..ea531f6d2 100644 --- a/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx @@ -7,7 +7,7 @@ This end-to-end example creates an EVM-compatible wallet, connects to a Cosmos E ```typescript import { DirectEthSecp256k1HdWallet } from "@cosmjs/proto-signing"; -import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { SigningStargateClient, GasPrice, calculateFee } from "@cosmjs/stargate"; const mnemonic = "copper push brief egg scan entry inform record adjust fossil boss egg " + @@ -27,7 +27,10 @@ const client = await SigningStargateClient.connectWithSigner( const recipient = "cosmos1recipient..."; const amount = [{ denom: "atest", amount: "1000000000000000000" }]; -const result = await client.sendTokens(address, recipient, amount, "auto"); +// EVM wallets need explicit fees — gas simulation uses the wrong pubkey type. +const fee = calculateFee(200_000, GasPrice.fromString("0.025atest")); + +const result = await client.sendTokens(address, recipient, amount, fee); console.info("Transaction hash:", result.transactionHash); client.disconnect(); diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx index 4faee8fa5..909028b6d 100644 --- a/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx @@ -10,10 +10,12 @@ CosmJS with them. ## Background -Standard Cosmos chains use `secp256k1` keys with SHA-256 hashing for address -derivation and transaction signing. EVM-compatible Cosmos chains use the same -elliptic curve (secp256k1), but follow Ethereum conventions for hashing and -address derivation — specifically **Keccak-256** instead of SHA-256/RIPEMD-160. +Standard Cosmos chains use `secp256k1` keys, derive addresses as +`RIPEMD-160(SHA-256(compressedPubkey))`, and hash the sign doc with SHA-256 +before producing an ECDSA signature. EVM-compatible Cosmos chains use the same +elliptic curve (secp256k1) but follow Ethereum conventions: addresses come from +the last 20 bytes of `Keccak-256(uncompressedPubkey[1:])`, and the sign doc is +hashed with **Keccak-256** instead of SHA-256. This means: diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx index 5c1994f46..5b260ac10 100644 --- a/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx @@ -15,7 +15,7 @@ incorrect simulations with EVM wallets. Use explicit `StdFee` values instead of ```typescript -import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { SigningStargateClient, GasPrice, calculateFee } from "@cosmjs/stargate"; import { DirectEthSecp256k1HdWallet } from "@cosmjs/proto-signing"; const wallet = await DirectEthSecp256k1HdWallet.fromMnemonic(mnemonic, { @@ -29,10 +29,14 @@ const client = await SigningStargateClient.connectWithSigner( ); const [{ address }] = await wallet.getAccounts(); + +// Use an explicit StdFee with EVM wallets — see the warning above. +const fee = calculateFee(200_000, GasPrice.fromString("0.025atest")); + const result = await client.sendTokens( address, "cosmos1recipient...", [{ denom: "atest", amount: "1000000000000000000" }], - "auto", + fee, ); ``` diff --git a/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx b/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx index ec6343c4b..59502c99d 100644 --- a/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx +++ b/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx @@ -31,7 +31,7 @@ import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; try { const wallet = await DirectSecp256k1HdWallet.fromMnemonic("invalid words here"); } catch (error) { - // Error from @scure/bip39: "invalid mnemonic" + // BIP-39 validation error from EnglishMnemonic (@cosmjs/crypto) / @scure/bip39 } ``` diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx index f04367b29..7f5cd4a33 100644 --- a/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx +++ b/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx @@ -64,7 +64,9 @@ const msg: MsgSendEncodeObject = { |------|---------| | `MsgStoreCodeEncodeObject` | `/cosmwasm.wasm.v1.MsgStoreCode` | | `MsgInstantiateContractEncodeObject` | `/cosmwasm.wasm.v1.MsgInstantiateContract` | +| `MsgInstantiateContract2EncodeObject` | `/cosmwasm.wasm.v1.MsgInstantiateContract2` | | `MsgExecuteContractEncodeObject` | `/cosmwasm.wasm.v1.MsgExecuteContract` | | `MsgMigrateContractEncodeObject` | `/cosmwasm.wasm.v1.MsgMigrateContract` | +| `MsgUpdateAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgUpdateAdmin` | | `MsgClearAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgClearAdmin` | | `MsgUpdateAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgUpdateAdmin` | diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx index d869c7d4d..448415751 100644 --- a/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx +++ b/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx @@ -39,8 +39,9 @@ const bytesToSign = makeSignBytes(signDoc); ``` `makeSignBytes` produces the canonical byte representation by encoding the -`SignDoc` with `SignDoc.encode().finish()`. This is what gets hashed (SHA-256) -and signed. +`SignDoc` with `SignDoc.encode().finish()`. Standard `DirectSecp256k1*` wallets +hash this output with **SHA-256** before ECDSA signing; EVM-compatible +`DirectEthSecp256k1*` wallets hash the same bytes with **Keccak-256**. ## AuthInfo diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx index 64a2b6908..2766385f0 100644 --- a/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx +++ b/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx @@ -109,7 +109,7 @@ When you call `signAndBroadcast`, this is what happens to your messages: SignDoc | v SignDoc.encode().finish() - signBytes (Uint8Array) --> SHA-256 --> signature + signBytes (Uint8Array) --> SHA-256 (Keccak-256 for EVM wallets) --> signature ``` ## Next Steps diff --git a/cosmjs/v0.38.x/concepts/transactions/advanced.mdx b/cosmjs/v0.38.x/concepts/transactions/advanced.mdx index 508970266..b1f85da40 100644 --- a/cosmjs/v0.38.x/concepts/transactions/advanced.mdx +++ b/cosmjs/v0.38.x/concepts/transactions/advanced.mdx @@ -33,6 +33,7 @@ You can decode a signed transaction to inspect its contents: ```typescript import { decodeTxRaw } from "@cosmjs/proto-signing"; +import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; const txRaw = await client.sign(address, messages, fee, "memo"); const txBytes = TxRaw.encode(txRaw).finish(); diff --git a/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx b/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx index 31b14a216..dc7abbe6d 100644 --- a/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx +++ b/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx @@ -9,10 +9,15 @@ has custom modules with their own message types, you need to register them. ## Registering Custom Types ```typescript -import { Registry } from "@cosmjs/proto-signing"; +import { DirectSecp256k1HdWallet, Registry } from "@cosmjs/proto-signing"; import { defaultRegistryTypes, SigningStargateClient, GasPrice } from "@cosmjs/stargate"; import { MsgCreatePost } from "./generated/blog/tx"; +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "cosmos", +}); +const [{ address }] = await wallet.getAccounts(); + const registry = new Registry(defaultRegistryTypes); registry.register("/blog.v1.MsgCreatePost", MsgCreatePost); @@ -71,3 +76,5 @@ const client = await SigningStargateClient.connectWithSigner( { registry, aminoTypes, gasPrice: GasPrice.fromString("0.025utoken") }, ); ``` + +Reuse the `registry` built in the previous section (or create a fresh `Registry(defaultRegistryTypes)` and register your custom protobuf type on it) when passing this to `connectWithSigner`. diff --git a/cosmjs/v0.38.x/concepts/transactions/direct-vs-amino.mdx b/cosmjs/v0.38.x/concepts/transactions/direct-vs-amino.mdx index 6d95220a5..c40949400 100644 --- a/cosmjs/v0.38.x/concepts/transactions/direct-vs-amino.mdx +++ b/cosmjs/v0.38.x/concepts/transactions/direct-vs-amino.mdx @@ -16,6 +16,8 @@ types. - Interface: `OfflineDirectSigner` (has `signDirect` method) - Sign mode: `SIGN_MODE_DIRECT` +EVM-compatible direct wallets (`DirectEthSecp256k1HdWallet`, `DirectEthSecp256k1Wallet`) use the same Direct sign doc and the same `SIGN_MODE_DIRECT`, but hash the serialized bytes with **Keccak-256** before signing to follow Ethereum conventions. + ## Amino (JSON) The legacy format. The transaction is serialized as deterministic JSON (sorted diff --git a/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx b/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx index 183274861..39fce6b17 100644 --- a/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx +++ b/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx @@ -66,8 +66,9 @@ const txHash = await client.signAndBroadcastSync( ## sign -Signs without broadcasting. Returns the raw signed transaction bytes (`TxRaw`) -that you can broadcast later or inspect: +Signs without broadcasting. Returns a `TxRaw` protobuf object — call +`TxRaw.encode(txRaw).finish()` to serialize it into bytes that you can +broadcast later or inspect: ```typescript import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; diff --git a/cosmjs/v0.38.x/guides/connect/errors.mdx b/cosmjs/v0.38.x/guides/connect/errors.mdx index 1a0606119..fadcbea3a 100644 --- a/cosmjs/v0.38.x/guides/connect/errors.mdx +++ b/cosmjs/v0.38.x/guides/connect/errors.mdx @@ -14,7 +14,8 @@ CosmJS surfaces errors at two levels: transport-level errors from the RPC client | JSON-RPC error response | `Error` with serialized JSON-RPC error object | | HTTP request timeout | `AbortError` from `fetch` (via `AbortSignal.timeout()`) | | WebSocket handshake timeout | `Error("Connection attempt timed out after X ms")` | -| Missing URL protocol | `Error("Endpoint URL is missing a protocol. Expected 'https://' or 'http://'.")` | +| Missing URL protocol (HTTP) | `Error("Endpoint URL is missing a protocol. Expected 'https://' or 'http://'.")` | +| Missing URL protocol (WebSocket) | `Error("Base URL is missing a protocol. Expected 'ws://' or 'wss://'.")` | ## Broadcast Errors diff --git a/cosmjs/v0.38.x/guides/query/transactions.mdx b/cosmjs/v0.38.x/guides/query/transactions.mdx index 54109b145..1bc378bb6 100644 --- a/cosmjs/v0.38.x/guides/query/transactions.mdx +++ b/cosmjs/v0.38.x/guides/query/transactions.mdx @@ -24,9 +24,11 @@ if (tx) { ## Search by Events ```typescript -const txs = await client.searchTx("message.sender='cosmos1...'"); +// Raw Tendermint query string +const stringResults = await client.searchTx("message.sender='cosmos1...'"); -const txs = await client.searchTx([ +// Or use the structured SearchPair[] form (see below) +const structuredResults = await client.searchTx([ { key: "message.sender", value: "cosmos1..." }, { key: "message.action", value: "/cosmos.bank.v1beta1.MsgSend" }, ]); @@ -94,12 +96,18 @@ Transaction results include events emitted by Cosmos SDK modules. You can extrac ### From DeliverTxResponse -After broadcasting, use events directly from the response: +After broadcasting with a `SigningStargateClient`, use events directly from the response: ```typescript -import { assertIsDeliverTxSuccess } from "@cosmjs/stargate"; +import { SigningStargateClient, GasPrice, assertIsDeliverTxSuccess } from "@cosmjs/stargate"; -const result = await client.signAndBroadcast(sender, messages, "auto"); +const signingClient = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const result = await signingClient.signAndBroadcast(sender, messages, "auto"); assertIsDeliverTxSuccess(result); for (const event of result.events) { @@ -129,10 +137,19 @@ if (tx) { ### Extracting Contract Addresses (CosmWasm) -After uploading or instantiating a CosmWasm contract, the contract address is in the events. Use the same filtering pattern to extract it: +After uploading or instantiating a CosmWasm contract, the contract address is in the events. Use the same filtering pattern to extract it (broadcast through `SigningCosmWasmClient`): ```typescript -const result = await client.signAndBroadcast(sender, [instantiateMsg], "auto"); +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; +import { GasPrice } from "@cosmjs/stargate"; + +const wasmClient = await SigningCosmWasmClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uosmo") }, +); + +const result = await wasmClient.signAndBroadcast(sender, [instantiateMsg], "auto"); const instantiateEvent = result.events.find((e) => e.type === "instantiate"); const contractAddress = instantiateEvent?.attributes.find( From 109b01945a29ab67ed3c6a6ec71e5fbedbd2e6e8 Mon Sep 17 00:00:00 2001 From: Nur Fikri Date: Fri, 24 Apr 2026 05:15:34 +0700 Subject: [PATCH 17/17] fix: clarify logs reference in CosmJS v0.38.x documentation and remove duplicate entry in encoding concepts --- cosmjs/v0.38.x/api-reference/cosmwasm.mdx | 2 ++ cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cosmjs/v0.38.x/api-reference/cosmwasm.mdx b/cosmjs/v0.38.x/api-reference/cosmwasm.mdx index 1f0e6efee..b35560cfa 100644 --- a/cosmjs/v0.38.x/api-reference/cosmwasm.mdx +++ b/cosmjs/v0.38.x/api-reference/cosmwasm.mdx @@ -193,6 +193,8 @@ interface ContractCodeHistoryEntry { } ``` +In the interfaces below, `logs` refers to the namespace re-exported from `@cosmjs/stargate` (`import { logs } from "@cosmjs/stargate"`), so `logs.Log[]` is the type `logs.Log` array, not a reference to the field of the same name. + ### UploadResult ```typescript diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx index 7f5cd4a33..033454161 100644 --- a/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx +++ b/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx @@ -69,4 +69,3 @@ const msg: MsgSendEncodeObject = { | `MsgMigrateContractEncodeObject` | `/cosmwasm.wasm.v1.MsgMigrateContract` | | `MsgUpdateAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgUpdateAdmin` | | `MsgClearAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgClearAdmin` | -| `MsgUpdateAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgUpdateAdmin` |