From 69f8c903052df8fd822a0073a3c9e1cf579116fe Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Mon, 20 Jan 2025 15:49:40 +0100 Subject: [PATCH 01/33] beets-lst: scaffolding --- projects/beets-lst/.gitignore | 1 + projects/beets-lst/.prettierrc | 6 + projects/beets-lst/README.md | 35 + projects/beets-lst/constants.ts | 3 + projects/beets-lst/functions/example.ts | 48 + projects/beets-lst/functions/index.ts | 1 + projects/beets-lst/index.ts | 9 + projects/beets-lst/package.json | 16 + projects/beets-lst/tools.ts | 28 + projects/beets-lst/yarn.lock | 1084 +++++++++++++++++++++++ 10 files changed, 1231 insertions(+) create mode 100644 projects/beets-lst/.gitignore create mode 100644 projects/beets-lst/.prettierrc create mode 100644 projects/beets-lst/README.md create mode 100644 projects/beets-lst/constants.ts create mode 100644 projects/beets-lst/functions/example.ts create mode 100644 projects/beets-lst/functions/index.ts create mode 100644 projects/beets-lst/index.ts create mode 100644 projects/beets-lst/package.json create mode 100644 projects/beets-lst/tools.ts create mode 100644 projects/beets-lst/yarn.lock diff --git a/projects/beets-lst/.gitignore b/projects/beets-lst/.gitignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/projects/beets-lst/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/projects/beets-lst/.prettierrc b/projects/beets-lst/.prettierrc new file mode 100644 index 00000000..db347c2e --- /dev/null +++ b/projects/beets-lst/.prettierrc @@ -0,0 +1,6 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "tabWidth": 4, + "printWidth": 180 +} diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md new file mode 100644 index 00000000..3fbca4a9 --- /dev/null +++ b/projects/beets-lst/README.md @@ -0,0 +1,35 @@ +# beets-lst + +Integration with beets.fi Sonic liquid staking module (stS) + +## Supported Networks + +- SONIC + +## Common Tasks + +1. Basic Operations + - "Execute example operation with 100 USDT in @beets-lst on Ethereum network" + - "Run example transaction with 50 USDC in @beets-lst" + - "Perform example action with 1000 tokens in @beets-lst" + +2. Information Queries + - "Show my current status in @beets-lst" + - "Check my balance in @beets-lst" + - "Get example statistics from @beets-lst" + - "Calculate expected results for my position in @beets-lst" + + +## Available Functions + +List of available functions will be added here. + +## Installation + +```bash +yarn add @heyanon/beets-lst +``` + +## Usage + +Example usage will be added here. diff --git a/projects/beets-lst/constants.ts b/projects/beets-lst/constants.ts new file mode 100644 index 00000000..a4890683 --- /dev/null +++ b/projects/beets-lst/constants.ts @@ -0,0 +1,3 @@ +import { ChainId } from '@heyanon/sdk'; + +export const supportedChains = [ChainId.SONIC]; diff --git a/projects/beets-lst/functions/example.ts b/projects/beets-lst/functions/example.ts new file mode 100644 index 00000000..178f7056 --- /dev/null +++ b/projects/beets-lst/functions/example.ts @@ -0,0 +1,48 @@ +import { Address, parseUnits } from 'viem'; +import { FunctionReturn, FunctionOptions, TransactionParams, toResult, getChainFromName, checkToApprove } from '@heyanon/sdk'; +import { supportedChains } from '../constants'; + +interface Props { + chainName: string; + account: Address; + amount: string; +} + +/** + * Example function that demonstrates protocol interaction pattern. + * @param props - The function parameters + * @param tools - System tools for blockchain interactions + * @returns Transaction result + */ +export async function example({ chainName, account, amount }: Props, { sendTransactions, notify }: FunctionOptions): Promise { + // Check wallet connection + if (!account) return toResult('Wallet not connected', true); + + // Validate chain + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Protocol is not supported on ${chainName}`, true); + + // Validate amount + const amountInWei = parseUnits(amount, 18); + if (amountInWei === 0n) return toResult('Amount must be greater than 0', true); + + await notify('Preparing example transaction...'); + + const transactions: TransactionParams[] = []; + + // Example transaction + const tx: TransactionParams = { + target: '0x...', // Protocol contract address + data: '0x...', // Encoded function call + }; + transactions.push(tx); + + await notify('Waiting for transaction confirmation...'); + + // Sign and send transaction + const result = await sendTransactions({ chainId, account, transactions }); + const message = result.data[result.data.length - 1]; + + return toResult(result.isMultisig ? message.message : `Successfully executed example with ${amount} tokens. ${message.message}`); +} diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts new file mode 100644 index 00000000..7594efef --- /dev/null +++ b/projects/beets-lst/functions/index.ts @@ -0,0 +1 @@ +export { example } from './example'; diff --git a/projects/beets-lst/index.ts b/projects/beets-lst/index.ts new file mode 100644 index 00000000..698779f9 --- /dev/null +++ b/projects/beets-lst/index.ts @@ -0,0 +1,9 @@ +import { AdapterExport } from '@heyanon/sdk''; +import { tools } from './tools'; +import * as functions from './functions'; + +export default { + tools, + functions, + description: 'Integration with beets.fi Sonic liquid staking module (stS)', +} satisfies AdapterExport; diff --git a/projects/beets-lst/package.json b/projects/beets-lst/package.json new file mode 100644 index 00000000..5065df8a --- /dev/null +++ b/projects/beets-lst/package.json @@ -0,0 +1,16 @@ +{ + "name": "@projects/beets-lst", + "version": "1.0.0", + "scripts": { + "yarn": "yarn install" + }, + "dependencies": { + "@heyanon/sdk": "^1.0.4" + }, + "license": "MIT", + "engines": { + "npm": "please-use-yarn", + "node": ">=18.x", + "yarn": ">=1.22" + } +} diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts new file mode 100644 index 00000000..947818bb --- /dev/null +++ b/projects/beets-lst/tools.ts @@ -0,0 +1,28 @@ +import { AiTool, getChainName } from '@heyanon/sdk'; +import { supportedChains } from './constants'; + +export const tools: AiTool[] = [ + { + name: 'example', + description: 'Example function that demonstrates how to interact with the protocol. It shows basic transaction flow, including checking balances, preparing transaction data, and handling approvals if needed.', + required: ['chainName', 'account', 'amount'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Chain name where to execute the example', + }, + { + name: 'account', + type: 'string', + description: 'Account address that will execute the example', + }, + { + name: 'amount', + type: 'string', + description: 'Amount of tokens for the example in decimal format', + }, + ], + }, +]; diff --git a/projects/beets-lst/yarn.lock b/projects/beets-lst/yarn.lock new file mode 100644 index 00000000..d86f904f --- /dev/null +++ b/projects/beets-lst/yarn.lock @@ -0,0 +1,1084 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adraffy/ens-normalize@^1.10.1": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" + integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== + +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + +"@heyanon/sdk@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@heyanon/sdk/-/sdk-1.0.4.tgz#97c74d7b4c3c189acd1fda923f3e5dc141c680cc" + integrity sha512-OWWOjbKeUqCIlNQJy7R2ixVxL+1kFTM7gbvN4THArVyMw7bMif4iIk+ZCaeVKkKSBXtoVh7u03PzX10dPcLzVg== + dependencies: + "@real-wagmi/sdk" "^1.4.5" + viem "^2.22.7" + vitest "^2.1.8" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@noble/curves@1.7.0", "@noble/curves@~1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.7.0.tgz#0512360622439256df892f21d25b388f52505e45" + integrity sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw== + dependencies: + "@noble/hashes" "1.6.0" + +"@noble/curves@^1.6.0", "@noble/curves@~1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.1.tgz#19bc3970e205c99e4bdb1c64a4785706bce497ff" + integrity sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ== + dependencies: + "@noble/hashes" "1.7.1" + +"@noble/hashes@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.0.tgz#d4bfb516ad6e7b5111c216a5cc7075f4cf19e6c5" + integrity sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ== + +"@noble/hashes@1.6.1", "@noble/hashes@~1.6.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" + integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== + +"@noble/hashes@1.7.1", "@noble/hashes@^1.5.0", "@noble/hashes@~1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.1.tgz#5738f6d765710921e7a751e00c20ae091ed8db0f" + integrity sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ== + +"@real-wagmi/sdk@^1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@real-wagmi/sdk/-/sdk-1.4.5.tgz#967bc7494934241941eb45de6eab0b92d610bc1d" + integrity sha512-IfCA86jWWswli86yBPK194IzuMDLBGkuKSvHNjW9xTmlhAKP9lOGD26W6Z50zLMokv0WfxqoH69KS2Z/kOFecA== + dependencies: + "@uniswap/token-lists" "1.0.0-beta.33" + big.js "^6.2.1" + decimal.js-light "^2.5.1" + tiny-invariant "^1.3.1" + toformat "^2.0.0" + viem "^2.7.20" + vitest "^1.3.1" + +"@rollup/rollup-android-arm-eabi@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz#d4dd60da0075a6ce9a6c76d71b8204f3e1822285" + integrity sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA== + +"@rollup/rollup-android-arm64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz#25c4d33259a7a2ccd2f52a5ffcc0bb3ab3f0729d" + integrity sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g== + +"@rollup/rollup-darwin-arm64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz#d137dff254b19163a6b52ac083a71cd055dae844" + integrity sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g== + +"@rollup/rollup-darwin-x64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz#58ff20b5dacb797d3adca19f02a21c532f9d55bf" + integrity sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ== + +"@rollup/rollup-freebsd-arm64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz#96ce1a241c591ec3e068f4af765d94eddb24e60c" + integrity sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew== + +"@rollup/rollup-freebsd-x64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz#e59e7ede505be41f0b4311b0b943f8eb44938467" + integrity sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA== + +"@rollup/rollup-linux-arm-gnueabihf@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz#e455ca6e4ff35bd46d62201c153352e717000a7b" + integrity sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw== + +"@rollup/rollup-linux-arm-musleabihf@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz#bc1a93d807d19e70b1e343a5bfea43723bcd6327" + integrity sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg== + +"@rollup/rollup-linux-arm64-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz#f38bf843f1dc3d5de680caf31084008846e3efae" + integrity sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA== + +"@rollup/rollup-linux-arm64-musl@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz#b3987a96c18b7287129cf735be2dbf83e94d9d05" + integrity sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g== + +"@rollup/rollup-linux-loongarch64-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz#0f0324044e71c4f02e9f49e7ec4e347b655b34ee" + integrity sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz#809479f27f1fd5b4eecd2aa732132ad952d454ba" + integrity sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ== + +"@rollup/rollup-linux-riscv64-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz#7bc75c4f22db04d3c972f83431739cfa41c6a36e" + integrity sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw== + +"@rollup/rollup-linux-s390x-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz#cfe8052345c55864d83ae343362cf1912480170e" + integrity sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ== + +"@rollup/rollup-linux-x64-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz#c6b048f1e25f3fea5b4bd246232f4d07a159c5a0" + integrity sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g== + +"@rollup/rollup-linux-x64-musl@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz#615273ac52d1a201f4de191cbd3389016a9d7d80" + integrity sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA== + +"@rollup/rollup-win32-arm64-msvc@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz#32ed85810c1b831c648eca999d68f01255b30691" + integrity sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw== + +"@rollup/rollup-win32-ia32-msvc@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz#d47effada68bcbfdccd30c4a788d42e4542ff4d3" + integrity sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ== + +"@rollup/rollup-win32-x64-msvc@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz#7a2d89a82cf0388d60304964217dd7beac6de645" + integrity sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw== + +"@scure/base@~1.2.1", "@scure/base@~1.2.2", "@scure/base@~1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.4.tgz#002eb571a35d69bdb4c214d0995dff76a8dcd2a9" + integrity sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ== + +"@scure/bip32@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.6.0.tgz#6dbc6b4af7c9101b351f41231a879d8da47e0891" + integrity sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA== + dependencies: + "@noble/curves" "~1.7.0" + "@noble/hashes" "~1.6.0" + "@scure/base" "~1.2.1" + +"@scure/bip32@^1.5.0": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.6.2.tgz#093caa94961619927659ed0e711a6e4bf35bffd0" + integrity sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw== + dependencies: + "@noble/curves" "~1.8.1" + "@noble/hashes" "~1.7.1" + "@scure/base" "~1.2.2" + +"@scure/bip39@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.5.0.tgz#c8f9533dbd787641b047984356531d84485f19be" + integrity sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A== + dependencies: + "@noble/hashes" "~1.6.0" + "@scure/base" "~1.2.1" + +"@scure/bip39@^1.4.0": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.5.4.tgz#07fd920423aa671be4540d59bdd344cc1461db51" + integrity sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA== + dependencies: + "@noble/hashes" "~1.7.1" + "@scure/base" "~1.2.4" + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@types/estree@1.0.6", "@types/estree@^1.0.0": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@uniswap/token-lists@1.0.0-beta.33": + version "1.0.0-beta.33" + resolved "https://registry.yarnpkg.com/@uniswap/token-lists/-/token-lists-1.0.0-beta.33.tgz#966ba96c9ccc8f0e9e09809890b438203f2b1911" + integrity sha512-JQkXcpRI3jFG8y3/CGC4TS8NkDgcxXaOQuYW8Qdvd6DcDiIyg2vVYCG9igFEzF0G6UvxgHkBKC7cWCgzZNYvQg== + +"@vitest/expect@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.6.0.tgz#0b3ba0914f738508464983f4d811bc122b51fb30" + integrity sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ== + dependencies: + "@vitest/spy" "1.6.0" + "@vitest/utils" "1.6.0" + chai "^4.3.10" + +"@vitest/expect@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.8.tgz#13fad0e8d5a0bf0feb675dcf1d1f1a36a1773bc1" + integrity sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw== + dependencies: + "@vitest/spy" "2.1.8" + "@vitest/utils" "2.1.8" + chai "^5.1.2" + tinyrainbow "^1.2.0" + +"@vitest/mocker@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.8.tgz#51dec42ac244e949d20009249e033e274e323f73" + integrity sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA== + dependencies: + "@vitest/spy" "2.1.8" + estree-walker "^3.0.3" + magic-string "^0.30.12" + +"@vitest/pretty-format@2.1.8", "@vitest/pretty-format@^2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.8.tgz#88f47726e5d0cf4ba873d50c135b02e4395e2bca" + integrity sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ== + dependencies: + tinyrainbow "^1.2.0" + +"@vitest/runner@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.6.0.tgz#a6de49a96cb33b0e3ba0d9064a3e8d6ce2f08825" + integrity sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg== + dependencies: + "@vitest/utils" "1.6.0" + p-limit "^5.0.0" + pathe "^1.1.1" + +"@vitest/runner@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.8.tgz#b0e2dd29ca49c25e9323ea2a45a5125d8729759f" + integrity sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg== + dependencies: + "@vitest/utils" "2.1.8" + pathe "^1.1.2" + +"@vitest/snapshot@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.6.0.tgz#deb7e4498a5299c1198136f56e6e0f692e6af470" + integrity sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ== + dependencies: + magic-string "^0.30.5" + pathe "^1.1.1" + pretty-format "^29.7.0" + +"@vitest/snapshot@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.8.tgz#d5dc204f4b95dc8b5e468b455dfc99000047d2de" + integrity sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg== + dependencies: + "@vitest/pretty-format" "2.1.8" + magic-string "^0.30.12" + pathe "^1.1.2" + +"@vitest/spy@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.6.0.tgz#362cbd42ccdb03f1613798fde99799649516906d" + integrity sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw== + dependencies: + tinyspy "^2.2.0" + +"@vitest/spy@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.8.tgz#bc41af3e1e6a41ae3b67e51f09724136b88fa447" + integrity sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg== + dependencies: + tinyspy "^3.0.2" + +"@vitest/utils@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.6.0.tgz#5c5675ca7d6f546a7b4337de9ae882e6c57896a1" + integrity sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw== + dependencies: + diff-sequences "^29.6.3" + estree-walker "^3.0.3" + loupe "^2.3.7" + pretty-format "^29.7.0" + +"@vitest/utils@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.8.tgz#f8ef85525f3362ebd37fd25d268745108d6ae388" + integrity sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA== + dependencies: + "@vitest/pretty-format" "2.1.8" + loupe "^3.1.2" + tinyrainbow "^1.2.0" + +abitype@1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.7.tgz#876a0005d211e1c9132825d45bcee7b46416b284" + integrity sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw== + +abitype@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.8.tgz#3554f28b2e9d6e9f35eb59878193eabd1b9f46ba" + integrity sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg== + +acorn-walk@^8.3.2: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.14.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + +big.js@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.2.tgz#be3bb9ac834558b53b099deef2a1d06ac6368e1a" + integrity sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ== + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +chai@^4.3.10: + version "4.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.1.0" + +chai@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.2.tgz#3afbc340b994ae3610ca519a6c70ace77ad4378d" + integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + +confbox@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" + integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== + +cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^4.3.4, debug@^4.3.7: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +decimal.js-light@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + +deep-eql@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== + dependencies: + type-detect "^4.0.0" + +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +es-module-lexer@^1.5.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" + integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== + +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +estree-walker@^3.0.3: + 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" + +eventemitter3@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + +expect-type@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" + integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isows@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.6.tgz#0da29d706fa51551c663c627ace42769850f86e7" + integrity sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw== + +js-tokens@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" + integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== + +local-pkg@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.1.tgz#69658638d2a95287534d4c2fff757980100dbb6d" + integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ== + dependencies: + mlly "^1.7.3" + pkg-types "^1.2.1" + +loupe@^2.3.6, loupe@^2.3.7: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +loupe@^3.1.0, loupe@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" + integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== + +magic-string@^0.30.12, magic-string@^0.30.5: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mlly@^1.7.3, mlly@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f" + integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw== + dependencies: + acorn "^8.14.0" + pathe "^2.0.1" + pkg-types "^1.3.0" + ufo "^1.5.4" + +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== + +nanoid@^3.3.8: + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== + +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +ox@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/ox/-/ox-0.6.5.tgz#e6506a589bd6af9b5fecfcb2c641b63c9882edb6" + integrity sha512-vmnH8KvMDwFZDbNY1mq2CBRBWIgSliZB/dFV0xKp+DfF/dJkTENt6nmA+DzHSSAgL/GO2ydjkXWvlndJgSY4KQ== + dependencies: + "@adraffy/ens-normalize" "^1.10.1" + "@noble/curves" "^1.6.0" + "@noble/hashes" "^1.5.0" + "@scure/bip32" "^1.5.0" + "@scure/bip39" "^1.4.0" + abitype "^1.0.6" + eventemitter3 "5.0.1" + +p-limit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" + integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== + dependencies: + yocto-queue "^1.0.0" + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +pathe@^1.1.1, pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + +pathe@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.2.tgz#5ed86644376915b3c7ee4d00ac8c348d671da3a5" + integrity sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== + +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== + +pkg-types@^1.2.1, pkg-types@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" + integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== + dependencies: + confbox "^0.1.8" + mlly "^1.7.4" + pathe "^2.0.1" + +postcss@^8.4.43: + version "8.5.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" + integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== + dependencies: + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +react-is@^18.0.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +rollup@^4.20.0: + version "4.31.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.31.0.tgz#b84af969a0292cb047dce2c0ec5413a9457597a4" + integrity sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.31.0" + "@rollup/rollup-android-arm64" "4.31.0" + "@rollup/rollup-darwin-arm64" "4.31.0" + "@rollup/rollup-darwin-x64" "4.31.0" + "@rollup/rollup-freebsd-arm64" "4.31.0" + "@rollup/rollup-freebsd-x64" "4.31.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.31.0" + "@rollup/rollup-linux-arm-musleabihf" "4.31.0" + "@rollup/rollup-linux-arm64-gnu" "4.31.0" + "@rollup/rollup-linux-arm64-musl" "4.31.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.31.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.31.0" + "@rollup/rollup-linux-riscv64-gnu" "4.31.0" + "@rollup/rollup-linux-s390x-gnu" "4.31.0" + "@rollup/rollup-linux-x64-gnu" "4.31.0" + "@rollup/rollup-linux-x64-musl" "4.31.0" + "@rollup/rollup-win32-arm64-msvc" "4.31.0" + "@rollup/rollup-win32-ia32-msvc" "4.31.0" + "@rollup/rollup-win32-x64-msvc" "4.31.0" + fsevents "~2.3.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + +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== + +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== + +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +std-env@^3.5.0, std-env@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.8.0.tgz#b56ffc1baf1a29dcc80a3bdf11d7fca7c315e7d5" + integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-literal@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.1.tgz#26906e65f606d49f748454a08084e94190c2e5ad" + integrity sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q== + dependencies: + js-tokens "^9.0.1" + +tiny-invariant@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + +tinybench@^2.5.1, tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinypool@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.4.tgz#e217fe1270d941b39e98c625dcecebb1408c9aa8" + integrity sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== + +tinypool@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.2.tgz#706193cc532f4c100f66aa00b01c42173d9051b2" + integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== + +tinyrainbow@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== + +tinyspy@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" + integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== + +tinyspy@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" + integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== + +toformat@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/toformat/-/toformat-2.0.0.tgz#7a043fd2dfbe9021a4e36e508835ba32056739d8" + integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== + +type-detect@^4.0.0, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + +ufo@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" + integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== + +viem@^2.22.7, viem@^2.7.20: + version "2.22.10" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.22.10.tgz#64fdfdc6ded7e9f372da0caf30f781aca517b24a" + integrity sha512-amYq+bxD3k9gUx4JXzKtpKrnw1Mc3f4s32g6Axo8twpum+47r+9M2g+qh63gzrs0goTTVUsmg3n9ev+zELKRDw== + dependencies: + "@noble/curves" "1.7.0" + "@noble/hashes" "1.6.1" + "@scure/bip32" "1.6.0" + "@scure/bip39" "1.5.0" + abitype "1.0.7" + isows "1.0.6" + ox "0.6.5" + ws "8.18.0" + +vite-node@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.0.tgz#2c7e61129bfecc759478fa592754fd9704aaba7f" + integrity sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw== + dependencies: + cac "^6.7.14" + debug "^4.3.4" + pathe "^1.1.1" + picocolors "^1.0.0" + vite "^5.0.0" + +vite-node@2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.8.tgz#9495ca17652f6f7f95ca7c4b568a235e0c8dbac5" + integrity sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg== + dependencies: + cac "^6.7.14" + debug "^4.3.7" + es-module-lexer "^1.5.4" + pathe "^1.1.2" + vite "^5.0.0" + +vite@^5.0.0: + version "5.4.12" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.12.tgz#627d12ff06de3942557dfe8632fd712a12a072c7" + integrity sha512-KwUaKB27TvWwDJr1GjjWthLMATbGEbeWYZIbGZ5qFIsgPP3vWzLu4cVooqhm5/Z2SPDUMjyPVjTztm5tYKwQxA== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^1.3.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.0.tgz#9d5ad4752a3c451be919e412c597126cffb9892f" + integrity sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA== + dependencies: + "@vitest/expect" "1.6.0" + "@vitest/runner" "1.6.0" + "@vitest/snapshot" "1.6.0" + "@vitest/spy" "1.6.0" + "@vitest/utils" "1.6.0" + acorn-walk "^8.3.2" + chai "^4.3.10" + debug "^4.3.4" + execa "^8.0.1" + local-pkg "^0.5.0" + magic-string "^0.30.5" + pathe "^1.1.1" + picocolors "^1.0.0" + std-env "^3.5.0" + strip-literal "^2.0.0" + tinybench "^2.5.1" + tinypool "^0.8.3" + vite "^5.0.0" + vite-node "1.6.0" + why-is-node-running "^2.2.2" + +vitest@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.8.tgz#2e6a00bc24833574d535c96d6602fb64163092fa" + integrity sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ== + dependencies: + "@vitest/expect" "2.1.8" + "@vitest/mocker" "2.1.8" + "@vitest/pretty-format" "^2.1.8" + "@vitest/runner" "2.1.8" + "@vitest/snapshot" "2.1.8" + "@vitest/spy" "2.1.8" + "@vitest/utils" "2.1.8" + chai "^5.1.2" + debug "^4.3.7" + expect-type "^1.1.0" + magic-string "^0.30.12" + pathe "^1.1.2" + std-env "^3.8.0" + tinybench "^2.9.0" + tinyexec "^0.3.1" + tinypool "^1.0.1" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-node "2.1.8" + why-is-node-running "^2.3.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +why-is-node-running@^2.2.2, why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + +ws@8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +yocto-queue@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" + integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== From 3f2189b5fa76aed05a31af3fedce1f3e03093037 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Mon, 20 Jan 2025 18:40:33 +0100 Subject: [PATCH 02/33] feat: beets-lst stake function --- projects/beets-lst/.gitignore | 1 + projects/beets-lst/README.md | 25 +- projects/beets-lst/abis/index.ts | 1 + projects/beets-lst/abis/stsAbi.ts | 2319 +++++++++++++++++ projects/beets-lst/constants.ts | 2 + projects/beets-lst/functions/example.ts | 48 - .../beets-lst/functions/getStakedBalance.ts | 26 + projects/beets-lst/functions/index.ts | 3 +- projects/beets-lst/functions/stake.ts | 45 + projects/beets-lst/index.ts | 4 +- projects/beets-lst/package.json | 3 + projects/beets-lst/tools.ts | 26 +- projects/beets-lst/yarn.lock | 5 + 13 files changed, 2444 insertions(+), 64 deletions(-) create mode 100644 projects/beets-lst/abis/index.ts create mode 100644 projects/beets-lst/abis/stsAbi.ts delete mode 100644 projects/beets-lst/functions/example.ts create mode 100644 projects/beets-lst/functions/getStakedBalance.ts create mode 100644 projects/beets-lst/functions/stake.ts diff --git a/projects/beets-lst/.gitignore b/projects/beets-lst/.gitignore index 3c3629e6..55371e5c 100644 --- a/projects/beets-lst/.gitignore +++ b/projects/beets-lst/.gitignore @@ -1 +1,2 @@ node_modules +.vscode \ No newline at end of file diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index 3fbca4a9..333cea78 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -1,6 +1,6 @@ # beets-lst -Integration with beets.fi Sonic liquid staking module (stS) +Integration with beets.fi Sonic liquid staking module (stS). The integration supports staking S into stS and unstaking back to S. The unstaking is a 2-step process: first undelegate, then claim Sonic after 14 days. ## Supported Networks @@ -9,16 +9,15 @@ Integration with beets.fi Sonic liquid staking module (stS) ## Common Tasks 1. Basic Operations - - "Execute example operation with 100 USDT in @beets-lst on Ethereum network" - - "Run example transaction with 50 USDC in @beets-lst" - - "Perform example action with 1000 tokens in @beets-lst" -2. Information Queries - - "Show my current status in @beets-lst" - - "Check my balance in @beets-lst" - - "Get example statistics from @beets-lst" - - "Calculate expected results for my position in @beets-lst" + - "Stake 100 S in @beets-lst" + - "Unstake 100 stS from @beets-lst" + - "Unstake all of my stS from @beets-lst" + - "Withdraw all of my stS from @beets-lst" +2. Information Queries + - "Get my stS balance in @beets-lst" + - "How long before I can withdraw S from @beets-lst?" ## Available Functions @@ -33,3 +32,11 @@ yarn add @heyanon/beets-lst ## Usage Example usage will be added here. + +## Contracts and transactions + +- Liquid staking contract: https://sonicscan.org/address/0xe5da20f15420ad15de0fa650600afc998bbe3955 +- Stake Sonic (`deposit`): https://sonicscan.org/tx/0x19545670b77c9ab7e1eabdab292c1aa9d0abd6e11777ab3147f343cb900c728b +- Initiate unstake (`undelegateMany`): https://sonicscan.org/tx/0xb64c4fd6ae4667a3b7ce9d6ba9679fbd2c591173a0895a5616adc3b039b10c27 +- Withdraw Sonic (`withdraw`): https://sonicscan.org/tx/0xb93b07384ccbace4236d07fac46874039821c84707f69fbee101e9ae5506f470 +- Claim rewards (`claimRewards`): https://sonicscan.org/tx/0xf46de5d07b1feeaf132e58ae0a87075a2cf9308698ab4837c76c0a2b7dd62aa5 diff --git a/projects/beets-lst/abis/index.ts b/projects/beets-lst/abis/index.ts new file mode 100644 index 00000000..e8ad8809 --- /dev/null +++ b/projects/beets-lst/abis/index.ts @@ -0,0 +1 @@ +export * from './stsAbi'; diff --git a/projects/beets-lst/abis/stsAbi.ts b/projects/beets-lst/abis/stsAbi.ts new file mode 100644 index 00000000..da9b47f8 --- /dev/null +++ b/projects/beets-lst/abis/stsAbi.ts @@ -0,0 +1,2319 @@ +export const stsAbi = [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor" + }, + { + inputs: [], + name: "AccessControlBadConfirmation", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address" + }, + { + internalType: "bytes32", + name: "neededRole", + type: "bytes32" + } + ], + name: "AccessControlUnauthorizedAccount", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "target", + type: "address" + } + ], + name: "AddressEmptyCode", + type: "error" + }, + { + inputs: [], + name: "ArrayLengthMismatch", + type: "error" + }, + { + inputs: [], + name: "DelegateAmountCannotBeZero", + type: "error" + }, + { + inputs: [], + name: "DepositPaused", + type: "error" + }, + { + inputs: [], + name: "DepositTooSmall", + type: "error" + }, + { + inputs: [], + name: "DonationAmountCannotBeZero", + type: "error" + }, + { + inputs: [], + name: "DonationAmountTooSmall", + type: "error" + }, + { + inputs: [], + name: "ECDSAInvalidSignature", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "length", + type: "uint256" + } + ], + name: "ECDSAInvalidSignatureLength", + type: "error" + }, + { + inputs: [ + { + internalType: "bytes32", + name: "s", + type: "bytes32" + } + ], + name: "ECDSAInvalidSignatureS", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address" + } + ], + name: "ERC1967InvalidImplementation", + type: "error" + }, + { + inputs: [], + name: "ERC1967NonPayable", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address" + }, + { + internalType: "uint256", + name: "allowance", + type: "uint256" + }, + { + internalType: "uint256", + name: "needed", + type: "uint256" + } + ], + name: "ERC20InsufficientAllowance", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address" + }, + { + internalType: "uint256", + name: "balance", + type: "uint256" + }, + { + internalType: "uint256", + name: "needed", + type: "uint256" + } + ], + name: "ERC20InsufficientBalance", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "approver", + type: "address" + } + ], + name: "ERC20InvalidApprover", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "receiver", + type: "address" + } + ], + name: "ERC20InvalidReceiver", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address" + } + ], + name: "ERC20InvalidSender", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address" + } + ], + name: "ERC20InvalidSpender", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "deadline", + type: "uint256" + } + ], + name: "ERC2612ExpiredSignature", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "signer", + type: "address" + }, + { + internalType: "address", + name: "owner", + type: "address" + } + ], + name: "ERC2612InvalidSigner", + type: "error" + }, + { + inputs: [], + name: "FailedCall", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address" + }, + { + internalType: "uint256", + name: "currentNonce", + type: "uint256" + } + ], + name: "InvalidAccountNonce", + type: "error" + }, + { + inputs: [], + name: "InvalidInitialization", + type: "error" + }, + { + inputs: [], + name: "NativeTransferFailed", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "validatorId", + type: "uint256" + } + ], + name: "NoDelegationForValidator", + type: "error" + }, + { + inputs: [], + name: "NotInitializing", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address" + } + ], + name: "OwnableInvalidOwner", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address" + } + ], + name: "OwnableUnauthorizedAccount", + type: "error" + }, + { + inputs: [], + name: "PausedValueDidNotChange", + type: "error" + }, + { + inputs: [], + name: "ProtocolFeeTooHigh", + type: "error" + }, + { + inputs: [], + name: "ProtocolFeeTransferFailed", + type: "error" + }, + { + inputs: [], + name: "ReentrancyGuardReentrantCall", + type: "error" + }, + { + inputs: [], + name: "RewardsClaimedTooSmall", + type: "error" + }, + { + inputs: [], + name: "SFCAddressCannotBeZero", + type: "error" + }, + { + inputs: [], + name: "SenderNotSFC", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "refundRatio", + type: "uint256" + } + ], + name: "SfcSlashMustBeAccepted", + type: "error" + }, + { + inputs: [], + name: "TreasuryAddressCannotBeZero", + type: "error" + }, + { + inputs: [], + name: "UUPSUnauthorizedCallContext", + type: "error" + }, + { + inputs: [ + { + internalType: "bytes32", + name: "slot", + type: "bytes32" + } + ], + name: "UUPSUnsupportedProxiableUUID", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "withdrawId", + type: "uint256" + } + ], + name: "UnauthorizedWithdraw", + type: "error" + }, + { + inputs: [], + name: "UndelegateAmountCannotBeZero", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "validatorId", + type: "uint256" + } + ], + name: "UndelegateAmountExceedsDelegated", + type: "error" + }, + { + inputs: [], + name: "UndelegateAmountExceedsPool", + type: "error" + }, + { + inputs: [], + name: "UndelegateAmountTooSmall", + type: "error" + }, + { + inputs: [], + name: "UndelegateFromPoolPaused", + type: "error" + }, + { + inputs: [], + name: "UndelegatePaused", + type: "error" + }, + { + inputs: [], + name: "UnsupportedWithdrawKind", + type: "error" + }, + { + inputs: [], + name: "UserWithdrawsMaxSizeCannotBeZero", + type: "error" + }, + { + inputs: [], + name: "UserWithdrawsSkipTooLarge", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "withdrawId", + type: "uint256" + } + ], + name: "WithdrawAlreadyProcessed", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "withdrawId", + type: "uint256" + } + ], + name: "WithdrawDelayNotElapsed", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "withdrawId", + type: "uint256" + } + ], + name: "WithdrawIdDoesNotExist", + type: "error" + }, + { + inputs: [], + name: "WithdrawsPaused", + type: "error" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address" + }, + { + indexed: true, + internalType: "address", + name: "spender", + type: "address" + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256" + } + ], + name: "Approval", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "validatorId", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "amountAssets", + type: "uint256" + } + ], + name: "Delegated", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address" + }, + { + indexed: false, + internalType: "bool", + name: "newValue", + type: "bool" + } + ], + name: "DepositPausedUpdated", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "user", + type: "address" + }, + { + indexed: false, + internalType: "uint256", + name: "amountAssets", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "amountShares", + type: "uint256" + } + ], + name: "Deposited", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "user", + type: "address" + }, + { + indexed: false, + internalType: "uint256", + name: "amountAssets", + type: "uint256" + } + ], + name: "Donated", + type: "event" + }, + { + anonymous: false, + inputs: [], + name: "EIP712DomainChanged", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint64", + name: "version", + type: "uint64" + } + ], + name: "Initialized", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "withdrawId", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "amountAssetsWithdrawn", + type: "uint256" + }, + { + indexed: true, + internalType: "bool", + name: "emergency", + type: "bool" + } + ], + name: "OperatorClawBackExecuted", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "withdrawId", + type: "uint256" + }, + { + indexed: true, + internalType: "uint256", + name: "validatorId", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "amountAssets", + type: "uint256" + } + ], + name: "OperatorClawBackInitiated", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address" + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address" + } + ], + name: "OwnershipTransferred", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address" + }, + { + indexed: true, + internalType: "uint256", + name: "newFeeBIPS", + type: "uint256" + } + ], + name: "ProtocolFeeUpdated", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amountClaimed", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "protocolFee", + type: "uint256" + } + ], + name: "RewardsClaimed", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32" + }, + { + indexed: true, + internalType: "bytes32", + name: "previousAdminRole", + type: "bytes32" + }, + { + indexed: true, + internalType: "bytes32", + name: "newAdminRole", + type: "bytes32" + } + ], + name: "RoleAdminChanged", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32" + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address" + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address" + } + ], + name: "RoleGranted", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32" + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address" + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address" + } + ], + name: "RoleRevoked", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address" + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address" + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256" + } + ], + name: "Transfer", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address" + }, + { + indexed: true, + internalType: "address", + name: "newTreasury", + type: "address" + } + ], + name: "TreasuryUpdated", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address" + }, + { + indexed: false, + internalType: "bool", + name: "newValue", + type: "bool" + } + ], + name: "UndelegateFromPoolPausedUpdated", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address" + }, + { + indexed: false, + internalType: "bool", + name: "newValue", + type: "bool" + } + ], + name: "UndelegatePausedUpdated", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "user", + type: "address" + }, + { + indexed: false, + internalType: "uint256", + name: "withdrawId", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "validatorId", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "amountAssets", + type: "uint256" + }, + { + indexed: false, + internalType: "enum SonicStaking.WithdrawKind", + name: "kind", + type: "uint8" + } + ], + name: "Undelegated", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address" + } + ], + name: "Upgraded", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address" + }, + { + indexed: false, + internalType: "uint256", + name: "delay", + type: "uint256" + } + ], + name: "WithdrawDelaySet", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address" + }, + { + indexed: false, + internalType: "bool", + name: "newValue", + type: "bool" + } + ], + name: "WithdrawPausedUpdated", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "user", + type: "address" + }, + { + indexed: false, + internalType: "uint256", + name: "withdrawId", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "amountAssets", + type: "uint256" + }, + { + indexed: false, + internalType: "enum SonicStaking.WithdrawKind", + name: "kind", + type: "uint8" + }, + { + indexed: false, + internalType: "bool", + name: "emergency", + type: "bool" + } + ], + name: "Withdrawn", + type: "event" + }, + { + inputs: [], + name: "CLAIM_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "DEFAULT_ADMIN_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "DOMAIN_SEPARATOR", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "MAX_PROTOCOL_FEE_BIPS", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "MIN_CLAIM_REWARDS_AMOUNT", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "MIN_DEPOSIT", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "MIN_DONATION_AMOUNT", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "MIN_UNDELEGATE_AMOUNT_SHARES", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "OPERATOR_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "SFC", + outputs: [ + { + internalType: "contract ISFC", + name: "", + type: "address" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "UPGRADE_INTERFACE_VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address" + }, + { + internalType: "address", + name: "spender", + type: "address" + } + ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address" + }, + { + internalType: "uint256", + name: "value", + type: "uint256" + } + ], + name: "approve", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address" + } + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "value", + type: "uint256" + } + ], + name: "burn", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address" + }, + { + internalType: "uint256", + name: "value", + type: "uint256" + } + ], + name: "burnFrom", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256[]", + name: "validatorIds", + type: "uint256[]" + } + ], + name: "claimRewards", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "sharesAmount", + type: "uint256" + } + ], + name: "convertToAssets", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "assetAmount", + type: "uint256" + } + ], + name: "convertToShares", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "decimals", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "validatorId", + type: "uint256" + }, + { + internalType: "uint256", + name: "amount", + type: "uint256" + } + ], + name: "delegate", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [], + name: "deposit", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "payable", + type: "function" + }, + { + inputs: [], + name: "depositPaused", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "donate", + outputs: [], + stateMutability: "payable", + type: "function" + }, + { + inputs: [], + name: "eip712Domain", + outputs: [ + { + internalType: "bytes1", + name: "fields", + type: "bytes1" + }, + { + internalType: "string", + name: "name", + type: "string" + }, + { + internalType: "string", + name: "version", + type: "string" + }, + { + internalType: "uint256", + name: "chainId", + type: "uint256" + }, + { + internalType: "address", + name: "verifyingContract", + type: "address" + }, + { + internalType: "bytes32", + name: "salt", + type: "bytes32" + }, + { + internalType: "uint256[]", + name: "extensions", + type: "uint256[]" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "getRate", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32" + } + ], + name: "getRoleAdmin", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address" + }, + { + internalType: "uint256", + name: "skip", + type: "uint256" + }, + { + internalType: "uint256", + name: "maxSize", + type: "uint256" + }, + { + internalType: "bool", + name: "reverseOrder", + type: "bool" + } + ], + name: "getUserWithdraws", + outputs: [ + { + components: [ + { + internalType: "enum SonicStaking.WithdrawKind", + name: "kind", + type: "uint8" + }, + { + internalType: "uint256", + name: "validatorId", + type: "uint256" + }, + { + internalType: "uint256", + name: "assetAmount", + type: "uint256" + }, + { + internalType: "bool", + name: "isWithdrawn", + type: "bool" + }, + { + internalType: "uint256", + name: "requestTimestamp", + type: "uint256" + }, + { + internalType: "address", + name: "user", + type: "address" + } + ], + internalType: "struct SonicStaking.WithdrawRequest[]", + name: "", + type: "tuple[]" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "withdrawId", + type: "uint256" + } + ], + name: "getWithdrawRequest", + outputs: [ + { + components: [ + { + internalType: "enum SonicStaking.WithdrawKind", + name: "kind", + type: "uint8" + }, + { + internalType: "uint256", + name: "validatorId", + type: "uint256" + }, + { + internalType: "uint256", + name: "assetAmount", + type: "uint256" + }, + { + internalType: "bool", + name: "isWithdrawn", + type: "bool" + }, + { + internalType: "uint256", + name: "requestTimestamp", + type: "uint256" + }, + { + internalType: "address", + name: "user", + type: "address" + } + ], + internalType: "struct SonicStaking.WithdrawRequest", + name: "", + type: "tuple" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32" + }, + { + internalType: "address", + name: "account", + type: "address" + } + ], + name: "grantRole", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32" + }, + { + internalType: "address", + name: "account", + type: "address" + } + ], + name: "hasRole", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "contract ISFC", + name: "_sfc", + type: "address" + }, + { + internalType: "address", + name: "_treasury", + type: "address" + } + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address" + } + ], + name: "nonces", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "withdrawId", + type: "uint256" + }, + { + internalType: "bool", + name: "emergency", + type: "bool" + } + ], + name: "operatorExecuteClawBack", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "validatorId", + type: "uint256" + }, + { + internalType: "uint256", + name: "amountAssets", + type: "uint256" + } + ], + name: "operatorInitiateClawBack", + outputs: [ + { + internalType: "uint256", + name: "withdrawId", + type: "uint256" + }, + { + internalType: "uint256", + name: "actualAmountUndelegated", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "pause", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [], + name: "pendingClawBackAmount", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address" + }, + { + internalType: "address", + name: "spender", + type: "address" + }, + { + internalType: "uint256", + name: "value", + type: "uint256" + }, + { + internalType: "uint256", + name: "deadline", + type: "uint256" + }, + { + internalType: "uint8", + name: "v", + type: "uint8" + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32" + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32" + } + ], + name: "permit", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [], + name: "protocolFeeBIPS", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "proxiableUUID", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32" + }, + { + internalType: "address", + name: "callerConfirmation", + type: "address" + } + ], + name: "renounceRole", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32" + }, + { + internalType: "address", + name: "account", + type: "address" + } + ], + name: "revokeRole", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "bool", + name: "newValue", + type: "bool" + } + ], + name: "setDepositPaused", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "newFeeBIPS", + type: "uint256" + } + ], + name: "setProtocolFeeBIPS", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "newTreasury", + type: "address" + } + ], + name: "setTreasury", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "bool", + name: "newValue", + type: "bool" + } + ], + name: "setUndelegateFromPoolPaused", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "bool", + name: "newValue", + type: "bool" + } + ], + name: "setUndelegatePaused", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "delay", + type: "uint256" + } + ], + name: "setWithdrawDelay", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "bool", + name: "newValue", + type: "bool" + } + ], + name: "setWithdrawPaused", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "bytes4", + name: "interfaceId", + type: "bytes4" + } + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "totalAssets", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "totalDelegated", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "totalPool", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address" + }, + { + internalType: "uint256", + name: "value", + type: "uint256" + } + ], + name: "transfer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address" + }, + { + internalType: "address", + name: "to", + type: "address" + }, + { + internalType: "uint256", + name: "value", + type: "uint256" + } + ], + name: "transferFrom", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address" + } + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [], + name: "treasury", + outputs: [ + { + internalType: "address", + name: "", + type: "address" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "validatorId", + type: "uint256" + }, + { + internalType: "uint256", + name: "amountShares", + type: "uint256" + } + ], + name: "undelegate", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "amountShares", + type: "uint256" + } + ], + name: "undelegateFromPool", + outputs: [ + { + internalType: "uint256", + name: "withdrawId", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [], + name: "undelegateFromPoolPaused", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256[]", + name: "validatorIds", + type: "uint256[]" + }, + { + internalType: "uint256[]", + name: "amountShares", + type: "uint256[]" + } + ], + name: "undelegateMany", + outputs: [ + { + internalType: "uint256[]", + name: "withdrawIds", + type: "uint256[]" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [], + name: "undelegatePaused", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "newImplementation", + type: "address" + }, + { + internalType: "bytes", + name: "data", + type: "bytes" + } + ], + name: "upgradeToAndCall", + outputs: [], + stateMutability: "payable", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address" + } + ], + name: "userNumWithdraws", + outputs: [ + { + internalType: "uint256", + name: "numWithdraws", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address" + }, + { + internalType: "uint256", + name: "index", + type: "uint256" + } + ], + name: "userWithdraws", + outputs: [ + { + internalType: "uint256", + name: "withdrawId", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "withdrawId", + type: "uint256" + }, + { + internalType: "bool", + name: "emergency", + type: "bool" + } + ], + name: "withdraw", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [], + name: "withdrawCounter", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "withdrawDelay", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256[]", + name: "withdrawIds", + type: "uint256[]" + }, + { + internalType: "bool", + name: "emergency", + type: "bool" + } + ], + name: "withdrawMany", + outputs: [ + { + internalType: "uint256[]", + name: "amountsWithdrawn", + type: "uint256[]" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [], + name: "withdrawPaused", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool" + } + ], + stateMutability: "view", + type: "function" + }, + { + stateMutability: "payable", + type: "receive" + } +] as const; \ No newline at end of file diff --git a/projects/beets-lst/constants.ts b/projects/beets-lst/constants.ts index a4890683..0ec835c7 100644 --- a/projects/beets-lst/constants.ts +++ b/projects/beets-lst/constants.ts @@ -1,3 +1,5 @@ import { ChainId } from '@heyanon/sdk'; export const supportedChains = [ChainId.SONIC]; + +export const STS_ADDRESS = '0xd5f7fc8ba92756a34693baa386edcc8dd5b3f141'; diff --git a/projects/beets-lst/functions/example.ts b/projects/beets-lst/functions/example.ts deleted file mode 100644 index 178f7056..00000000 --- a/projects/beets-lst/functions/example.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Address, parseUnits } from 'viem'; -import { FunctionReturn, FunctionOptions, TransactionParams, toResult, getChainFromName, checkToApprove } from '@heyanon/sdk'; -import { supportedChains } from '../constants'; - -interface Props { - chainName: string; - account: Address; - amount: string; -} - -/** - * Example function that demonstrates protocol interaction pattern. - * @param props - The function parameters - * @param tools - System tools for blockchain interactions - * @returns Transaction result - */ -export async function example({ chainName, account, amount }: Props, { sendTransactions, notify }: FunctionOptions): Promise { - // Check wallet connection - if (!account) return toResult('Wallet not connected', true); - - // Validate chain - const chainId = getChainFromName(chainName); - if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); - if (!supportedChains.includes(chainId)) return toResult(`Protocol is not supported on ${chainName}`, true); - - // Validate amount - const amountInWei = parseUnits(amount, 18); - if (amountInWei === 0n) return toResult('Amount must be greater than 0', true); - - await notify('Preparing example transaction...'); - - const transactions: TransactionParams[] = []; - - // Example transaction - const tx: TransactionParams = { - target: '0x...', // Protocol contract address - data: '0x...', // Encoded function call - }; - transactions.push(tx); - - await notify('Waiting for transaction confirmation...'); - - // Sign and send transaction - const result = await sendTransactions({ chainId, account, transactions }); - const message = result.data[result.data.length - 1]; - - return toResult(result.isMultisig ? message.message : `Successfully executed example with ${amount} tokens. ${message.message}`); -} diff --git a/projects/beets-lst/functions/getStakedBalance.ts b/projects/beets-lst/functions/getStakedBalance.ts new file mode 100644 index 00000000..81041889 --- /dev/null +++ b/projects/beets-lst/functions/getStakedBalance.ts @@ -0,0 +1,26 @@ +import { Address, formatUnits } from 'viem'; +import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { supportedChains, STS_ADDRESS } from '../constants'; +import { stsAbi } from '../abis'; + +interface Props { + chainName: string; + account: Address; +} + +export async function getStakedBalance({ chainName, account }: Props, { getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const publicClient = getProvider(chainId); + + const balance = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'balanceOf', + args: [account], + }); + + return toResult(`Staked Sonic balance: ${formatUnits(balance, 18)} stS`); +} diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index 7594efef..57857c02 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -1 +1,2 @@ -export { example } from './example'; +export { getStakedBalance } from './getStakedBalance'; +export { stake } from './stake'; diff --git a/projects/beets-lst/functions/stake.ts b/projects/beets-lst/functions/stake.ts new file mode 100644 index 00000000..6b2fdac7 --- /dev/null +++ b/projects/beets-lst/functions/stake.ts @@ -0,0 +1,45 @@ +import { Address, encodeFunctionData, parseUnits } from 'viem'; +import { FunctionReturn, FunctionOptions, TransactionParams, toResult, getChainFromName, checkToApprove } from '@heyanon/sdk'; +import { supportedChains, STS_ADDRESS } from '../constants'; +import { stsAbi } from '../abis'; + +interface Props { + chainName: string; + account: Address; + amount: string; +} +export async function stake({ chainName, account, amount }: Props, { sendTransactions, getProvider, notify }: FunctionOptions): Promise { + if (!account) return toResult('Wallet not connected', true); + + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + await notify('Preparing to stake Sonic tokens (S) in Beets.fi liquid staking module...'); + + const amountInWei = parseUnits(amount, 18); + if (amountInWei === 0n) return toResult('Amount must be greater than 0', true); + + const transactions: TransactionParams[] = []; + + // Prepare stake transaction + const tx: TransactionParams = { + target: STS_ADDRESS, + data: encodeFunctionData({ + abi: stsAbi, + functionName: 'deposit', + args: [], + }), + value: amountInWei, + }; + transactions.push(tx); + + await notify('Waiting for transaction confirmation...'); + + const result = await sendTransactions({ chainId, account, transactions }); + + // TODO: handle output properly + const stakeMessage = result.data[result.data.length - 1]; + + return toResult(result.isMultisig ? stakeMessage.message : `Successfully staked ${amount} S in Beets.fi liquid staking module. ${stakeMessage.message}`); +} diff --git a/projects/beets-lst/index.ts b/projects/beets-lst/index.ts index 698779f9..2f1e16ef 100644 --- a/projects/beets-lst/index.ts +++ b/projects/beets-lst/index.ts @@ -1,9 +1,9 @@ -import { AdapterExport } from '@heyanon/sdk''; +import { AdapterExport } from '@heyanon/sdk'; import { tools } from './tools'; import * as functions from './functions'; export default { tools, functions, - description: 'Integration with beets.fi Sonic liquid staking module (stS)', + description: 'Integration with beets.fi Sonic liquid staking module (stS). The integration supports staking S into stS and unstaking back to S. The unstaking is a 2-step process: first undelegate, then claim Sonic after 14 days.', } satisfies AdapterExport; diff --git a/projects/beets-lst/package.json b/projects/beets-lst/package.json index 5065df8a..e6f6a206 100644 --- a/projects/beets-lst/package.json +++ b/projects/beets-lst/package.json @@ -12,5 +12,8 @@ "npm": "please-use-yarn", "node": ">=18.x", "yarn": ">=1.22" + }, + "devDependencies": { + "prettier": "^3.4.2" } } diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index 947818bb..e9e9bf98 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -3,20 +3,38 @@ import { supportedChains } from './constants'; export const tools: AiTool[] = [ { - name: 'example', - description: 'Example function that demonstrates how to interact with the protocol. It shows basic transaction flow, including checking balances, preparing transaction data, and handling approvals if needed.', + name: 'getStakedBalance', + description: 'Get balance of staked Sonic tokens (stS)', + required: ['chainName', 'account'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Chain name', + }, + { + name: 'account', + type: 'string', + description: 'Account address to check', + }, + ], + }, + { + name: 'stake', + description: 'Stake Sonic tokens (S) and obtain in return staked Sonic tokens (stS)', required: ['chainName', 'account', 'amount'], props: [ { name: 'chainName', type: 'string', enum: supportedChains.map(getChainName), - description: 'Chain name where to execute the example', + description: 'Name of chain where to stake tokens', }, { name: 'account', type: 'string', - description: 'Account address that will execute the example', + description: 'Account address that will stake tokens', }, { name: 'amount', diff --git a/projects/beets-lst/yarn.lock b/projects/beets-lst/yarn.lock index d86f904f..a8a33d6f 100644 --- a/projects/beets-lst/yarn.lock +++ b/projects/beets-lst/yarn.lock @@ -813,6 +813,11 @@ postcss@^8.4.43: picocolors "^1.1.1" source-map-js "^1.2.1" +prettier@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== + pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" From 9f494be3f1c319a535038e66a9c5a7076b56b3ab Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Wed, 22 Jan 2025 18:18:55 +0100 Subject: [PATCH 03/33] feat: unstake function --- projects/beets-lst/functions/index.ts | 1 + projects/beets-lst/functions/stake.ts | 4 ++ projects/beets-lst/functions/unStake.ts | 84 +++++++++++++++++++++++++ projects/beets-lst/helpers/client.ts | 58 +++++++++++++++++ projects/beets-lst/package.json | 3 +- projects/beets-lst/tools.ts | 24 +++++++ projects/beets-lst/yarn.lock | 57 +++++++++++++++++ 7 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 projects/beets-lst/functions/unStake.ts create mode 100644 projects/beets-lst/helpers/client.ts diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index 57857c02..d627206f 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -1,2 +1,3 @@ export { getStakedBalance } from './getStakedBalance'; export { stake } from './stake'; +export { unStake } from './unStake'; diff --git a/projects/beets-lst/functions/stake.ts b/projects/beets-lst/functions/stake.ts index 6b2fdac7..258248f0 100644 --- a/projects/beets-lst/functions/stake.ts +++ b/projects/beets-lst/functions/stake.ts @@ -8,6 +8,10 @@ interface Props { account: Address; amount: string; } + +/** + * Stake Sonic tokens (S) in Beets.fi liquid staking module + */ export async function stake({ chainName, account, amount }: Props, { sendTransactions, getProvider, notify }: FunctionOptions): Promise { if (!account) return toResult('Wallet not connected', true); diff --git a/projects/beets-lst/functions/unStake.ts b/projects/beets-lst/functions/unStake.ts new file mode 100644 index 00000000..f874f842 --- /dev/null +++ b/projects/beets-lst/functions/unStake.ts @@ -0,0 +1,84 @@ +import { Address, encodeFunctionData, parseUnits } from 'viem'; +import { FunctionReturn, FunctionOptions, TransactionParams, toResult, getChainFromName } from '@heyanon/sdk'; +import { supportedChains, STS_ADDRESS } from '../constants'; +import { stsAbi } from '../abis'; +import { fetchValidators, findHighestDelegatedValidator } from '../helpers/client'; + +interface Props { + chainName: string; + account: Address; + amount: string; +} + +/** + * Unstake staked Sonic tokens (stS) + * + * This action will initiate the undelegation of staked Sonic tokens (stS) + * from the Beets.fi liquid staking module, which will take 14 days to complete. + * + * After 14 days, the user will be able to withdraw their Sonic tokens (S) + * using the `withdraw` function. + */ +export async function unStake({ chainName, account, amount }: Props, { sendTransactions, notify, getProvider }: FunctionOptions): Promise { + if (!account) return toResult('Wallet not connected', true); + + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const amountInWei = parseUnits(amount, 18); + if (amountInWei === 0n) return toResult('Amount must be greater than 0', true); + + // Get the public client to read contract data + const publicClient = getProvider(chainId); + + // Convert asset amount to shares amount + const sharesAmount = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'convertToShares', + args: [amountInWei], + }); + + await notify('Fetching staking data...'); + + try { + const validators = await fetchValidators(); + if (!validators.length) { + return toResult('No validators found', true); + } + + const targetValidator = findHighestDelegatedValidator(validators); + + if (BigInt(targetValidator.assetsDelegated) < amountInWei) { + return toResult(`Validator does not have enough staked assets. Maximum available: ${targetValidator.assetsDelegated}`, true); + } + + await notify('Preparing to undelegate Sonic tokens from Beets.fi liquid staking module...'); + + const transactions: TransactionParams[] = []; + const tx: TransactionParams = { + target: STS_ADDRESS, + data: encodeFunctionData({ + abi: stsAbi, + functionName: 'undelegateMany', + args: [ + [BigInt(targetValidator.validatorId)], // validatorIds array + [sharesAmount], // amountShares array - now using converted shares amount + ], + }), + }; + transactions.push(tx); + + await notify('Waiting for transaction confirmation...'); + + const result = await sendTransactions({ chainId, account, transactions }); + return toResult( + result.isMultisig + ? result.data[result.data.length - 1].message + : `Successfully initiated undelegation of ${amount} stS from Beets.fi liquid staking module. You can withdraw your Sonic tokens after 14 days.`, + ); + } catch (error) { + return toResult(`Failed to undelegate: ${error instanceof Error ? error.message : 'Unknown error'}`, true); + } +} diff --git a/projects/beets-lst/helpers/client.ts b/projects/beets-lst/helpers/client.ts new file mode 100644 index 00000000..970c3501 --- /dev/null +++ b/projects/beets-lst/helpers/client.ts @@ -0,0 +1,58 @@ +import axios from 'axios'; + +interface ValidatorData { + validatorId: string; + assetsDelegated: string; +} + +const BEETS_API_URL = 'https://backend-v3.beets-ftm-node.com'; + +/** + * Execute a GraphQL query and return the response as a JSON object. + */ +export async function executeGraphQLQuery(query: string): Promise { + try { + const response = await axios.post(BEETS_API_URL, { query }); + + if (!response.data?.data) { + throw new Error('Invalid response format from API'); + } + + return response.data.data as T; + } catch (error) { + if (axios.isAxiosError(error)) { + throw new Error(`GraphQL query failed: ${error.message}`); + } + throw new Error(`Unexpected error during GraphQL query: ${error instanceof Error ? error.message : 'Unknown error'}`); + } +} + +/** + * Fetch the list of validators from the BEETS API. + */ +export async function fetchValidators(): Promise { + const query = ` + query { + stsGetGqlStakedSonicData { + delegatedValidators { + validatorId + assetsDelegated + } + } + } + `; + + const response = await executeGraphQLQuery<{ + stsGetGqlStakedSonicData: { + delegatedValidators: ValidatorData[]; + }; + }>(query); + return response.stsGetGqlStakedSonicData.delegatedValidators; +} + +/** + * Find the validator with the highest amount of assets delegated. + */ +export function findHighestDelegatedValidator(validators: ValidatorData[]): ValidatorData { + return validators.reduce((max, current) => (BigInt(current.assetsDelegated) > BigInt(max.assetsDelegated) ? current : max)); +} diff --git a/projects/beets-lst/package.json b/projects/beets-lst/package.json index e6f6a206..9f3aa3d9 100644 --- a/projects/beets-lst/package.json +++ b/projects/beets-lst/package.json @@ -5,7 +5,8 @@ "yarn": "yarn install" }, "dependencies": { - "@heyanon/sdk": "^1.0.4" + "@heyanon/sdk": "^1.0.4", + "axios": "^1.7.9" }, "license": "MIT", "engines": { diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index e9e9bf98..642c898a 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -43,4 +43,28 @@ export const tools: AiTool[] = [ }, ], }, + // TODO: check if "unstake all of my stS" works + { + name: 'unStake', + description: 'Initiate undelegation of staked Sonic tokens (stS). Tokens can be withdrawn after 14 days.', + required: ['chainName', 'account', 'amount'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Name of chain where to unstake tokens', + }, + { + name: 'account', + type: 'string', + description: 'Account address that will unstake tokens', + }, + { + name: 'amount', + type: 'string', + description: 'Amount of stS tokens to undelegate in decimal format', + }, + ], + }, ]; diff --git a/projects/beets-lst/yarn.lock b/projects/beets-lst/yarn.lock index a8a33d6f..beeab775 100644 --- a/projects/beets-lst/yarn.lock +++ b/projects/beets-lst/yarn.lock @@ -474,6 +474,20 @@ assertion-error@^2.0.1: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== +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== + +axios@^1.7.9: + version "1.7.9" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.9.tgz#d7d071380c132a24accda1b2cfc1535b79ec650a" + integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + big.js@^6.2.1: version "6.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.2.tgz#be3bb9ac834558b53b099deef2a1d06ac6368e1a" @@ -520,6 +534,13 @@ check-error@^2.1.1: resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== +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" + confbox@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" @@ -558,6 +579,11 @@ deep-eql@^5.0.1: resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== +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== + diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" @@ -629,6 +655,20 @@ expect-type@^1.1.0: resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +form-data@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -701,6 +741,18 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +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: + 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" + mimic-fn@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" @@ -827,6 +879,11 @@ pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" +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== + react-is@^18.0.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" From 3e89e2b8c9e3c5e8f1ab3a206a373e7a26d0d369 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Wed, 22 Jan 2025 20:52:34 +0100 Subject: [PATCH 04/33] test: askBeets script --- projects/beets-lst/.env.example | 4 + projects/beets-lst/.gitignore | 3 +- projects/beets-lst/examples/askBeets.ts | 93 +++++++ projects/beets-lst/examples/run.ts | 22 ++ .../beets-lst/functions/getStakedBalance.ts | 4 +- projects/beets-lst/helpers/openai.ts | 65 +++++ projects/beets-lst/package.json | 9 +- projects/beets-lst/tsconfig.json | 30 +++ projects/beets-lst/yarn.lock | 226 +++++++++++++++++- 9 files changed, 448 insertions(+), 8 deletions(-) create mode 100644 projects/beets-lst/.env.example create mode 100644 projects/beets-lst/examples/askBeets.ts create mode 100644 projects/beets-lst/examples/run.ts create mode 100644 projects/beets-lst/helpers/openai.ts create mode 100644 projects/beets-lst/tsconfig.json diff --git a/projects/beets-lst/.env.example b/projects/beets-lst/.env.example new file mode 100644 index 00000000..3cd84c8c --- /dev/null +++ b/projects/beets-lst/.env.example @@ -0,0 +1,4 @@ +# Variables for running the examples locally + +OPENAI_API_KEY=your_openai_api_key_here +PRIVATE_KEY=your_wallet_private_key_here \ No newline at end of file diff --git a/projects/beets-lst/.gitignore b/projects/beets-lst/.gitignore index 55371e5c..3254652f 100644 --- a/projects/beets-lst/.gitignore +++ b/projects/beets-lst/.gitignore @@ -1,2 +1,3 @@ node_modules -.vscode \ No newline at end of file +.vscode +.env \ No newline at end of file diff --git a/projects/beets-lst/examples/askBeets.ts b/projects/beets-lst/examples/askBeets.ts new file mode 100644 index 00000000..37a54e1e --- /dev/null +++ b/projects/beets-lst/examples/askBeets.ts @@ -0,0 +1,93 @@ +import OpenAI from 'openai'; +import { privateKeyToAccount } from 'viem/accounts'; +import { createPublicClient, http } from 'viem'; +import { sonic } from 'viem/chains'; +import { FunctionOptions, FunctionReturn, toResult } from '@heyanon/sdk'; +import { tools } from '../tools'; +import * as functions from '../functions'; +import util from 'util'; +import { fromHeyAnonToolsToOpenAiTools } from '../helpers/openai'; + +interface AskBeetsOptions { + verbose?: boolean; + notify?: (message: string) => Promise; +} + +export async function askBeets(question: string, options?: AskBeetsOptions): Promise { + const openaiApiKey = process.env.OPENAI_API_KEY; + if (!openaiApiKey) { + throw new Error('OPENAI_API_KEY environment variable is required'); + } + const openai = new OpenAI({ apiKey: openaiApiKey }); + + const privateKey = process.env.PRIVATE_KEY; + if (!privateKey) { + throw new Error('PRIVATE_KEY environment variable is required'); + } + + const notify = options?.notify || (async (message: string) => console.log(`[Notification] ${message}`)); + + const account = privateKeyToAccount(`0x${privateKey}`); + const provider = createPublicClient({ + chain: sonic, + transport: http(), + }); + + // Create minimal FunctionOptions object + const functionOptions: FunctionOptions = { + getProvider: () => provider, + sendTransactions: async () => { + throw new Error('Not implemented'); + }, + notify, + }; + + // Ask OpenAI to determine which function to call, including + // a system message to specify the chain and account + const completion = await openai.chat.completions.create({ + model: 'gpt-4o', + messages: [ + { + role: 'system', + content: `You are a helpful assistant that can help me interact with the Beets protocol. You will be given a question and you will need to determine which tools to call. All functions will need the chainName and account arguments, + that you will need to fill in this way: chainName: "sonic", account: "${account.address}".`, + }, + { role: 'user', content: question }, + ], + tools: tools.map((tool) => fromHeyAnonToolsToOpenAiTools(tool)), + }); + + if (options?.verbose) { + console.log('Completion:', util.inspect(completion, { depth: null, colors: true })); + } + + const functionCalls = completion.choices[0].message.tool_calls; + if (!functionCalls) { + return toResult("I couldn't determine what operation you want to perform.", true); + } + if (functionCalls.length > 1) { + console.log(`Multiple functions found: ${functionCalls.map((call) => call.function.name).join(', ')}`); + console.log(`Will only execute the first one.`); + } + + const functionCall = functionCalls[0]; + + // Get the function to call from our functions object + const functionName = functionCall.function.name as keyof typeof functions; + const functionArgs = JSON.parse(functionCall.function.arguments); + + console.log(`Function: ${functionName}`); + console.log(`Args: ${JSON.stringify(functionArgs)}`); + + const func = functions[functionName]; + if (!func) { + return toResult(`Function ${functionName} not found.`, true); + } + + // Replace chain & address for good measure + functionArgs.chainName = 'sonic'; + functionArgs.account = account.address; + + // Call the function with the parsed arguments + return await func(functionArgs, functionOptions); +} diff --git a/projects/beets-lst/examples/run.ts b/projects/beets-lst/examples/run.ts new file mode 100644 index 00000000..b8996f56 --- /dev/null +++ b/projects/beets-lst/examples/run.ts @@ -0,0 +1,22 @@ +import { askBeets } from './askBeets'; +import dotenv from 'dotenv'; + +dotenv.config(); + +const question = process.argv[2]; +if (!question) { + console.error('Please provide a question as an argument'); + process.exit(1); +} + +async function main() { + const result = await askBeets(question); + if (!result.success) { + console.error(`Error: ${result.data}`); + process.exit(1); + } + console.log(`Q: ${question}`); + console.log(`A: ${result.data}`); +} + +main().catch(console.error); diff --git a/projects/beets-lst/functions/getStakedBalance.ts b/projects/beets-lst/functions/getStakedBalance.ts index 81041889..6e5a4e9a 100644 --- a/projects/beets-lst/functions/getStakedBalance.ts +++ b/projects/beets-lst/functions/getStakedBalance.ts @@ -8,13 +8,15 @@ interface Props { account: Address; } -export async function getStakedBalance({ chainName, account }: Props, { getProvider }: FunctionOptions): Promise { +export async function getStakedBalance({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { const chainId = getChainFromName(chainName); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); const publicClient = getProvider(chainId); + await notify(`Getting stS balance`); + const balance = await publicClient.readContract({ address: STS_ADDRESS, abi: stsAbi, diff --git a/projects/beets-lst/helpers/openai.ts b/projects/beets-lst/helpers/openai.ts new file mode 100644 index 00000000..7f277600 --- /dev/null +++ b/projects/beets-lst/helpers/openai.ts @@ -0,0 +1,65 @@ +import { AiTool } from '@heyanon/sdk'; +import OpenAI from 'openai'; +import { FunctionParameters } from 'openai/resources'; + +/** + * Convert a HeyAnon tools to an OpenAI tool. + * + * Example of an OpenAI tool from https://platform.openai.com/docs/guides/function-calling: + * + * { + * "type": "function", + * "function": { + * "name": "get_weather", + * "description": "Retrieves current weather for the given location.", + * "parameters": { + * "type": "object", + * "properties": { + * "location": { + * "type": "string", + * "description": "City and country e.g. Bogotá, Colombia" + * }, + * "units": { + * "type": "string", + * "enum": [ + * "celsius", + * "fahrenheit" + * ], + * "description": "Units the temperature will be returned in." + * } + * }, + * "required": [ + * "location", + * "units" + * ], + * "additionalProperties": false + * }, + * "strict": true + * } + *} + */ +export function fromHeyAnonToolsToOpenAiTools(tool: AiTool): OpenAI.Chat.Completions.ChatCompletionTool { + return { + type: 'function', + function: { + name: tool.name, + description: tool.description, + parameters: { + type: 'object', + properties: Object.fromEntries( + tool.props.map((prop) => [ + prop.name, + { + type: prop.type, + enum: prop.enum, + description: prop.description, + }, + ]), + ), + required: tool.required, + additionalProperties: false, + }, + strict: true, + }, + }; +} diff --git a/projects/beets-lst/package.json b/projects/beets-lst/package.json index 9f3aa3d9..02e15241 100644 --- a/projects/beets-lst/package.json +++ b/projects/beets-lst/package.json @@ -2,7 +2,8 @@ "name": "@projects/beets-lst", "version": "1.0.0", "scripts": { - "yarn": "yarn install" + "yarn": "yarn install", + "ask": "ts-node examples/run.ts" }, "dependencies": { "@heyanon/sdk": "^1.0.4", @@ -15,6 +16,10 @@ "yarn": ">=1.22" }, "devDependencies": { - "prettier": "^3.4.2" + "dotenv": "^16.4.7", + "openai": "^4.80.0", + "prettier": "^3.4.2", + "ts-node": "^10.9.2", + "typescript": "^5.7.3" } } diff --git a/projects/beets-lst/tsconfig.json b/projects/beets-lst/tsconfig.json new file mode 100644 index 00000000..94ccf0bb --- /dev/null +++ b/projects/beets-lst/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": [ + "ES2020" + ], + "moduleResolution": "node", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "outDir": "./dist", + "rootDir": ".", + "resolveJsonModule": true, + "allowJs": true + }, + "ts-node": { + "compilerOptions": { + "module": "commonjs" + } + }, + "include": [ + "./**/*.ts" + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/projects/beets-lst/yarn.lock b/projects/beets-lst/yarn.lock index beeab775..90fc0186 100644 --- a/projects/beets-lst/yarn.lock +++ b/projects/beets-lst/yarn.lock @@ -7,6 +7,13 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@esbuild/aix-ppc64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" @@ -138,11 +145,24 @@ dependencies: "@sinclair/typebox" "^0.27.8" -"@jridgewell/sourcemap-codec@^1.5.0": +"@jridgewell/resolve-uri@^3.0.3": + 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.10", "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@noble/curves@1.7.0", "@noble/curves@~1.7.0": version "1.7.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.7.0.tgz#0512360622439256df892f21d25b388f52505e45" @@ -324,11 +344,53 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + "@types/estree@1.0.6", "@types/estree@^1.0.0": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== +"@types/node-fetch@^2.6.4": + version "2.6.12" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03" + integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== + dependencies: + "@types/node" "*" + form-data "^4.0.0" + +"@types/node@*": + version "22.10.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.7.tgz#14a1ca33fd0ebdd9d63593ed8d3fbc882a6d28d7" + integrity sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg== + dependencies: + undici-types "~6.20.0" + +"@types/node@^18.11.18": + version "18.19.71" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.71.tgz#96d4f0a0be735ead6c8998c62a4b2c0012a5d09a" + integrity sha512-evXpcgtZm8FY4jqBSN8+DmOTcVkkvTmAayeo4Wf3m1xAruyVGzGuDh/Fb/WWX2yLItUiho42ozyJjB0dw//Tkw== + dependencies: + undici-types "~5.26.4" + "@uniswap/token-lists@1.0.0-beta.33": version "1.0.0-beta.33" resolved "https://registry.yarnpkg.com/@uniswap/token-lists/-/token-lists-1.0.0-beta.33.tgz#966ba96c9ccc8f0e9e09809890b438203f2b1911" @@ -447,23 +509,42 @@ abitype@^1.0.6: resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.8.tgz#3554f28b2e9d6e9f35eb59878193eabd1b9f46ba" integrity sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg== -acorn-walk@^8.3.2: +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" + +acorn-walk@^8.1.1, acorn-walk@^8.3.2: version "8.3.4" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" -acorn@^8.11.0, acorn@^8.14.0: +acorn@^8.11.0, acorn@^8.14.0, acorn@^8.4.1: version "8.14.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== +agentkeepalive@^4.2.1: + version "4.6.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" + integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ== + dependencies: + humanize-ms "^1.2.1" + ansi-styles@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -546,6 +627,11 @@ confbox@^0.1.8: resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^7.0.3: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" @@ -589,6 +675,16 @@ diff-sequences@^29.6.3: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dotenv@^16.4.7: + version "16.4.7" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" + integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== + es-module-lexer@^1.5.4: version "1.6.0" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" @@ -630,6 +726,11 @@ estree-walker@^3.0.3: dependencies: "@types/estree" "^1.0.0" +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== + eventemitter3@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" @@ -660,6 +761,11 @@ follow-redirects@^1.15.6: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== +form-data-encoder@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" + integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== + form-data@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" @@ -669,6 +775,14 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +formdata-node@^4.3.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" + integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== + dependencies: + node-domexception "1.0.0" + web-streams-polyfill "4.0.0-beta.3" + fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -689,6 +803,13 @@ human-signals@^5.0.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + is-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" @@ -736,6 +857,11 @@ magic-string@^0.30.12, magic-string@^0.30.5: dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -768,7 +894,7 @@ mlly@^1.7.3, mlly@^1.7.4: pkg-types "^1.3.0" ufo "^1.5.4" -ms@^2.1.3: +ms@^2.0.0, 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== @@ -778,6 +904,18 @@ nanoid@^3.3.8: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== +node-domexception@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@^2.6.7: + 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" + npm-run-path@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" @@ -792,6 +930,19 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +openai@^4.80.0: + version "4.80.0" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.80.0.tgz#693e5be69a21ed31658a5e0cd8132056cd7a6fb8" + integrity sha512-5TqdNQgjOMxo3CkCvtjzuSwuznO/o3q5aak0MTy6IjRvPtvVA1wAFGJU3eZT1JHzhs2wFb/xtDG0o6Y/2KGCfw== + dependencies: + "@types/node" "^18.11.18" + "@types/node-fetch" "^2.6.4" + abort-controller "^3.0.0" + agentkeepalive "^4.2.1" + form-data-encoder "1.7.2" + formdata-node "^4.3.2" + node-fetch "^2.6.7" + ox@0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/ox/-/ox-0.6.5.tgz#e6506a589bd6af9b5fecfcb2c641b63c9882edb6" @@ -1011,16 +1162,60 @@ toformat@^2.0.0: resolved "https://registry.yarnpkg.com/toformat/-/toformat-2.0.0.tgz#7a043fd2dfbe9021a4e36e508835ba32056739d8" integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + type-detect@^4.0.0, type-detect@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== +typescript@^5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== + ufo@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + viem@^2.22.7, viem@^2.7.20: version "2.22.10" resolved "https://registry.yarnpkg.com/viem/-/viem-2.22.10.tgz#64fdfdc6ded7e9f372da0caf30f781aca517b24a" @@ -1120,6 +1315,24 @@ vitest@^2.1.8: vite-node "2.1.8" why-is-node-running "^2.3.0" +web-streams-polyfill@4.0.0-beta.3: + version "4.0.0-beta.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" + integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== + +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@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -1140,6 +1353,11 @@ ws@8.18.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" From 9faecd58c0aad13c316177876ff77f705a98c5a1 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Wed, 22 Jan 2025 22:17:47 +0100 Subject: [PATCH 05/33] feat: askBeets can now send TXs --- projects/beets-lst/constants.ts | 2 +- projects/beets-lst/examples/askBeets.ts | 41 +++++++++++++++++++++---- projects/beets-lst/examples/run.ts | 8 +++-- projects/beets-lst/functions/stake.ts | 3 +- projects/beets-lst/functions/unStake.ts | 26 +++++++++++----- projects/beets-lst/helpers/client.ts | 9 +++++- 6 files changed, 69 insertions(+), 20 deletions(-) diff --git a/projects/beets-lst/constants.ts b/projects/beets-lst/constants.ts index 0ec835c7..97cd19ff 100644 --- a/projects/beets-lst/constants.ts +++ b/projects/beets-lst/constants.ts @@ -2,4 +2,4 @@ import { ChainId } from '@heyanon/sdk'; export const supportedChains = [ChainId.SONIC]; -export const STS_ADDRESS = '0xd5f7fc8ba92756a34693baa386edcc8dd5b3f141'; +export const STS_ADDRESS = '0xe5da20f15420ad15de0fa650600afc998bbe3955'; diff --git a/projects/beets-lst/examples/askBeets.ts b/projects/beets-lst/examples/askBeets.ts index 37a54e1e..bcf3342c 100644 --- a/projects/beets-lst/examples/askBeets.ts +++ b/projects/beets-lst/examples/askBeets.ts @@ -1,12 +1,13 @@ import OpenAI from 'openai'; import { privateKeyToAccount } from 'viem/accounts'; -import { createPublicClient, http } from 'viem'; +import { createPublicClient, http, createWalletClient } from 'viem'; import { sonic } from 'viem/chains'; import { FunctionOptions, FunctionReturn, toResult } from '@heyanon/sdk'; import { tools } from '../tools'; import * as functions from '../functions'; import util from 'util'; import { fromHeyAnonToolsToOpenAiTools } from '../helpers/openai'; +import { parseEther } from 'viem'; interface AskBeetsOptions { verbose?: boolean; @@ -27,7 +28,7 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro const notify = options?.notify || (async (message: string) => console.log(`[Notification] ${message}`)); - const account = privateKeyToAccount(`0x${privateKey}`); + const signer = privateKeyToAccount(`0x${privateKey}`); const provider = createPublicClient({ chain: sonic, transport: http(), @@ -36,8 +37,36 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro // Create minimal FunctionOptions object const functionOptions: FunctionOptions = { getProvider: () => provider, - sendTransactions: async () => { - throw new Error('Not implemented'); + sendTransactions: async ({ chainId, account, transactions }) => { + // Create wallet client + const walletClient = createWalletClient({ + account: signer, + chain: provider.chain, + transport: http(), + }); + + const results = []; + + // Send transactions sequentially + for (const tx of transactions) { + const hash = await walletClient.sendTransaction({ + to: tx.target, + data: tx.data, + value: tx.value || 0n, + }); + + const receipt = await provider.waitForTransactionReceipt({ hash }); + + results.push({ + hash: receipt.transactionHash, + message: `Transaction confirmed with hash: ${receipt.transactionHash}`, + }); + } + + return { + isMultisig: false, + data: results, + }; }, notify, }; @@ -50,7 +79,7 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro { role: 'system', content: `You are a helpful assistant that can help me interact with the Beets protocol. You will be given a question and you will need to determine which tools to call. All functions will need the chainName and account arguments, - that you will need to fill in this way: chainName: "sonic", account: "${account.address}".`, + that you will need to fill in this way: chainName: "sonic", account: "${signer.address}".`, }, { role: 'user', content: question }, ], @@ -86,7 +115,7 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro // Replace chain & address for good measure functionArgs.chainName = 'sonic'; - functionArgs.account = account.address; + functionArgs.account = signer.address; // Call the function with the parsed arguments return await func(functionArgs, functionOptions); diff --git a/projects/beets-lst/examples/run.ts b/projects/beets-lst/examples/run.ts index b8996f56..213d673b 100644 --- a/projects/beets-lst/examples/run.ts +++ b/projects/beets-lst/examples/run.ts @@ -9,11 +9,13 @@ if (!question) { process.exit(1); } +const verbose = process.argv.includes('--verbose'); + async function main() { - const result = await askBeets(question); + const result = await askBeets(question, { verbose }); if (!result.success) { - console.error(`Error: ${result.data}`); - process.exit(1); + console.error(`${result.data}`); + process.exit(0); } console.log(`Q: ${question}`); console.log(`A: ${result.data}`); diff --git a/projects/beets-lst/functions/stake.ts b/projects/beets-lst/functions/stake.ts index 258248f0..fa6e31b7 100644 --- a/projects/beets-lst/functions/stake.ts +++ b/projects/beets-lst/functions/stake.ts @@ -23,6 +23,7 @@ export async function stake({ chainName, account, amount }: Props, { sendTransac const amountInWei = parseUnits(amount, 18); if (amountInWei === 0n) return toResult('Amount must be greater than 0', true); + if (amountInWei < parseUnits('0.01', 18)) return toResult('Amount must be greater than 0.01 S', true); const transactions: TransactionParams[] = []; @@ -38,7 +39,7 @@ export async function stake({ chainName, account, amount }: Props, { sendTransac }; transactions.push(tx); - await notify('Waiting for transaction confirmation...'); + await notify('Sending transaction...'); const result = await sendTransactions({ chainId, account, transactions }); diff --git a/projects/beets-lst/functions/unStake.ts b/projects/beets-lst/functions/unStake.ts index f874f842..26c656ed 100644 --- a/projects/beets-lst/functions/unStake.ts +++ b/projects/beets-lst/functions/unStake.ts @@ -1,4 +1,4 @@ -import { Address, encodeFunctionData, parseUnits } from 'viem'; +import { Address, encodeFunctionData, formatUnits, parseUnits } from 'viem'; import { FunctionReturn, FunctionOptions, TransactionParams, toResult, getChainFromName } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS } from '../constants'; import { stsAbi } from '../abis'; @@ -32,7 +32,9 @@ export async function unStake({ chainName, account, amount }: Props, { sendTrans // Get the public client to read contract data const publicClient = getProvider(chainId); - // Convert asset amount to shares amount + await notify('Preparing to unstake...'); + + // Convert amount to undelegate to shares amount const sharesAmount = await publicClient.readContract({ address: STS_ADDRESS, abi: stsAbi, @@ -40,22 +42,30 @@ export async function unStake({ chainName, account, amount }: Props, { sendTrans args: [amountInWei], }); - await notify('Fetching staking data...'); + // Check that the user has enough stS to undelegate + const balance = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'balanceOf', + args: [account], + }); + if (balance < sharesAmount) { + return toResult(`You do not have enough stS to undelegate. Current balance: ${formatUnits(balance, 18)} stS`, true); + } try { + // Find the validator with the highest amount of assets delegated const validators = await fetchValidators(); if (!validators.length) { return toResult('No validators found', true); } - const targetValidator = findHighestDelegatedValidator(validators); - if (BigInt(targetValidator.assetsDelegated) < amountInWei) { + // Check if validator has enough staked assets + if (parseUnits(targetValidator.assetsDelegated, 18) < amountInWei) { return toResult(`Validator does not have enough staked assets. Maximum available: ${targetValidator.assetsDelegated}`, true); } - await notify('Preparing to undelegate Sonic tokens from Beets.fi liquid staking module...'); - const transactions: TransactionParams[] = []; const tx: TransactionParams = { target: STS_ADDRESS, @@ -70,7 +80,7 @@ export async function unStake({ chainName, account, amount }: Props, { sendTrans }; transactions.push(tx); - await notify('Waiting for transaction confirmation...'); + await notify('Sending transaction...'); const result = await sendTransactions({ chainId, account, transactions }); return toResult( diff --git a/projects/beets-lst/helpers/client.ts b/projects/beets-lst/helpers/client.ts index 970c3501..004028cf 100644 --- a/projects/beets-lst/helpers/client.ts +++ b/projects/beets-lst/helpers/client.ts @@ -54,5 +54,12 @@ export async function fetchValidators(): Promise { * Find the validator with the highest amount of assets delegated. */ export function findHighestDelegatedValidator(validators: ValidatorData[]): ValidatorData { - return validators.reduce((max, current) => (BigInt(current.assetsDelegated) > BigInt(max.assetsDelegated) ? current : max)); + return validators.reduce((max, current) => { + const currentValue = parseFloat(current.assetsDelegated); + const maxValue = parseFloat(max.assetsDelegated); + if (isNaN(currentValue) || isNaN(maxValue)) { + throw new Error('Invalid asset delegation value encountered'); + } + return currentValue > maxValue ? current : max; + }); } From 938e0eea0d433f366a6dc525de3288e9e5ee5058 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Wed, 22 Jan 2025 23:06:49 +0100 Subject: [PATCH 06/33] test: askBeets can now make multiple tool calls --- projects/beets-lst/README.md | 1 + projects/beets-lst/examples/askBeets.ts | 136 ++++++++++++++++-------- projects/beets-lst/examples/run.ts | 4 +- projects/beets-lst/tools.ts | 2 +- 4 files changed, 97 insertions(+), 46 deletions(-) diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index 333cea78..8e61bd0e 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -11,6 +11,7 @@ Integration with beets.fi Sonic liquid staking module (stS). The integration sup 1. Basic Operations - "Stake 100 S in @beets-lst" + - "Stake half of my Sonic in @beets-lst" - "Unstake 100 stS from @beets-lst" - "Unstake all of my stS from @beets-lst" - "Withdraw all of my stS from @beets-lst" diff --git a/projects/beets-lst/examples/askBeets.ts b/projects/beets-lst/examples/askBeets.ts index bcf3342c..50e54d83 100644 --- a/projects/beets-lst/examples/askBeets.ts +++ b/projects/beets-lst/examples/askBeets.ts @@ -14,6 +14,14 @@ interface AskBeetsOptions { notify?: (message: string) => Promise; } +interface ConversationMessage { + role: 'system' | 'user' | 'assistant' | 'tool'; + content: string; + tool_calls?: OpenAI.Chat.Completions.ChatCompletionMessage['tool_calls']; + tool_call_id?: string; + name?: string; +} + export async function askBeets(question: string, options?: AskBeetsOptions): Promise { const openaiApiKey = process.env.OPENAI_API_KEY; if (!openaiApiKey) { @@ -71,52 +79,94 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro notify, }; - // Ask OpenAI to determine which function to call, including - // a system message to specify the chain and account - const completion = await openai.chat.completions.create({ - model: 'gpt-4o', - messages: [ - { - role: 'system', - content: `You are a helpful assistant that can help me interact with the Beets protocol. You will be given a question and you will need to determine which tools to call. All functions will need the chainName and account arguments, - that you will need to fill in this way: chainName: "sonic", account: "${signer.address}".`, - }, - { role: 'user', content: question }, - ], - tools: tools.map((tool) => fromHeyAnonToolsToOpenAiTools(tool)), - }); - - if (options?.verbose) { - console.log('Completion:', util.inspect(completion, { depth: null, colors: true })); - } + const messages: ConversationMessage[] = [ + { + role: 'system', + content: `You will interact with the Beets protocol via your tools. Given a request, you will need to determine which tools to call. + For operations that require multiple steps (like "unstake all"), you should first get required information before executing actions. + For example, to unstake all tokens: + 1. First call getStakedBalance to get the current balance + 2. Then use that balance amount to call unStake + After each tool response, determine if additional steps are needed. + All tools will need the chainName and account arguments: chainName: "sonic", account: "${signer.address}".`, + }, + { role: 'user', content: question }, + ]; + + const results: FunctionReturn[] = []; + let isComplete = false; + + while (!isComplete) { + // Call the LLM to determine which tools to call + const completion = await openai.chat.completions.create({ + model: 'gpt-4', + messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[], + tools: tools.map((tool) => fromHeyAnonToolsToOpenAiTools(tool)), + tool_choice: 'auto', + }); + + if (options?.verbose) { + console.log('Messages:', util.inspect(messages, { depth: null, colors: true })); + } + + // Add the LLM response to the conversation + const assistantMessage = completion.choices[0].message; + messages.push({ + role: 'assistant', + content: assistantMessage.content || '', + tool_calls: assistantMessage.tool_calls, + }); + + // If no tool calls, the assistant is done + if (!assistantMessage.tool_calls) { + isComplete = true; + continue; + } + + // Determine which tool to call and its arguments + const functionCall = assistantMessage.tool_calls[0]; + const functionName = functionCall.function.name as keyof typeof functions; + const functionArgs = JSON.parse(functionCall.function.arguments); + + console.log(`Executing function: ${functionName}`); + console.log(`Args: ${JSON.stringify(functionArgs)}`); + + const func = functions[functionName]; + if (!func) { + return toResult(`Function ${functionName} not found.`, true); + } + + // Replace chain & address for good measure + functionArgs.chainName = 'sonic'; + functionArgs.account = signer.address; + + // Call the tool and add the result to the conversation + try { + const result = await func(functionArgs, functionOptions); + results.push(result); + + if (!result.success) { + return result; + } - const functionCalls = completion.choices[0].message.tool_calls; - if (!functionCalls) { - return toResult("I couldn't determine what operation you want to perform.", true); - } - if (functionCalls.length > 1) { - console.log(`Multiple functions found: ${functionCalls.map((call) => call.function.name).join(', ')}`); - console.log(`Will only execute the first one.`); + messages.push({ + role: 'tool', + tool_call_id: functionCall.id, + name: functionName, + content: result.data, + }); + } catch (error) { + return toResult(`Error executing ${functionName}: ${error instanceof Error ? error.message : 'Unknown error'}`, true); + } } - const functionCall = functionCalls[0]; - - // Get the function to call from our functions object - const functionName = functionCall.function.name as keyof typeof functions; - const functionArgs = JSON.parse(functionCall.function.arguments); - - console.log(`Function: ${functionName}`); - console.log(`Args: ${JSON.stringify(functionArgs)}`); - - const func = functions[functionName]; - if (!func) { - return toResult(`Function ${functionName} not found.`, true); + // Combine results into a single response + if (results.length === 0) { + return toResult('No operations were performed.', true); + } else if (results.length === 1) { + return results[0]; } - // Replace chain & address for good measure - functionArgs.chainName = 'sonic'; - functionArgs.account = signer.address; - - // Call the function with the parsed arguments - return await func(functionArgs, functionOptions); + const combinedMessage = results.map((r, i) => `Step ${i + 1}: ${r.data}`).join('\n'); + return toResult(combinedMessage); } diff --git a/projects/beets-lst/examples/run.ts b/projects/beets-lst/examples/run.ts index 213d673b..4177bbad 100644 --- a/projects/beets-lst/examples/run.ts +++ b/projects/beets-lst/examples/run.ts @@ -17,8 +17,8 @@ async function main() { console.error(`${result.data}`); process.exit(0); } - console.log(`Q: ${question}`); - console.log(`A: ${result.data}`); + console.log(`Response:`); + console.log(result.data); } main().catch(console.error); diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index 642c898a..a55c8493 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -4,7 +4,7 @@ import { supportedChains } from './constants'; export const tools: AiTool[] = [ { name: 'getStakedBalance', - description: 'Get balance of staked Sonic tokens (stS)', + description: 'Get the account balance of staked Sonic tokens (stS)', required: ['chainName', 'account'], props: [ { From 4f952246e04d53419f5691ca3c9da5055e134703 Mon Sep 17 00:00:00 2001 From: coccoinomane Date: Thu, 23 Jan 2025 11:00:23 +0100 Subject: [PATCH 07/33] docs: add askBeets to README --- README.md | 138 +++++++++++++++++++----------------------------------- 1 file changed, 47 insertions(+), 91 deletions(-) diff --git a/README.md b/README.md index fc4c57fb..bfd1b83e 100644 --- a/README.md +++ b/README.md @@ -1,121 +1,77 @@ -# HeyAnon AI Module Development Documentation +# beets-lst -Welcome to the technical documentation for developing additional project modules for the HeyAnon AI Chatbot. +Integration with beets.fi Sonic liquid staking module (stS). The integration supports staking S into stS and unstaking back to S. The unstaking is a 2-step process: first undelegate, then claim Sonic after 14 days. -[Fast track terms](./guides/fast-track-terms.md) - -## Contents - -- [Introduction](./guides/introduction.md) -- [Requirements](./guides/requirements.md) -- [Architecture and Design](./guides/architecture-and-design.md) -- [Action Functions Implementation Guide](./guides/action-functions.md) -- [Getter Functions Implementation Guide](./guides/getter-functions.md) -- [Tools Implementation Guide](./guides/tools-implementation.md) -- [Module README Guidelines](./guides/module-readme-guidelines.md) -- [Conclusion](./guides/conclusion.md) -- [Additional Resources](./guides/additional-resources.md) +## Supported Networks -## Quick Links +- SONIC -- [Action Function Example](./guides/action-function-example.md) -- [Getter Function Example](./guides/getter-function-example.md) +## Common Tasks -## Quick Start +1. Basic Operations -To create a new module, use the provided bash script: + - "Stake 100 S in @beets-lst" + - "Stake half of my Sonic in @beets-lst" + - "Unstake 100 stS from @beets-lst" + - "Unstake all of my stS from @beets-lst" + - "Withdraw all of my stS from @beets-lst" -```bash -cd scripts -chmod +x create-module.sh -./create-module.sh "" "" -``` +2. Information Queries + - "Get my stS balance in @beets-lst" + - "How long before I can withdraw S from @beets-lst?" -Parameters: +## Available Functions -- `module-name`: Name of your module (e.g., "example-protocol") -- `description`: Short description of your module in quotes -- `chains`: Comma-separated list of supported chains in quotes (e.g., "ETHEREUM,ARBITRUM") +List of available functions will be added here. -Example: +## Installation ```bash -./create-module.sh example-protocol "Integration with Example Protocol" "ETHEREUM,ARBITRUM" -cd projects/example-protocol -yarn install +yarn add @heyanon/beets-lst ``` -The script will create: - -1. Module directory structure in [projects](./projects) folder: - - `abis/` - for contract ABIs - - `functions/` - for action and getter functions - - Configuration files (index.ts, tools.ts, etc.) -2. Basic README.md with template documentation -3. Git repository initialization -4. Package.json with correct naming - -After creation, follow the printed instructions to complete module setup. - -## Contribution Guide +## Usage -### Module Structure +Example usage will be added here. -All modules must be placed in the [projects](./projects) directory. This ensures consistent organization and easier maintenance of the codebase. +## Contracts and transactions -### Development Process +- Liquid staking contract: https://sonicscan.org/address/0xe5da20f15420ad15de0fa650600afc998bbe3955 +- Stake Sonic (`deposit`): https://sonicscan.org/tx/0x19545670b77c9ab7e1eabdab292c1aa9d0abd6e11777ab3147f343cb900c728b +- Initiate unstake (`undelegateMany`): https://sonicscan.org/tx/0xb64c4fd6ae4667a3b7ce9d6ba9679fbd2c591173a0895a5616adc3b039b10c27 +- Withdraw Sonic (`withdraw`): https://sonicscan.org/tx/0xb93b07384ccbace4236d07fac46874039821c84707f69fbee101e9ae5506f470 +- Claim rewards (`claimRewards`): https://sonicscan.org/tx/0xf46de5d07b1feeaf132e58ae0a87075a2cf9308698ab4837c76c0a2b7dd62aa5 -1. Fork the repository -2. Create a new branch for your module: - ```bash - git checkout -b feature/module-name - ``` -3. Create your module using the provided script -4. Implement required functionality following the guides -5. Test your implementation thoroughly -6. Create documentation for your module +## Test integration -### Pull Request Process +I've built a simple agent called `askBeets` to test the integration. To run it, you need to configure .env: -1. Ensure your code follows the project's coding standards -2. Update the documentation as needed -3. Create a Pull Request with: - - Clear description of the module's functionality - - List of supported chains - - Any special configuration requirements - - Test results or coverage reports -4. Wait for review from maintainers +```bash +cd projects/beets-lst +yarn install +cp .env.example .env +# insert test wallet private key into .env +# insert OpenAI API key into .env +``` -### Code Standards +and then you can ask questions directly: -- Use TypeScript for all implementations -- Follow existing code style and formatting -- Include proper error handling -- Add comprehensive comments -- Ensure type safety +```bash +yarn run ask "What is my stS balance?" +yarn run ask "Stake 0.1 S" +yarn run ask "Unstake all of my stS" +``` -### Testing +The agent will perform one or more tasks to execute your request; see for example this GIF where I asked to bot to unstake all of my stS: -- Test all functions with different input scenarios -- Verify error handling -- Test on all supported networks -## Supported Networks -[Available networks for integration:](https://github.com/RealWagmi/heyanon-sdk/blob/main/src/blockchain/constants/chains.ts) +https://github.com/user-attachments/assets/2ce0d109-85b5-4548-8bad-2c4bfadaeacf -### Mainnet Networks -- ETHEREUM (Ethereum Mainnet, 1) -- BSC (BNB Smart Chain, 56) -- KAVA (Kava EVM, 2222) -- BASE (Base, 8453) -- IOTA (IOTA EVM, 1074) -- AVALANCHE (Avalanche C-Chain, 43114) -- ARBITRUM (Arbitrum One, 42161) -- SONIC (Sonic, 146) -### Testnet Networks +If you need to see the OpenAI messages, for debug purposes, run with `--verbose` flag: -- SEPOLIA (Ethereum Testnet Sepolia, 11155111) -- ONE_SEPOLIA (Arbitrum Sepolia Testnet, 421614) +```bash +yarn run ask "What is my stS balance?" --verbose +``` From bdf5a9147eacdd6b31aeab421105739228897301 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Thu, 23 Jan 2025 11:36:13 +0100 Subject: [PATCH 08/33] chore: rename stS balance getter --- projects/beets-lst/.env.example | 7 +++-- projects/beets-lst/.gitignore | 3 +- projects/beets-lst/README.md | 4 +-- projects/beets-lst/examples/askBeets.ts | 2 +- .../beets-lst/functions/getStakedBalance.ts | 28 ------------------- projects/beets-lst/functions/index.ts | 2 +- projects/beets-lst/tools.ts | 2 +- 7 files changed, 12 insertions(+), 36 deletions(-) delete mode 100644 projects/beets-lst/functions/getStakedBalance.ts diff --git a/projects/beets-lst/.env.example b/projects/beets-lst/.env.example index 3cd84c8c..cdd4bf88 100644 --- a/projects/beets-lst/.env.example +++ b/projects/beets-lst/.env.example @@ -1,4 +1,7 @@ -# Variables for running the examples locally +# Variables for running askBeets.ts +# OpenAI API Key OPENAI_API_KEY=your_openai_api_key_here -PRIVATE_KEY=your_wallet_private_key_here \ No newline at end of file + +# Private key of a test wallet, without the initial 0x +PRIVATE_KEY=your_wallet_private_key_here diff --git a/projects/beets-lst/.gitignore b/projects/beets-lst/.gitignore index 3254652f..a6cef30f 100644 --- a/projects/beets-lst/.gitignore +++ b/projects/beets-lst/.gitignore @@ -1,3 +1,4 @@ node_modules .vscode -.env \ No newline at end of file +.env +contracts \ No newline at end of file diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index 8e61bd0e..270134fa 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -36,8 +36,8 @@ Example usage will be added here. ## Contracts and transactions -- Liquid staking contract: https://sonicscan.org/address/0xe5da20f15420ad15de0fa650600afc998bbe3955 +- Liquid staking proxy contract: https://sonicscan.org/address/0xe5da20f15420ad15de0fa650600afc998bbe3955 +- Liquid staking current implementation: https://sonicscan.org/address/0xd5f7fc8ba92756a34693baa386edcc8dd5b3f141 - Stake Sonic (`deposit`): https://sonicscan.org/tx/0x19545670b77c9ab7e1eabdab292c1aa9d0abd6e11777ab3147f343cb900c728b - Initiate unstake (`undelegateMany`): https://sonicscan.org/tx/0xb64c4fd6ae4667a3b7ce9d6ba9679fbd2c591173a0895a5616adc3b039b10c27 - Withdraw Sonic (`withdraw`): https://sonicscan.org/tx/0xb93b07384ccbace4236d07fac46874039821c84707f69fbee101e9ae5506f470 -- Claim rewards (`claimRewards`): https://sonicscan.org/tx/0xf46de5d07b1feeaf132e58ae0a87075a2cf9308698ab4837c76c0a2b7dd62aa5 diff --git a/projects/beets-lst/examples/askBeets.ts b/projects/beets-lst/examples/askBeets.ts index 50e54d83..3f6660d8 100644 --- a/projects/beets-lst/examples/askBeets.ts +++ b/projects/beets-lst/examples/askBeets.ts @@ -85,7 +85,7 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro content: `You will interact with the Beets protocol via your tools. Given a request, you will need to determine which tools to call. For operations that require multiple steps (like "unstake all"), you should first get required information before executing actions. For example, to unstake all tokens: - 1. First call getStakedBalance to get the current balance + 1. First call getStakedSonicBalance to get the current balance 2. Then use that balance amount to call unStake After each tool response, determine if additional steps are needed. All tools will need the chainName and account arguments: chainName: "sonic", account: "${signer.address}".`, diff --git a/projects/beets-lst/functions/getStakedBalance.ts b/projects/beets-lst/functions/getStakedBalance.ts deleted file mode 100644 index 6e5a4e9a..00000000 --- a/projects/beets-lst/functions/getStakedBalance.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Address, formatUnits } from 'viem'; -import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; -import { supportedChains, STS_ADDRESS } from '../constants'; -import { stsAbi } from '../abis'; - -interface Props { - chainName: string; - account: Address; -} - -export async function getStakedBalance({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); - if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); - if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); - - const publicClient = getProvider(chainId); - - await notify(`Getting stS balance`); - - const balance = await publicClient.readContract({ - address: STS_ADDRESS, - abi: stsAbi, - functionName: 'balanceOf', - args: [account], - }); - - return toResult(`Staked Sonic balance: ${formatUnits(balance, 18)} stS`); -} diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index d627206f..3c251add 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -1,3 +1,3 @@ -export { getStakedBalance } from './getStakedBalance'; +export { getStakedSonicBalance } from './getStakedSonicBalance'; export { stake } from './stake'; export { unStake } from './unStake'; diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index a55c8493..2eb96cbb 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -3,7 +3,7 @@ import { supportedChains } from './constants'; export const tools: AiTool[] = [ { - name: 'getStakedBalance', + name: 'getStakedSonicBalance', description: 'Get the account balance of staked Sonic tokens (stS)', required: ['chainName', 'account'], props: [ From ad51247a19560cc02375587645a216a4a7b36c3d Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Thu, 23 Jan 2025 11:44:35 +0100 Subject: [PATCH 09/33] feat: enabled fractional staking of S --- projects/beets-lst/examples/askBeets.ts | 1 - .../beets-lst/functions/getSonicBalance.ts | 24 ++++++++++++++++ .../functions/getStakedSonicBalance.ts | 28 +++++++++++++++++++ projects/beets-lst/functions/index.ts | 1 + projects/beets-lst/tools.ts | 18 ++++++++++++ 5 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 projects/beets-lst/functions/getSonicBalance.ts create mode 100644 projects/beets-lst/functions/getStakedSonicBalance.ts diff --git a/projects/beets-lst/examples/askBeets.ts b/projects/beets-lst/examples/askBeets.ts index 3f6660d8..e73f7ae4 100644 --- a/projects/beets-lst/examples/askBeets.ts +++ b/projects/beets-lst/examples/askBeets.ts @@ -7,7 +7,6 @@ import { tools } from '../tools'; import * as functions from '../functions'; import util from 'util'; import { fromHeyAnonToolsToOpenAiTools } from '../helpers/openai'; -import { parseEther } from 'viem'; interface AskBeetsOptions { verbose?: boolean; diff --git a/projects/beets-lst/functions/getSonicBalance.ts b/projects/beets-lst/functions/getSonicBalance.ts new file mode 100644 index 00000000..f7c01e82 --- /dev/null +++ b/projects/beets-lst/functions/getSonicBalance.ts @@ -0,0 +1,24 @@ +import { Address, formatUnits } from 'viem'; +import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { supportedChains } from '../constants'; + +interface Props { + chainName: string; + account: Address; +} + +export async function getSonicBalance({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const publicClient = getProvider(chainId); + + await notify(`Getting Sonic (S) balance...`); + + const balance = await publicClient.getBalance({ + address: account, + }); + + return toResult(`Sonic balance: ${formatUnits(balance, 18)} S`); +} diff --git a/projects/beets-lst/functions/getStakedSonicBalance.ts b/projects/beets-lst/functions/getStakedSonicBalance.ts new file mode 100644 index 00000000..9b08d8c0 --- /dev/null +++ b/projects/beets-lst/functions/getStakedSonicBalance.ts @@ -0,0 +1,28 @@ +import { Address, formatUnits } from 'viem'; +import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { supportedChains, STS_ADDRESS } from '../constants'; +import { stsAbi } from '../abis'; + +interface Props { + chainName: string; + account: Address; +} + +export async function getStakedSonicBalance({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const publicClient = getProvider(chainId); + + await notify(`Getting staked Sonic (stS) balance...`); + + const balance = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'balanceOf', + args: [account], + }); + + return toResult(`Staked Sonic balance: ${formatUnits(balance, 18)} stS`); +} diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index 3c251add..bc58301a 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -1,3 +1,4 @@ +export { getSonicBalance } from './getSonicBalance'; export { getStakedSonicBalance } from './getStakedSonicBalance'; export { stake } from './stake'; export { unStake } from './unStake'; diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index 2eb96cbb..84bca811 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -2,6 +2,24 @@ import { AiTool, getChainName } from '@heyanon/sdk'; import { supportedChains } from './constants'; export const tools: AiTool[] = [ + { + name: 'getSonicBalance', + description: 'Get the account balance of Sonic tokens (S)', + required: ['chainName', 'account'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Chain name', + }, + { + name: 'account', + type: 'string', + description: 'Account address to check', + }, + ], + }, { name: 'getStakedSonicBalance', description: 'Get the account balance of staked Sonic tokens (stS)', From a43e6680252a7a86617fbb970a2be12b6271238a Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Thu, 23 Jan 2025 12:02:59 +0100 Subject: [PATCH 10/33] feat: function getTotalStakedSonic --- .../functions/getTotalStakedSonic.ts | 26 +++++++++++++++++++ projects/beets-lst/functions/index.ts | 1 + projects/beets-lst/tools.ts | 14 +++++++++- 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 projects/beets-lst/functions/getTotalStakedSonic.ts diff --git a/projects/beets-lst/functions/getTotalStakedSonic.ts b/projects/beets-lst/functions/getTotalStakedSonic.ts new file mode 100644 index 00000000..1d48d3a7 --- /dev/null +++ b/projects/beets-lst/functions/getTotalStakedSonic.ts @@ -0,0 +1,26 @@ +import { formatUnits } from 'viem'; +import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { supportedChains, STS_ADDRESS } from '../constants'; +import { stsAbi } from '../abis'; + +interface Props { + chainName: string; +} + +export async function getTotalStakedSonic({ chainName }: Props, { notify, getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const publicClient = getProvider(chainId); + + await notify(`Getting total Sonic (S) in Beets protocol...`); + + const totalAssets = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'totalAssets', + }); + + return toResult(`Total Sonic in protocol: ${formatUnits(totalAssets, 18)} S`); +} diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index bc58301a..511d672b 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -2,3 +2,4 @@ export { getSonicBalance } from './getSonicBalance'; export { getStakedSonicBalance } from './getStakedSonicBalance'; export { stake } from './stake'; export { unStake } from './unStake'; +export { getTotalStakedSonic } from './getTotalStakedSonic'; diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index 84bca811..53f1b7f9 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -61,7 +61,6 @@ export const tools: AiTool[] = [ }, ], }, - // TODO: check if "unstake all of my stS" works { name: 'unStake', description: 'Initiate undelegation of staked Sonic tokens (stS). Tokens can be withdrawn after 14 days.', @@ -85,4 +84,17 @@ export const tools: AiTool[] = [ }, ], }, + { + name: 'getTotalStakedSonic', + description: 'Get the total amount of Sonic tokens (S) in the protocol, including delegated and undelegated tokens', + required: ['chainName'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Chain name', + }, + ], + }, ]; From d4b9488460b526640d31318ab40d767bba1eb8d7 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Thu, 23 Jan 2025 12:16:37 +0100 Subject: [PATCH 11/33] feat: function getTotalStakedSonicInProtocol --- ...kedSonic.ts => getTotalSonicInProtocol.ts} | 2 +- .../getTotalStakedSonicInProtocol.ts | 26 +++++++++++++++++++ projects/beets-lst/functions/index.ts | 3 ++- projects/beets-lst/tools.ts | 17 ++++++++++-- 4 files changed, 44 insertions(+), 4 deletions(-) rename projects/beets-lst/functions/{getTotalStakedSonic.ts => getTotalSonicInProtocol.ts} (86%) create mode 100644 projects/beets-lst/functions/getTotalStakedSonicInProtocol.ts diff --git a/projects/beets-lst/functions/getTotalStakedSonic.ts b/projects/beets-lst/functions/getTotalSonicInProtocol.ts similarity index 86% rename from projects/beets-lst/functions/getTotalStakedSonic.ts rename to projects/beets-lst/functions/getTotalSonicInProtocol.ts index 1d48d3a7..aa5e8205 100644 --- a/projects/beets-lst/functions/getTotalStakedSonic.ts +++ b/projects/beets-lst/functions/getTotalSonicInProtocol.ts @@ -7,7 +7,7 @@ interface Props { chainName: string; } -export async function getTotalStakedSonic({ chainName }: Props, { notify, getProvider }: FunctionOptions): Promise { +export async function getTotalSonicInProtocol({ chainName }: Props, { notify, getProvider }: FunctionOptions): Promise { const chainId = getChainFromName(chainName); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); diff --git a/projects/beets-lst/functions/getTotalStakedSonicInProtocol.ts b/projects/beets-lst/functions/getTotalStakedSonicInProtocol.ts new file mode 100644 index 00000000..23f72d5a --- /dev/null +++ b/projects/beets-lst/functions/getTotalStakedSonicInProtocol.ts @@ -0,0 +1,26 @@ +import { formatUnits } from 'viem'; +import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { supportedChains, STS_ADDRESS } from '../constants'; +import { stsAbi } from '../abis'; + +interface Props { + chainName: string; +} + +export async function getTotalStakedSonicInProtocol({ chainName }: Props, { notify, getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const publicClient = getProvider(chainId); + + await notify(`Getting total Sonic (S) staked in Beets protocol...`); + + const totalAssets = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'totalDelegated', + }); + + return toResult(`Total Sonic staked in protocol: ${formatUnits(totalAssets, 18)} S`); +} diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index 511d672b..785a9fc1 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -2,4 +2,5 @@ export { getSonicBalance } from './getSonicBalance'; export { getStakedSonicBalance } from './getStakedSonicBalance'; export { stake } from './stake'; export { unStake } from './unStake'; -export { getTotalStakedSonic } from './getTotalStakedSonic'; +export { getTotalSonicInProtocol } from './getTotalSonicInProtocol'; +export { getTotalStakedSonicInProtocol } from './getTotalStakedSonicInProtocol'; diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index 53f1b7f9..1d0ee251 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -85,8 +85,21 @@ export const tools: AiTool[] = [ ], }, { - name: 'getTotalStakedSonic', - description: 'Get the total amount of Sonic tokens (S) in the protocol, including delegated and undelegated tokens', + name: 'getTotalSonicInProtocol', + description: 'Gets the total amount of Sonic tokens (S) in the protocol, including staked (delegated) and undelegated (pool) tokens', + required: ['chainName'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Chain name', + }, + ], + }, + { + name: 'getTotalStakedSonicInProtocol', + description: 'Protocol function that gets the total amount of Sonic tokens (S) staked in the protocol; this includes only staked tokens, not pool tokens', required: ['chainName'], props: [ { From 068488b3973d981880da0d83390842df326bb8af Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Thu, 23 Jan 2025 12:28:59 +0100 Subject: [PATCH 12/33] fix: bug in unstake that would unstake less than asked --- projects/beets-lst/functions/unStake.ts | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/projects/beets-lst/functions/unStake.ts b/projects/beets-lst/functions/unStake.ts index 26c656ed..7a712379 100644 --- a/projects/beets-lst/functions/unStake.ts +++ b/projects/beets-lst/functions/unStake.ts @@ -34,23 +34,15 @@ export async function unStake({ chainName, account, amount }: Props, { sendTrans await notify('Preparing to unstake...'); - // Convert amount to undelegate to shares amount - const sharesAmount = await publicClient.readContract({ - address: STS_ADDRESS, - abi: stsAbi, - functionName: 'convertToShares', - args: [amountInWei], - }); - // Check that the user has enough stS to undelegate - const balance = await publicClient.readContract({ + const stsBalance = await publicClient.readContract({ address: STS_ADDRESS, abi: stsAbi, functionName: 'balanceOf', args: [account], }); - if (balance < sharesAmount) { - return toResult(`You do not have enough stS to undelegate. Current balance: ${formatUnits(balance, 18)} stS`, true); + if (stsBalance < amountInWei) { + return toResult(`You do not have enough stS to undelegate. Current balance: ${formatUnits(stsBalance, 18)} stS`, true); } try { @@ -72,10 +64,7 @@ export async function unStake({ chainName, account, amount }: Props, { sendTrans data: encodeFunctionData({ abi: stsAbi, functionName: 'undelegateMany', - args: [ - [BigInt(targetValidator.validatorId)], // validatorIds array - [sharesAmount], // amountShares array - now using converted shares amount - ], + args: [[BigInt(targetValidator.validatorId)], [amountInWei]], }), }; transactions.push(tx); From 475acb5303e7b176e148e213dda378ae74b194bc Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Thu, 23 Jan 2025 12:33:39 +0100 Subject: [PATCH 13/33] refactor: actions on top of getters --- projects/beets-lst/functions/index.ts | 4 +- projects/beets-lst/tools.ts | 60 +++++++++++++-------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index 785a9fc1..15424e75 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -1,6 +1,6 @@ -export { getSonicBalance } from './getSonicBalance'; -export { getStakedSonicBalance } from './getStakedSonicBalance'; export { stake } from './stake'; export { unStake } from './unStake'; +export { getSonicBalance } from './getSonicBalance'; +export { getStakedSonicBalance } from './getStakedSonicBalance'; export { getTotalSonicInProtocol } from './getTotalSonicInProtocol'; export { getTotalStakedSonicInProtocol } from './getTotalStakedSonicInProtocol'; diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index 1d0ee251..658d2dfd 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -3,84 +3,84 @@ import { supportedChains } from './constants'; export const tools: AiTool[] = [ { - name: 'getSonicBalance', - description: 'Get the account balance of Sonic tokens (S)', - required: ['chainName', 'account'], + name: 'stake', + description: 'Stake Sonic tokens (S) and obtain in return staked Sonic tokens (stS)', + required: ['chainName', 'account', 'amount'], props: [ { name: 'chainName', type: 'string', enum: supportedChains.map(getChainName), - description: 'Chain name', + description: 'Name of chain where to stake tokens', }, { name: 'account', type: 'string', - description: 'Account address to check', + description: 'Account address that will stake tokens', + }, + { + name: 'amount', + type: 'string', + description: 'Amount of tokens for the example in decimal format', }, ], }, { - name: 'getStakedSonicBalance', - description: 'Get the account balance of staked Sonic tokens (stS)', - required: ['chainName', 'account'], + name: 'unStake', + description: 'Initiate undelegation of staked Sonic tokens (stS). Tokens can be withdrawn after 14 days.', + required: ['chainName', 'account', 'amount'], props: [ { name: 'chainName', type: 'string', enum: supportedChains.map(getChainName), - description: 'Chain name', + description: 'Name of chain where to unstake tokens', }, { name: 'account', type: 'string', - description: 'Account address to check', + description: 'Account address that will unstake tokens', + }, + { + name: 'amount', + type: 'string', + description: 'Amount of stS tokens to undelegate in decimal format', }, ], }, { - name: 'stake', - description: 'Stake Sonic tokens (S) and obtain in return staked Sonic tokens (stS)', - required: ['chainName', 'account', 'amount'], + name: 'getSonicBalance', + description: 'Get the account balance of Sonic tokens (S)', + required: ['chainName', 'account'], props: [ { name: 'chainName', type: 'string', enum: supportedChains.map(getChainName), - description: 'Name of chain where to stake tokens', + description: 'Chain name', }, { name: 'account', type: 'string', - description: 'Account address that will stake tokens', - }, - { - name: 'amount', - type: 'string', - description: 'Amount of tokens for the example in decimal format', + description: 'Account address to check', }, ], }, { - name: 'unStake', - description: 'Initiate undelegation of staked Sonic tokens (stS). Tokens can be withdrawn after 14 days.', - required: ['chainName', 'account', 'amount'], + name: 'getStakedSonicBalance', + description: 'Get the account balance of staked Sonic tokens (stS)', + required: ['chainName', 'account'], props: [ { name: 'chainName', type: 'string', enum: supportedChains.map(getChainName), - description: 'Name of chain where to unstake tokens', + description: 'Chain name', }, { name: 'account', type: 'string', - description: 'Account address that will unstake tokens', - }, - { - name: 'amount', - type: 'string', - description: 'Amount of stS tokens to undelegate in decimal format', + description: 'Account address to check', }, ], }, From 61c5437e7770d30bdfc3e3f8cf9be51cf6a8f927 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Thu, 23 Jan 2025 12:47:09 +0100 Subject: [PATCH 14/33] feat: exchange rates between S and stS --- projects/beets-lst/README.md | 2 ++ ...tProtocolSonicToStakedSonicExchangeRate.ts | 27 +++++++++++++++++++ ...tProtocolStakedSonicToSonicExchangeRate.ts | 26 ++++++++++++++++++ projects/beets-lst/functions/index.ts | 2 ++ projects/beets-lst/tools.ts | 27 +++++++++++++++++++ 5 files changed, 84 insertions(+) create mode 100644 projects/beets-lst/functions/getProtocolSonicToStakedSonicExchangeRate.ts create mode 100644 projects/beets-lst/functions/getProtocolStakedSonicToSonicExchangeRate.ts diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index 270134fa..dff9ca09 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -15,6 +15,8 @@ Integration with beets.fi Sonic liquid staking module (stS). The integration sup - "Unstake 100 stS from @beets-lst" - "Unstake all of my stS from @beets-lst" - "Withdraw all of my stS from @beets-lst" + - "How much is worth 1 stS in @beets-lst?" + - "How much is worth 1 S in @beets-lst?" 2. Information Queries - "Get my stS balance in @beets-lst" diff --git a/projects/beets-lst/functions/getProtocolSonicToStakedSonicExchangeRate.ts b/projects/beets-lst/functions/getProtocolSonicToStakedSonicExchangeRate.ts new file mode 100644 index 00000000..6d7f1412 --- /dev/null +++ b/projects/beets-lst/functions/getProtocolSonicToStakedSonicExchangeRate.ts @@ -0,0 +1,27 @@ +import { Address, formatUnits } from 'viem'; +import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { supportedChains, STS_ADDRESS } from '../constants'; +import { stsAbi } from '../abis'; + +interface Props { + chainName: string; +} + +export async function getProtocolSonicToStakedSonicExchangeRate({ chainName }: Props, { notify, getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const publicClient = getProvider(chainId); + + await notify(`Getting staked Sonic (stS) exchange rate...`); + + const inverseRate = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'convertToShares', + args: [1000000000000000000n], + }); + + return toResult(`1 S is worth ${formatUnits(inverseRate, 18)} stS`); +} diff --git a/projects/beets-lst/functions/getProtocolStakedSonicToSonicExchangeRate.ts b/projects/beets-lst/functions/getProtocolStakedSonicToSonicExchangeRate.ts new file mode 100644 index 00000000..ac5a2962 --- /dev/null +++ b/projects/beets-lst/functions/getProtocolStakedSonicToSonicExchangeRate.ts @@ -0,0 +1,26 @@ +import { Address, formatUnits } from 'viem'; +import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { supportedChains, STS_ADDRESS } from '../constants'; +import { stsAbi } from '../abis'; + +interface Props { + chainName: string; +} + +export async function getProtocolStakedSonicToSonicExchangeRate({ chainName }: Props, { notify, getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const publicClient = getProvider(chainId); + + await notify(`Getting staked Sonic (stS) exchange rate...`); + + const rate = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'getRate', + }); + + return toResult(`1 stS is worth ${formatUnits(rate, 18)} S`); +} diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index 15424e75..d042c209 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -4,3 +4,5 @@ export { getSonicBalance } from './getSonicBalance'; export { getStakedSonicBalance } from './getStakedSonicBalance'; export { getTotalSonicInProtocol } from './getTotalSonicInProtocol'; export { getTotalStakedSonicInProtocol } from './getTotalStakedSonicInProtocol'; +export { getProtocolStakedSonicToSonicExchangeRate } from './getProtocolStakedSonicToSonicExchangeRate'; +export { getProtocolSonicToStakedSonicExchangeRate } from './getProtocolSonicToStakedSonicExchangeRate'; diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index 658d2dfd..61088c10 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -110,4 +110,31 @@ export const tools: AiTool[] = [ }, ], }, + { + name: 'getProtocolStakedSonicToSonicExchangeRate', + description: 'Protocol function that gets how much is worth a staked Sonic token (stS) in Sonic tokens (S); this is defined to be equal to the share conversion rate', + required: ['chainName'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Chain name', + }, + ], + }, + { + name: 'getProtocolSonicToStakedSonicExchangeRate', + description: + 'Protocol function that gets how much is worth a Sonic token (S) in stakedSonic tokens (stS); this is defined to be equal to the inverse of the share conversion rate', + required: ['chainName'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Chain name', + }, + ], + }, ]; From 2b2363006e93df829cb168d0b85bb1fde91919a3 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Thu, 23 Jan 2025 19:26:50 +0100 Subject: [PATCH 15/33] feat: getter to show all pending and unclaimed withdrawals --- projects/beets-lst/README.md | 1 + projects/beets-lst/abis/index.ts | 1 + projects/beets-lst/abis/stsHelperAbi.ts | 182 ++++++++++++++++++ projects/beets-lst/constants.ts | 2 + .../functions/getWithdrawalRequests.ts | 110 +++++++++++ projects/beets-lst/functions/index.ts | 1 + projects/beets-lst/tools.ts | 19 ++ 7 files changed, 316 insertions(+) create mode 100644 projects/beets-lst/abis/stsHelperAbi.ts create mode 100644 projects/beets-lst/functions/getWithdrawalRequests.ts diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index dff9ca09..e85d2c01 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -13,6 +13,7 @@ Integration with beets.fi Sonic liquid staking module (stS). The integration sup - "Stake 100 S in @beets-lst" - "Stake half of my Sonic in @beets-lst" - "Unstake 100 stS from @beets-lst" + - "Unstake 100 S worth of stS from @beets-lst" - "Unstake all of my stS from @beets-lst" - "Withdraw all of my stS from @beets-lst" - "How much is worth 1 stS in @beets-lst?" diff --git a/projects/beets-lst/abis/index.ts b/projects/beets-lst/abis/index.ts index e8ad8809..a0e807a0 100644 --- a/projects/beets-lst/abis/index.ts +++ b/projects/beets-lst/abis/index.ts @@ -1 +1,2 @@ export * from './stsAbi'; +export * from './stsHelperAbi'; diff --git a/projects/beets-lst/abis/stsHelperAbi.ts b/projects/beets-lst/abis/stsHelperAbi.ts new file mode 100644 index 00000000..9068fd7d --- /dev/null +++ b/projects/beets-lst/abis/stsHelperAbi.ts @@ -0,0 +1,182 @@ +export const stsHelperAbi = [ + { + inputs: [ + { + internalType: 'address payable', + name: '_sonicStaking', + type: 'address', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + inputs: [], + name: 'UserWithdrawsMaxSizeCannotBeZero', + type: 'error', + }, + { + inputs: [], + name: 'UserWithdrawsSkipTooLarge', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'user', + type: 'address', + }, + { + internalType: 'uint256', + name: 'skip', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'maxSize', + type: 'uint256', + }, + { + internalType: 'bool', + name: 'reverseOrder', + type: 'bool', + }, + ], + name: 'getUserWithdraws', + outputs: [ + { + components: [ + { + internalType: 'uint256', + name: 'id', + type: 'uint256', + }, + { + internalType: 'enum SonicStaking.WithdrawKind', + name: 'kind', + type: 'uint8', + }, + { + internalType: 'uint256', + name: 'validatorId', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'assetAmount', + type: 'uint256', + }, + { + internalType: 'bool', + name: 'isWithdrawn', + type: 'bool', + }, + { + internalType: 'uint256', + name: 'requestTimestamp', + type: 'uint256', + }, + { + internalType: 'address', + name: 'user', + type: 'address', + }, + ], + internalType: 'struct SonicStakingWithdrawRequestHelper.WithdrawRequest[]', + name: 'withdraws', + type: 'tuple[]', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'user', + type: 'address', + }, + ], + name: 'getUserWithdrawsCount', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'withdrawId', + type: 'uint256', + }, + ], + name: 'getWithdrawRequest', + outputs: [ + { + components: [ + { + internalType: 'uint256', + name: 'id', + type: 'uint256', + }, + { + internalType: 'enum SonicStaking.WithdrawKind', + name: 'kind', + type: 'uint8', + }, + { + internalType: 'uint256', + name: 'validatorId', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'assetAmount', + type: 'uint256', + }, + { + internalType: 'bool', + name: 'isWithdrawn', + type: 'bool', + }, + { + internalType: 'uint256', + name: 'requestTimestamp', + type: 'uint256', + }, + { + internalType: 'address', + name: 'user', + type: 'address', + }, + ], + internalType: 'struct SonicStakingWithdrawRequestHelper.WithdrawRequest', + name: '', + type: 'tuple', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'sonicStaking', + outputs: [ + { + internalType: 'contract SonicStaking', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, +] as const; diff --git a/projects/beets-lst/constants.ts b/projects/beets-lst/constants.ts index 97cd19ff..f1e1b980 100644 --- a/projects/beets-lst/constants.ts +++ b/projects/beets-lst/constants.ts @@ -3,3 +3,5 @@ import { ChainId } from '@heyanon/sdk'; export const supportedChains = [ChainId.SONIC]; export const STS_ADDRESS = '0xe5da20f15420ad15de0fa650600afc998bbe3955'; + +export const STS_HELPER_ADDRESS = '0x52b16e3d7d25ba64f242e59f9a74799ecc432d78'; diff --git a/projects/beets-lst/functions/getWithdrawalRequests.ts b/projects/beets-lst/functions/getWithdrawalRequests.ts new file mode 100644 index 00000000..41beef42 --- /dev/null +++ b/projects/beets-lst/functions/getWithdrawalRequests.ts @@ -0,0 +1,110 @@ +import { Address, formatUnits } from 'viem'; +import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { supportedChains, STS_ADDRESS, STS_HELPER_ADDRESS } from '../constants'; +import { stsAbi, stsHelperAbi } from '../abis'; + +interface Props { + chainName: string; + account: Address; +} + +interface WithdrawRequestInfo { + id: number; + amount: string; + readyTime: Date; + isReady: boolean; + timeRemaining: string | null; + index: number; +} + +function formatTimeRemaining(remainingSeconds: number): string { + if (remainingSeconds <= 0) return 'Ready to claim'; + + const days = Math.floor(remainingSeconds / (24 * 3600)); + const hours = Math.floor((remainingSeconds % (24 * 3600)) / 3600); + const minutes = Math.floor((remainingSeconds % 3600) / 60); + + const parts = []; + if (days > 0) parts.push(`${days} day${days !== 1 ? 's' : ''}`); + if (hours > 0) parts.push(`${hours} hour${hours !== 1 ? 's' : ''}`); + if (minutes > 0 && days === 0) parts.push(`${minutes} minute${minutes !== 1 ? 's' : ''}`); + + return parts.length > 0 ? `${parts.join(' and ')} to claim` : 'Less than a minute to claim'; +} + +export async function getWithdrawalRequests({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const publicClient = getProvider(chainId); + + await notify(`Getting existing withdrawal requests...`); + + // Get the withdraw delay period + const withdrawDelay = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'withdrawDelay', + }); + + // Get the total number of withdraws for pagination + const numWithdraws = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'userNumWithdraws', + args: [account], + }); + + if (numWithdraws === 0n) { + return toResult('No pending or unclaimed withdrawals found'); + } + + // Get all withdraws for the user + const withdraws = await publicClient.readContract({ + address: STS_HELPER_ADDRESS, + abi: stsHelperAbi, + functionName: 'getUserWithdraws', + args: [account, 0n, numWithdraws, false], // Get all withdraws, not reversed + }); + + const currentTime = Math.floor(Date.now() / 1000); + const pendingWithdraws: WithdrawRequestInfo[] = []; + + // Process each withdraw request + for (let i = 0; i < withdraws.length; i++) { + const withdraw = withdraws[i]; + // Skip if already withdrawn + if (withdraw.isWithdrawn) continue; + + const readyTimestamp = Number(withdraw.requestTimestamp) + Number(withdrawDelay); + const remainingTime = readyTimestamp - currentTime; + const isReady = remainingTime <= 0; + + pendingWithdraws.push({ + id: Number(withdraw.id), + amount: formatUnits(withdraw.assetAmount, 18), + readyTime: new Date(readyTimestamp * 1000), + isReady, + timeRemaining: formatTimeRemaining(remainingTime), + index: i, + }); + } + + if (pendingWithdraws.length === 0) { + return toResult('No pending withdrawals found'); + } + + // Sort withdraws: ready first, then by timestamp + pendingWithdraws.sort((a, b) => { + if (a.isReady !== b.isReady) { + return a.isReady ? -1 : 1; + } + return a.readyTime.getTime() - b.readyTime.getTime(); + }); + + // Format the response with withdraw IDs + const withdrawalsList = pendingWithdraws.map((w) => `- Withdraw ID ${w.id}: ${w.amount} S (${w.timeRemaining})`).join('\n'); + + return toResult(`Pending withdrawals:\n${withdrawalsList}`); +} diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index d042c209..fdf53289 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -6,3 +6,4 @@ export { getTotalSonicInProtocol } from './getTotalSonicInProtocol'; export { getTotalStakedSonicInProtocol } from './getTotalStakedSonicInProtocol'; export { getProtocolStakedSonicToSonicExchangeRate } from './getProtocolStakedSonicToSonicExchangeRate'; export { getProtocolSonicToStakedSonicExchangeRate } from './getProtocolSonicToStakedSonicExchangeRate'; +export { getWithdrawalRequests } from './getWithdrawalRequests'; diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index 61088c10..60ff1d0a 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -137,4 +137,23 @@ export const tools: AiTool[] = [ }, ], }, + { + name: 'getWithdrawalRequests', + description: + 'Get the list of pending withdrawals for an account, along with their Withdraw ID, showing which ones are ready to be claimed and which ones are still waiting for the 14-day period to elapse', + required: ['chainName', 'account'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Chain name', + }, + { + name: 'account', + type: 'string', + description: 'Account address to check withdrawals for', + }, + ], + }, ]; From f8c3a575e30015182142bcabf1e7558d5a189fb2 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Thu, 23 Jan 2025 19:38:16 +0100 Subject: [PATCH 16/33] minor: include TX in unstake output --- projects/beets-lst/functions/stake.ts | 9 +++------ projects/beets-lst/functions/unStake.ts | 11 ++++------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/projects/beets-lst/functions/stake.ts b/projects/beets-lst/functions/stake.ts index fa6e31b7..8acfb5f0 100644 --- a/projects/beets-lst/functions/stake.ts +++ b/projects/beets-lst/functions/stake.ts @@ -19,7 +19,7 @@ export async function stake({ chainName, account, amount }: Props, { sendTransac if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); - await notify('Preparing to stake Sonic tokens (S) in Beets.fi liquid staking module...'); + await notify(`Preparing to stake ${amount} S...`); const amountInWei = parseUnits(amount, 18); if (amountInWei === 0n) return toResult('Amount must be greater than 0', true); @@ -42,9 +42,6 @@ export async function stake({ chainName, account, amount }: Props, { sendTransac await notify('Sending transaction...'); const result = await sendTransactions({ chainId, account, transactions }); - - // TODO: handle output properly - const stakeMessage = result.data[result.data.length - 1]; - - return toResult(result.isMultisig ? stakeMessage.message : `Successfully staked ${amount} S in Beets.fi liquid staking module. ${stakeMessage.message}`); + const message = result.data[result.data.length - 1].message; + return toResult(result.isMultisig ? message : `Successfully staked ${amount} S. ${message}`); } diff --git a/projects/beets-lst/functions/unStake.ts b/projects/beets-lst/functions/unStake.ts index 7a712379..438f2b33 100644 --- a/projects/beets-lst/functions/unStake.ts +++ b/projects/beets-lst/functions/unStake.ts @@ -32,7 +32,7 @@ export async function unStake({ chainName, account, amount }: Props, { sendTrans // Get the public client to read contract data const publicClient = getProvider(chainId); - await notify('Preparing to unstake...'); + await notify(`Preparing to unstake ${amount} stS...`); // Check that the user has enough stS to undelegate const stsBalance = await publicClient.readContract({ @@ -72,12 +72,9 @@ export async function unStake({ chainName, account, amount }: Props, { sendTrans await notify('Sending transaction...'); const result = await sendTransactions({ chainId, account, transactions }); - return toResult( - result.isMultisig - ? result.data[result.data.length - 1].message - : `Successfully initiated undelegation of ${amount} stS from Beets.fi liquid staking module. You can withdraw your Sonic tokens after 14 days.`, - ); + const message = result.data[result.data.length - 1].message; + return toResult(result.isMultisig ? message : `Successfully initiated unstaking of ${amount} stS. You can withdraw your Sonic tokens after 14 days. ${message}`); } catch (error) { - return toResult(`Failed to undelegate: ${error instanceof Error ? error.message : 'Unknown error'}`, true); + return toResult(`Failed to ustake: ${error instanceof Error ? error.message : 'Unknown error'}`, true); } } From afaa4e3e7f18ad3ca250fe0f6a52cea232f0d8d0 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Thu, 23 Jan 2025 21:21:44 +0100 Subject: [PATCH 17/33] feat: withdrawal actions --- projects/beets-lst/README.md | 29 ++-- projects/beets-lst/examples/askBeets.ts | 2 +- .../functions/getOpenWithdrawalRequests.ts | 39 +++++ .../functions/getWithdrawalRequests.ts | 110 ------------- projects/beets-lst/functions/index.ts | 4 +- projects/beets-lst/functions/withdraw.ts | 56 +++++++ projects/beets-lst/functions/withdrawAll.ts | 46 ++++++ projects/beets-lst/helpers/withdrawals.ts | 151 ++++++++++++++++++ projects/beets-lst/tools.ts | 45 +++++- 9 files changed, 356 insertions(+), 126 deletions(-) create mode 100644 projects/beets-lst/functions/getOpenWithdrawalRequests.ts delete mode 100644 projects/beets-lst/functions/getWithdrawalRequests.ts create mode 100644 projects/beets-lst/functions/withdraw.ts create mode 100644 projects/beets-lst/functions/withdrawAll.ts create mode 100644 projects/beets-lst/helpers/withdrawals.ts diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index e85d2c01..4eee6b49 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -10,18 +10,23 @@ Integration with beets.fi Sonic liquid staking module (stS). The integration sup 1. Basic Operations - - "Stake 100 S in @beets-lst" - - "Stake half of my Sonic in @beets-lst" - - "Unstake 100 stS from @beets-lst" - - "Unstake 100 S worth of stS from @beets-lst" - - "Unstake all of my stS from @beets-lst" - - "Withdraw all of my stS from @beets-lst" - - "How much is worth 1 stS in @beets-lst?" - - "How much is worth 1 S in @beets-lst?" - -2. Information Queries - - "Get my stS balance in @beets-lst" - - "How long before I can withdraw S from @beets-lst?" + - **Staking** + - "Stake 100 S in @beets-lst" + - "Stake half of my Sonic in @beets-lst" + - "How many stS do I have in @beets-lst + - **Unstaking** + - "Unstake 100 stS from @beets-lst" + - "Unstake all of my stS from @beets-lst" + - "Unstake 100 S worth of stS from @beets-lst" + - **Withdrawing** + - "How long before I can withdraw from @beets-lst?" + - "Show open withdrawals from @beets-lst" + - "Claim from @beets-lst" + - "Claim all from @beets-lst" + - **Info** + - "How much is worth 1 stS in @beets-lst?" + - "How much is worth 1 S in @beets-lst?" + - "How much Sonic is in the protocol @beets-lst?" ## Available Functions diff --git a/projects/beets-lst/examples/askBeets.ts b/projects/beets-lst/examples/askBeets.ts index e73f7ae4..f36b67f4 100644 --- a/projects/beets-lst/examples/askBeets.ts +++ b/projects/beets-lst/examples/askBeets.ts @@ -161,7 +161,7 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro // Combine results into a single response if (results.length === 0) { - return toResult('No operations were performed.', true); + return toResult('Could not identify any operations to perform.', true); } else if (results.length === 1) { return results[0]; } diff --git a/projects/beets-lst/functions/getOpenWithdrawalRequests.ts b/projects/beets-lst/functions/getOpenWithdrawalRequests.ts new file mode 100644 index 00000000..c723781f --- /dev/null +++ b/projects/beets-lst/functions/getOpenWithdrawalRequests.ts @@ -0,0 +1,39 @@ +import { Address } from 'viem'; +import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { supportedChains } from '../constants'; +import { getOpenWithdrawalRequests as getOpenWithdrawalRequestsHelper } from '../helpers/withdrawals'; + +interface Props { + chainName: string; + account: Address; +} + +export async function getOpenWithdrawalRequests({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const publicClient = getProvider(chainId); + + await notify(`Getting existing withdrawal requests...`); + + // Get all withdraws for the user, including non-claimable ones + const withdraws = await getOpenWithdrawalRequestsHelper(account, publicClient, false); + + if (withdraws.length === 0) { + return toResult('No pending or unclaimed withdrawals found'); + } + + // Sort withdraws: ready first, then by timestamp + withdraws.sort((a, b) => { + if (a.isReady !== b.isReady) { + return a.isReady ? -1 : 1; + } + return a.readyTime.getTime() - b.readyTime.getTime(); + }); + + // Format the response with withdraw IDs + const withdrawalsList = withdraws.map((w) => `- Withdraw ID ${w.id}: ${w.amount} S (${w.timeRemaining})`).join('\n'); + + return toResult(`Pending withdrawals:\n${withdrawalsList}`); +} diff --git a/projects/beets-lst/functions/getWithdrawalRequests.ts b/projects/beets-lst/functions/getWithdrawalRequests.ts deleted file mode 100644 index 41beef42..00000000 --- a/projects/beets-lst/functions/getWithdrawalRequests.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Address, formatUnits } from 'viem'; -import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; -import { supportedChains, STS_ADDRESS, STS_HELPER_ADDRESS } from '../constants'; -import { stsAbi, stsHelperAbi } from '../abis'; - -interface Props { - chainName: string; - account: Address; -} - -interface WithdrawRequestInfo { - id: number; - amount: string; - readyTime: Date; - isReady: boolean; - timeRemaining: string | null; - index: number; -} - -function formatTimeRemaining(remainingSeconds: number): string { - if (remainingSeconds <= 0) return 'Ready to claim'; - - const days = Math.floor(remainingSeconds / (24 * 3600)); - const hours = Math.floor((remainingSeconds % (24 * 3600)) / 3600); - const minutes = Math.floor((remainingSeconds % 3600) / 60); - - const parts = []; - if (days > 0) parts.push(`${days} day${days !== 1 ? 's' : ''}`); - if (hours > 0) parts.push(`${hours} hour${hours !== 1 ? 's' : ''}`); - if (minutes > 0 && days === 0) parts.push(`${minutes} minute${minutes !== 1 ? 's' : ''}`); - - return parts.length > 0 ? `${parts.join(' and ')} to claim` : 'Less than a minute to claim'; -} - -export async function getWithdrawalRequests({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); - if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); - if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); - - const publicClient = getProvider(chainId); - - await notify(`Getting existing withdrawal requests...`); - - // Get the withdraw delay period - const withdrawDelay = await publicClient.readContract({ - address: STS_ADDRESS, - abi: stsAbi, - functionName: 'withdrawDelay', - }); - - // Get the total number of withdraws for pagination - const numWithdraws = await publicClient.readContract({ - address: STS_ADDRESS, - abi: stsAbi, - functionName: 'userNumWithdraws', - args: [account], - }); - - if (numWithdraws === 0n) { - return toResult('No pending or unclaimed withdrawals found'); - } - - // Get all withdraws for the user - const withdraws = await publicClient.readContract({ - address: STS_HELPER_ADDRESS, - abi: stsHelperAbi, - functionName: 'getUserWithdraws', - args: [account, 0n, numWithdraws, false], // Get all withdraws, not reversed - }); - - const currentTime = Math.floor(Date.now() / 1000); - const pendingWithdraws: WithdrawRequestInfo[] = []; - - // Process each withdraw request - for (let i = 0; i < withdraws.length; i++) { - const withdraw = withdraws[i]; - // Skip if already withdrawn - if (withdraw.isWithdrawn) continue; - - const readyTimestamp = Number(withdraw.requestTimestamp) + Number(withdrawDelay); - const remainingTime = readyTimestamp - currentTime; - const isReady = remainingTime <= 0; - - pendingWithdraws.push({ - id: Number(withdraw.id), - amount: formatUnits(withdraw.assetAmount, 18), - readyTime: new Date(readyTimestamp * 1000), - isReady, - timeRemaining: formatTimeRemaining(remainingTime), - index: i, - }); - } - - if (pendingWithdraws.length === 0) { - return toResult('No pending withdrawals found'); - } - - // Sort withdraws: ready first, then by timestamp - pendingWithdraws.sort((a, b) => { - if (a.isReady !== b.isReady) { - return a.isReady ? -1 : 1; - } - return a.readyTime.getTime() - b.readyTime.getTime(); - }); - - // Format the response with withdraw IDs - const withdrawalsList = pendingWithdraws.map((w) => `- Withdraw ID ${w.id}: ${w.amount} S (${w.timeRemaining})`).join('\n'); - - return toResult(`Pending withdrawals:\n${withdrawalsList}`); -} diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index fdf53289..0f21ef58 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -1,9 +1,11 @@ export { stake } from './stake'; export { unStake } from './unStake'; +export { withdraw } from './withdraw'; +export { withdrawAll } from './withdrawAll'; export { getSonicBalance } from './getSonicBalance'; export { getStakedSonicBalance } from './getStakedSonicBalance'; export { getTotalSonicInProtocol } from './getTotalSonicInProtocol'; export { getTotalStakedSonicInProtocol } from './getTotalStakedSonicInProtocol'; export { getProtocolStakedSonicToSonicExchangeRate } from './getProtocolStakedSonicToSonicExchangeRate'; export { getProtocolSonicToStakedSonicExchangeRate } from './getProtocolSonicToStakedSonicExchangeRate'; -export { getWithdrawalRequests } from './getWithdrawalRequests'; +export { getOpenWithdrawalRequests } from './getOpenWithdrawalRequests'; diff --git a/projects/beets-lst/functions/withdraw.ts b/projects/beets-lst/functions/withdraw.ts new file mode 100644 index 00000000..81557218 --- /dev/null +++ b/projects/beets-lst/functions/withdraw.ts @@ -0,0 +1,56 @@ +import { Address, encodeFunctionData } from 'viem'; +import { FunctionReturn, toResult, getChainFromName, FunctionOptions, TransactionParams } from '@heyanon/sdk'; +import { supportedChains, STS_ADDRESS } from '../constants'; +import { stsAbi } from '../abis'; +import { getWithdrawalRequestInfo } from '../helpers/withdrawals'; + +interface Props { + chainName: string; + account: Address; + withdrawId: string; +} + +export async function withdraw({ chainName, account, withdrawId }: Props, { sendTransactions, notify, getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const publicClient = getProvider(chainId); + + await notify(`Preparing to claim withdraw with ID ${withdrawId}...`); + + const withdrawRequest = await getWithdrawalRequestInfo(Number(withdrawId), publicClient); + + if (!withdrawRequest) { + return toResult(`Withdraw request with ID ${withdrawId} does not exist; try asking for your withdrawal requests`, true); + } + + if (withdrawRequest.user !== account) { + return toResult(`Withdraw request with ID ${withdrawId} does not belong to you; try asking for your withdrawal requests`, true); + } + + if (withdrawRequest.isWithdrawn) { + return toResult(`Withdraw request with ID ${withdrawId} has already been claimed`, true); + } + + if (!withdrawRequest.isReady) { + return toResult(`Withdraw request with ID ${withdrawId} is not ready to be claimed; try again in ${withdrawRequest.timeRemaining}`, true); + } + + const transactions: TransactionParams[] = []; + const tx: TransactionParams = { + target: STS_ADDRESS, + data: encodeFunctionData({ + abi: stsAbi, + functionName: 'withdraw', + args: [BigInt(withdrawId), false], // emergency hardcoded to false + }), + }; + transactions.push(tx); + + await notify('Sending transaction...'); + + const result = await sendTransactions({ chainId, account, transactions }); + const message = result.data[result.data.length - 1].message; + return toResult(result.isMultisig ? message : `Successfully withdrew ${withdrawRequest.amount} S. ${message}`); +} diff --git a/projects/beets-lst/functions/withdrawAll.ts b/projects/beets-lst/functions/withdrawAll.ts new file mode 100644 index 00000000..3f21fa80 --- /dev/null +++ b/projects/beets-lst/functions/withdrawAll.ts @@ -0,0 +1,46 @@ +import { Address, encodeFunctionData } from 'viem'; +import { FunctionReturn, toResult, getChainFromName, FunctionOptions, TransactionParams } from '@heyanon/sdk'; +import { supportedChains, STS_ADDRESS } from '../constants'; +import { stsAbi } from '../abis'; +import { getOpenWithdrawalRequests } from '../helpers/withdrawals'; + +interface Props { + chainName: string; + account: Address; +} + +export async function withdrawAll({ chainName, account }: Props, { sendTransactions, notify, getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const publicClient = getProvider(chainId); + + await notify('Checking for claimable withdrawals...'); + + const claimableWithdraws = await getOpenWithdrawalRequests(account, publicClient, true); + + if (claimableWithdraws.length === 0) { + return toResult(`No withdrawals ready to be claimed`); + } + + const withdrawIds = claimableWithdraws.map((w) => BigInt(w.id)); + const totalAmount = claimableWithdraws.reduce((sum, w) => sum + Number(w.amount), 0); + + const transactions: TransactionParams[] = []; + const tx: TransactionParams = { + target: STS_ADDRESS, + data: encodeFunctionData({ + abi: stsAbi, + functionName: 'withdrawMany', + args: [withdrawIds, false], // emergency hardcoded to false + }), + }; + transactions.push(tx); + + await notify(`Sending transaction to withdraw ${claimableWithdraws.length} requests...`); + + const result = await sendTransactions({ chainId, account, transactions }); + const message = result.data[result.data.length - 1].message; + return toResult(result.isMultisig ? message : `Successfully withdrew ${totalAmount} S from ${claimableWithdraws.length} requests. ${message}`); +} diff --git a/projects/beets-lst/helpers/withdrawals.ts b/projects/beets-lst/helpers/withdrawals.ts new file mode 100644 index 00000000..d9e8004f --- /dev/null +++ b/projects/beets-lst/helpers/withdrawals.ts @@ -0,0 +1,151 @@ +import { Address, formatUnits, PublicClient } from 'viem'; +import { STS_ADDRESS, STS_HELPER_ADDRESS } from '../constants'; +import { stsAbi, stsHelperAbi } from '../abis'; + +/** + * Information about a withdraw request + */ +export interface WithdrawRequestInfo { + id: number; + amount: string; + readyTime: Date; + isReady: boolean; + isWithdrawn: boolean; + timeRemaining: string | null; + user: Address; +} + +/** + * Information about a withdraw request, mirrors the smart contract + * struct with the same name + */ +export interface WithdrawRequest { + id: bigint; + kind: number; + validatorId: bigint; + assetAmount: bigint; + isWithdrawn: boolean; + requestTimestamp: bigint; + user: `0x${string}`; +} + +/** + * Get all open withdrawal requests for a user, that is, all withdrawal + * requests that are either pending or ready to be claimed + */ +export async function getOpenWithdrawalRequests(account: Address, publicClient: PublicClient, onlyClaimable: boolean = false): Promise { + // Get the withdraw delay period + const withdrawDelay = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'withdrawDelay', + }); + + // Get the total number of withdraws + const numWithdraws = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'userNumWithdraws', + args: [account], + }); + + if (numWithdraws === 0n) { + return []; + } + + // Get all withdraws for the user + const withdrawals = await publicClient.readContract({ + address: STS_HELPER_ADDRESS, + abi: stsHelperAbi, + functionName: 'getUserWithdraws', + args: [account, 0n, numWithdraws, false], + }); + + const openWithdrawals: WithdrawRequestInfo[] = []; + + for (let i = 0; i < withdrawals.length; i++) { + const withdrawal = toWithdrawRequestInfo(withdrawals[i], withdrawDelay); + + if (withdrawal.isWithdrawn) continue; + + if (withdrawal.isReady || !onlyClaimable) { + openWithdrawals.push(withdrawal); + } + } + + return openWithdrawals; +} + +/** + * Get a withdrawal request from the smart contract, by its ID; return null if + * the withdrawal request does not exist + */ +export async function getWithdrawalRequest(withdrawId: number, publicClient: PublicClient): Promise { + const withdrawRequest = await publicClient.readContract({ + address: STS_HELPER_ADDRESS, + abi: stsHelperAbi, + functionName: 'getWithdrawRequest', + args: [BigInt(withdrawId)], + }); + + if (!withdrawRequest) return null; + + return withdrawRequest; +} + +/** + * Get a withdrawal request by its ID and conver it to a WithdrawReqeustInfo + * object; to do so, we need to get the withdraw delay period from the + * smart contract: use this function sparingly + */ +export async function getWithdrawalRequestInfo(withdrawId: number, publicClient: PublicClient): Promise { + const withdrawRequest = await getWithdrawalRequest(withdrawId, publicClient); + if (!withdrawRequest) return null; + + const withdrawDelay = await publicClient.readContract({ + address: STS_ADDRESS, + abi: stsAbi, + functionName: 'withdrawDelay', + }); + + return toWithdrawRequestInfo(withdrawRequest, withdrawDelay); +} + +/** + * Convert a WithdrawRequest struct from the smart contract to a + * WithdrawRequestInfo typescript object, which is a more user-friendly + * representation + */ +export function toWithdrawRequestInfo(withdrawRequest: WithdrawRequest, withdrawDelay: bigint): WithdrawRequestInfo { + const currentTime = Math.floor(Date.now() / 1000); + const readyTimestamp = Number(withdrawRequest.requestTimestamp) + Number(withdrawDelay); + const remainingTime = readyTimestamp - currentTime; + + return { + id: Number(withdrawRequest.id), + amount: formatUnits(withdrawRequest.assetAmount, 18), + readyTime: new Date(readyTimestamp * 1000), + isReady: remainingTime <= 0, + isWithdrawn: withdrawRequest.isWithdrawn, + timeRemaining: formatTimeRemaining(remainingTime), + user: withdrawRequest.user, + }; +} + +/** + * Format the remaining time until a withdraw request can be claimed + */ +export function formatTimeRemaining(remainingSeconds: number): string { + if (remainingSeconds <= 0) return 'Ready to claim'; + + const days = Math.floor(remainingSeconds / (24 * 3600)); + const hours = Math.floor((remainingSeconds % (24 * 3600)) / 3600); + const minutes = Math.floor((remainingSeconds % 3600) / 60); + + const parts = []; + if (days > 0) parts.push(`${days} day${days !== 1 ? 's' : ''}`); + if (hours > 0) parts.push(`${hours} hour${hours !== 1 ? 's' : ''}`); + if (minutes > 0 && days === 0) parts.push(`${minutes} minute${minutes !== 1 ? 's' : ''}`); + + return parts.length > 0 ? `${parts.join(' and ')} to claim` : 'Less than a minute to claim'; +} diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index 60ff1d0a..394b328e 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -48,6 +48,47 @@ export const tools: AiTool[] = [ }, ], }, + { + name: 'withdraw', + description: 'Claim Sonic tokens (S) for the withdrawal request identified by the provided ID', + required: ['chainName', 'account', 'withdrawId'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Chain name', + }, + { + name: 'account', + type: 'string', + description: 'Account address to withdraw tokens to', + }, + { + name: 'withdrawId', + type: 'string', + description: 'ID of the withdrawal request to process', + }, + ], + }, + { + name: 'withdrawAll', + description: 'Claim Sonic tokens (S) from all withdrawal requests that have completed the 14-day waiting period', + required: ['chainName', 'account'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Chain name', + }, + { + name: 'account', + type: 'string', + description: 'Account address to withdraw tokens to', + }, + ], + }, { name: 'getSonicBalance', description: 'Get the account balance of Sonic tokens (S)', @@ -138,9 +179,9 @@ export const tools: AiTool[] = [ ], }, { - name: 'getWithdrawalRequests', + name: 'getOpenWithdrawalRequests', description: - 'Get the list of pending withdrawals for an account, along with their Withdraw ID, showing which ones are ready to be claimed and which ones are still waiting for the 14-day period to elapse', + 'Get the list of open withdrawals for the user. A withdrawal is open if it is either ready to be claimed or waiting for the 14-day period to elapse. The withdrawal ID will be shown for each withdrawal.', required: ['chainName', 'account'], props: [ { From afa753c334c3a57819a0aaf80a57c26db40c161c Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Fri, 24 Jan 2025 17:15:56 +0100 Subject: [PATCH 18/33] minor: Implement minimum deposit & unstake limits --- projects/beets-lst/constants.ts | 4 ++++ .../functions/getProtocolSonicToStakedSonicExchangeRate.ts | 2 +- projects/beets-lst/functions/stake.ts | 5 +++-- projects/beets-lst/functions/unStake.ts | 4 ++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/projects/beets-lst/constants.ts b/projects/beets-lst/constants.ts index f1e1b980..6ba35a56 100644 --- a/projects/beets-lst/constants.ts +++ b/projects/beets-lst/constants.ts @@ -5,3 +5,7 @@ export const supportedChains = [ChainId.SONIC]; export const STS_ADDRESS = '0xe5da20f15420ad15de0fa650600afc998bbe3955'; export const STS_HELPER_ADDRESS = '0x52b16e3d7d25ba64f242e59f9a74799ecc432d78'; + +export const MIN_DEPOSIT_IN_WEI = 10000000000000000n; + +export const MIN_UNDELEGATE_IN_WEI = 1000000000000n; diff --git a/projects/beets-lst/functions/getProtocolSonicToStakedSonicExchangeRate.ts b/projects/beets-lst/functions/getProtocolSonicToStakedSonicExchangeRate.ts index 6d7f1412..414d1e84 100644 --- a/projects/beets-lst/functions/getProtocolSonicToStakedSonicExchangeRate.ts +++ b/projects/beets-lst/functions/getProtocolSonicToStakedSonicExchangeRate.ts @@ -1,4 +1,4 @@ -import { Address, formatUnits } from 'viem'; +import { formatUnits } from 'viem'; import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS } from '../constants'; import { stsAbi } from '../abis'; diff --git a/projects/beets-lst/functions/stake.ts b/projects/beets-lst/functions/stake.ts index 8acfb5f0..0590f35f 100644 --- a/projects/beets-lst/functions/stake.ts +++ b/projects/beets-lst/functions/stake.ts @@ -1,6 +1,6 @@ -import { Address, encodeFunctionData, parseUnits } from 'viem'; +import { Address, encodeFunctionData, parseUnits, formatUnits } from 'viem'; import { FunctionReturn, FunctionOptions, TransactionParams, toResult, getChainFromName, checkToApprove } from '@heyanon/sdk'; -import { supportedChains, STS_ADDRESS } from '../constants'; +import { supportedChains, STS_ADDRESS, MIN_DEPOSIT_IN_WEI } from '../constants'; import { stsAbi } from '../abis'; interface Props { @@ -24,6 +24,7 @@ export async function stake({ chainName, account, amount }: Props, { sendTransac const amountInWei = parseUnits(amount, 18); if (amountInWei === 0n) return toResult('Amount must be greater than 0', true); if (amountInWei < parseUnits('0.01', 18)) return toResult('Amount must be greater than 0.01 S', true); + if (amountInWei < MIN_DEPOSIT_IN_WEI) return toResult(`Amount must be greater than ${formatUnits(MIN_DEPOSIT_IN_WEI, 18)} S`, true); const transactions: TransactionParams[] = []; diff --git a/projects/beets-lst/functions/unStake.ts b/projects/beets-lst/functions/unStake.ts index 438f2b33..1716feb5 100644 --- a/projects/beets-lst/functions/unStake.ts +++ b/projects/beets-lst/functions/unStake.ts @@ -1,6 +1,6 @@ import { Address, encodeFunctionData, formatUnits, parseUnits } from 'viem'; import { FunctionReturn, FunctionOptions, TransactionParams, toResult, getChainFromName } from '@heyanon/sdk'; -import { supportedChains, STS_ADDRESS } from '../constants'; +import { supportedChains, STS_ADDRESS, MIN_UNDELEGATE_IN_WEI } from '../constants'; import { stsAbi } from '../abis'; import { fetchValidators, findHighestDelegatedValidator } from '../helpers/client'; @@ -27,7 +27,7 @@ export async function unStake({ chainName, account, amount }: Props, { sendTrans if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); const amountInWei = parseUnits(amount, 18); - if (amountInWei === 0n) return toResult('Amount must be greater than 0', true); + if (amountInWei < MIN_UNDELEGATE_IN_WEI) return toResult(`Amount must be greater than ${formatUnits(MIN_UNDELEGATE_IN_WEI, 18)} stS`, true); // Get the public client to read contract data const publicClient = getProvider(chainId); From bfcc6989e2b393ed8ac7f1c6c0405496693fe57d Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Fri, 24 Jan 2025 17:30:58 +0100 Subject: [PATCH 19/33] minor: removed 'claim' in favor of 'withdraw' --- projects/beets-lst/README.md | 22 ++++++++++++++----- ...Requests.ts => getOpenWithdrawRequests.ts} | 8 +++---- projects/beets-lst/functions/index.ts | 2 +- projects/beets-lst/functions/withdraw.ts | 10 ++++----- projects/beets-lst/functions/withdrawAll.ts | 14 ++++++------ projects/beets-lst/helpers/withdrawals.ts | 16 +++++++------- projects/beets-lst/index.ts | 3 ++- projects/beets-lst/tools.ts | 10 ++++----- 8 files changed, 48 insertions(+), 37 deletions(-) rename projects/beets-lst/functions/{getOpenWithdrawalRequests.ts => getOpenWithdrawRequests.ts} (74%) diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index 4eee6b49..6d7780d8 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -1,6 +1,6 @@ # beets-lst -Integration with beets.fi Sonic liquid staking module (stS). The integration supports staking S into stS and unstaking back to S. The unstaking is a 2-step process: first undelegate, then claim Sonic after 14 days. +Integration with beets.fi Sonic liquid staking module (stS). ## Supported Networks @@ -13,16 +13,16 @@ Integration with beets.fi Sonic liquid staking module (stS). The integration sup - **Staking** - "Stake 100 S in @beets-lst" - "Stake half of my Sonic in @beets-lst" - - "How many stS do I have in @beets-lst + - "How many stS do I have in @beets-lst?" - **Unstaking** - "Unstake 100 stS from @beets-lst" - "Unstake all of my stS from @beets-lst" - "Unstake 100 S worth of stS from @beets-lst" - **Withdrawing** - "How long before I can withdraw from @beets-lst?" - - "Show open withdrawals from @beets-lst" - - "Claim from @beets-lst" - - "Claim all from @beets-lst" + - "Show withdrawal requests from @beets-lst" + - "Withdraw from @beets-lst" + - "Withdraw all from @beets-lst" - **Info** - "How much is worth 1 stS in @beets-lst?" - "How much is worth 1 S in @beets-lst?" @@ -30,7 +30,17 @@ Integration with beets.fi Sonic liquid staking module (stS). The integration sup ## Available Functions -List of available functions will be added here. +- [stake](functions/stake.ts) +- [unStake](functions/unStake.ts) +- [withdraw](functions/withdraw.ts) +- [withdrawAll](functions/withdrawAll.ts) +- [getSonicBalance](functions/getSonicBalance.ts) +- [getStakedSonicBalance](functions/getStakedSonicBalance.ts) +- [getOpenWithdrawRequests](functions/getOpenWithdrawRequests.ts) +- [getProtocolSonicToStakedSonicExchangeRate](functions/getProtocolSonicToStakedSonicExchangeRate.ts) +- [getProtocolStakedSonicToSonicExchangeRate](functions/getProtocolStakedSonicToSonicExchangeRate.ts) +- [getTotalSonicInProtocol](functions/getTotalSonicInProtocol.ts) +- [getTotalStakedSonicInProtocol](functions/getTotalStakedSonicInProtocol.ts) ## Installation diff --git a/projects/beets-lst/functions/getOpenWithdrawalRequests.ts b/projects/beets-lst/functions/getOpenWithdrawRequests.ts similarity index 74% rename from projects/beets-lst/functions/getOpenWithdrawalRequests.ts rename to projects/beets-lst/functions/getOpenWithdrawRequests.ts index c723781f..ebd830f0 100644 --- a/projects/beets-lst/functions/getOpenWithdrawalRequests.ts +++ b/projects/beets-lst/functions/getOpenWithdrawRequests.ts @@ -1,24 +1,24 @@ import { Address } from 'viem'; import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; import { supportedChains } from '../constants'; -import { getOpenWithdrawalRequests as getOpenWithdrawalRequestsHelper } from '../helpers/withdrawals'; +import { getOpenWithdrawRequests as getOpenWithdrawRequestsHelper } from '../helpers/withdrawals'; interface Props { chainName: string; account: Address; } -export async function getOpenWithdrawalRequests({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { +export async function getOpenWithdrawRequests({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { const chainId = getChainFromName(chainName); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); const publicClient = getProvider(chainId); - await notify(`Getting existing withdrawal requests...`); + await notify(`Getting existing withdraw requests...`); // Get all withdraws for the user, including non-claimable ones - const withdraws = await getOpenWithdrawalRequestsHelper(account, publicClient, false); + const withdraws = await getOpenWithdrawRequestsHelper(account, publicClient, false); if (withdraws.length === 0) { return toResult('No pending or unclaimed withdrawals found'); diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index 0f21ef58..f828e880 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -8,4 +8,4 @@ export { getTotalSonicInProtocol } from './getTotalSonicInProtocol'; export { getTotalStakedSonicInProtocol } from './getTotalStakedSonicInProtocol'; export { getProtocolStakedSonicToSonicExchangeRate } from './getProtocolStakedSonicToSonicExchangeRate'; export { getProtocolSonicToStakedSonicExchangeRate } from './getProtocolSonicToStakedSonicExchangeRate'; -export { getOpenWithdrawalRequests } from './getOpenWithdrawalRequests'; +export { getOpenWithdrawRequests } from './getOpenWithdrawRequests'; diff --git a/projects/beets-lst/functions/withdraw.ts b/projects/beets-lst/functions/withdraw.ts index 81557218..146a1c7e 100644 --- a/projects/beets-lst/functions/withdraw.ts +++ b/projects/beets-lst/functions/withdraw.ts @@ -2,7 +2,7 @@ import { Address, encodeFunctionData } from 'viem'; import { FunctionReturn, toResult, getChainFromName, FunctionOptions, TransactionParams } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS } from '../constants'; import { stsAbi } from '../abis'; -import { getWithdrawalRequestInfo } from '../helpers/withdrawals'; +import { getWithdrawRequestInfo } from '../helpers/withdrawals'; interface Props { chainName: string; @@ -17,16 +17,16 @@ export async function withdraw({ chainName, account, withdrawId }: Props, { send const publicClient = getProvider(chainId); - await notify(`Preparing to claim withdraw with ID ${withdrawId}...`); + await notify(`Preparing to claim the withdraw request with ID ${withdrawId}...`); - const withdrawRequest = await getWithdrawalRequestInfo(Number(withdrawId), publicClient); + const withdrawRequest = await getWithdrawRequestInfo(Number(withdrawId), publicClient); if (!withdrawRequest) { - return toResult(`Withdraw request with ID ${withdrawId} does not exist; try asking for your withdrawal requests`, true); + return toResult(`Withdraw request with ID ${withdrawId} does not exist; try asking for your withdraw requests`, true); } if (withdrawRequest.user !== account) { - return toResult(`Withdraw request with ID ${withdrawId} does not belong to you; try asking for your withdrawal requests`, true); + return toResult(`Withdraw request with ID ${withdrawId} does not belong to you; try asking for your withdraw requests`, true); } if (withdrawRequest.isWithdrawn) { diff --git a/projects/beets-lst/functions/withdrawAll.ts b/projects/beets-lst/functions/withdrawAll.ts index 3f21fa80..0148362b 100644 --- a/projects/beets-lst/functions/withdrawAll.ts +++ b/projects/beets-lst/functions/withdrawAll.ts @@ -2,7 +2,7 @@ import { Address, encodeFunctionData } from 'viem'; import { FunctionReturn, toResult, getChainFromName, FunctionOptions, TransactionParams } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS } from '../constants'; import { stsAbi } from '../abis'; -import { getOpenWithdrawalRequests } from '../helpers/withdrawals'; +import { getOpenWithdrawRequests } from '../helpers/withdrawals'; interface Props { chainName: string; @@ -18,14 +18,14 @@ export async function withdrawAll({ chainName, account }: Props, { sendTransacti await notify('Checking for claimable withdrawals...'); - const claimableWithdraws = await getOpenWithdrawalRequests(account, publicClient, true); + const claimableWithdrawals = await getOpenWithdrawRequests(account, publicClient, true); - if (claimableWithdraws.length === 0) { + if (claimableWithdrawals.length === 0) { return toResult(`No withdrawals ready to be claimed`); } - const withdrawIds = claimableWithdraws.map((w) => BigInt(w.id)); - const totalAmount = claimableWithdraws.reduce((sum, w) => sum + Number(w.amount), 0); + const withdrawIds = claimableWithdrawals.map((w) => BigInt(w.id)); + const totalAmount = claimableWithdrawals.reduce((sum, w) => sum + Number(w.amount), 0); const transactions: TransactionParams[] = []; const tx: TransactionParams = { @@ -38,9 +38,9 @@ export async function withdrawAll({ chainName, account }: Props, { sendTransacti }; transactions.push(tx); - await notify(`Sending transaction to withdraw ${claimableWithdraws.length} requests...`); + await notify(`Sending transaction to withdraw ${claimableWithdrawals.length} requests...`); const result = await sendTransactions({ chainId, account, transactions }); const message = result.data[result.data.length - 1].message; - return toResult(result.isMultisig ? message : `Successfully withdrew ${totalAmount} S from ${claimableWithdraws.length} requests. ${message}`); + return toResult(result.isMultisig ? message : `Successfully withdrew ${totalAmount} S from ${claimableWithdrawals.length} requests. ${message}`); } diff --git a/projects/beets-lst/helpers/withdrawals.ts b/projects/beets-lst/helpers/withdrawals.ts index d9e8004f..c37ff6a2 100644 --- a/projects/beets-lst/helpers/withdrawals.ts +++ b/projects/beets-lst/helpers/withdrawals.ts @@ -30,10 +30,10 @@ export interface WithdrawRequest { } /** - * Get all open withdrawal requests for a user, that is, all withdrawal + * Get all open withdraw requests for a user, that is, all withdrawal * requests that are either pending or ready to be claimed */ -export async function getOpenWithdrawalRequests(account: Address, publicClient: PublicClient, onlyClaimable: boolean = false): Promise { +export async function getOpenWithdrawRequests(account: Address, publicClient: PublicClient, onlyClaimable: boolean = false): Promise { // Get the withdraw delay period const withdrawDelay = await publicClient.readContract({ address: STS_ADDRESS, @@ -77,10 +77,10 @@ export async function getOpenWithdrawalRequests(account: Address, publicClient: } /** - * Get a withdrawal request from the smart contract, by its ID; return null if - * the withdrawal request does not exist + * Get a withdraw request from the smart contract, by its ID; return null if + * the withdraw request does not exist */ -export async function getWithdrawalRequest(withdrawId: number, publicClient: PublicClient): Promise { +export async function getWithdrawRequest(withdrawId: number, publicClient: PublicClient): Promise { const withdrawRequest = await publicClient.readContract({ address: STS_HELPER_ADDRESS, abi: stsHelperAbi, @@ -94,12 +94,12 @@ export async function getWithdrawalRequest(withdrawId: number, publicClient: Pub } /** - * Get a withdrawal request by its ID and conver it to a WithdrawReqeustInfo + * Get a withdraw request by its ID and conver it to a WithdrawReqeustInfo * object; to do so, we need to get the withdraw delay period from the * smart contract: use this function sparingly */ -export async function getWithdrawalRequestInfo(withdrawId: number, publicClient: PublicClient): Promise { - const withdrawRequest = await getWithdrawalRequest(withdrawId, publicClient); +export async function getWithdrawRequestInfo(withdrawId: number, publicClient: PublicClient): Promise { + const withdrawRequest = await getWithdrawRequest(withdrawId, publicClient); if (!withdrawRequest) return null; const withdrawDelay = await publicClient.readContract({ diff --git a/projects/beets-lst/index.ts b/projects/beets-lst/index.ts index 2f1e16ef..e5f34cf2 100644 --- a/projects/beets-lst/index.ts +++ b/projects/beets-lst/index.ts @@ -5,5 +5,6 @@ import * as functions from './functions'; export default { tools, functions, - description: 'Integration with beets.fi Sonic liquid staking module (stS). The integration supports staking S into stS and unstaking back to S. The unstaking is a 2-step process: first undelegate, then claim Sonic after 14 days.', + description: + 'Integration with beets.fi Sonic liquid staking module (stS). The integration supports staking S into stS and unstaking back to S. The unstaking is a 2-step process: first undelegate, then withdraw Sonic after 14 days.', } satisfies AdapterExport; diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index 394b328e..c764e5ae 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -50,7 +50,7 @@ export const tools: AiTool[] = [ }, { name: 'withdraw', - description: 'Claim Sonic tokens (S) for the withdrawal request identified by the provided ID', + description: 'Withdraw Sonic tokens (S) for the withdraw request identified by the provided ID', required: ['chainName', 'account', 'withdrawId'], props: [ { @@ -67,13 +67,13 @@ export const tools: AiTool[] = [ { name: 'withdrawId', type: 'string', - description: 'ID of the withdrawal request to process', + description: 'ID of the withdraw request to process', }, ], }, { name: 'withdrawAll', - description: 'Claim Sonic tokens (S) from all withdrawal requests that have completed the 14-day waiting period', + description: 'Withdraw Sonic tokens (S) from all withdraw requests that have completed the 14-day waiting period', required: ['chainName', 'account'], props: [ { @@ -179,9 +179,9 @@ export const tools: AiTool[] = [ ], }, { - name: 'getOpenWithdrawalRequests', + name: 'getOpenWithdrawRequests', description: - 'Get the list of open withdrawals for the user. A withdrawal is open if it is either ready to be claimed or waiting for the 14-day period to elapse. The withdrawal ID will be shown for each withdrawal.', + 'Get the list of open withdrawals for the user. A withdrawal is open if it is either ready to be withdrawn or waiting for the 14-day period to elapse. The withdrawal ID will be shown for each withdrawal.', required: ['chainName', 'account'], props: [ { From b77e20d184351e547fa6265ba5338adf3d44c1db Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Fri, 24 Jan 2025 17:36:14 +0100 Subject: [PATCH 20/33] Revert "docs: add askBeets to README" (wrong README) This reverts commit 4f952246e04d53419f5691ca3c9da5055e134703. --- README.md | 138 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 91 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index bfd1b83e..fc4c57fb 100644 --- a/README.md +++ b/README.md @@ -1,77 +1,121 @@ -# beets-lst +# HeyAnon AI Module Development Documentation -Integration with beets.fi Sonic liquid staking module (stS). The integration supports staking S into stS and unstaking back to S. The unstaking is a 2-step process: first undelegate, then claim Sonic after 14 days. +Welcome to the technical documentation for developing additional project modules for the HeyAnon AI Chatbot. -## Supported Networks +[Fast track terms](./guides/fast-track-terms.md) + +## Contents + +- [Introduction](./guides/introduction.md) +- [Requirements](./guides/requirements.md) +- [Architecture and Design](./guides/architecture-and-design.md) +- [Action Functions Implementation Guide](./guides/action-functions.md) +- [Getter Functions Implementation Guide](./guides/getter-functions.md) +- [Tools Implementation Guide](./guides/tools-implementation.md) +- [Module README Guidelines](./guides/module-readme-guidelines.md) +- [Conclusion](./guides/conclusion.md) +- [Additional Resources](./guides/additional-resources.md) -- SONIC +## Quick Links -## Common Tasks +- [Action Function Example](./guides/action-function-example.md) +- [Getter Function Example](./guides/getter-function-example.md) -1. Basic Operations +## Quick Start - - "Stake 100 S in @beets-lst" - - "Stake half of my Sonic in @beets-lst" - - "Unstake 100 stS from @beets-lst" - - "Unstake all of my stS from @beets-lst" - - "Withdraw all of my stS from @beets-lst" +To create a new module, use the provided bash script: -2. Information Queries - - "Get my stS balance in @beets-lst" - - "How long before I can withdraw S from @beets-lst?" +```bash +cd scripts +chmod +x create-module.sh +./create-module.sh "" "" +``` -## Available Functions +Parameters: -List of available functions will be added here. +- `module-name`: Name of your module (e.g., "example-protocol") +- `description`: Short description of your module in quotes +- `chains`: Comma-separated list of supported chains in quotes (e.g., "ETHEREUM,ARBITRUM") -## Installation +Example: ```bash -yarn add @heyanon/beets-lst +./create-module.sh example-protocol "Integration with Example Protocol" "ETHEREUM,ARBITRUM" +cd projects/example-protocol +yarn install ``` -## Usage +The script will create: -Example usage will be added here. +1. Module directory structure in [projects](./projects) folder: + - `abis/` - for contract ABIs + - `functions/` - for action and getter functions + - Configuration files (index.ts, tools.ts, etc.) +2. Basic README.md with template documentation +3. Git repository initialization +4. Package.json with correct naming -## Contracts and transactions +After creation, follow the printed instructions to complete module setup. -- Liquid staking contract: https://sonicscan.org/address/0xe5da20f15420ad15de0fa650600afc998bbe3955 -- Stake Sonic (`deposit`): https://sonicscan.org/tx/0x19545670b77c9ab7e1eabdab292c1aa9d0abd6e11777ab3147f343cb900c728b -- Initiate unstake (`undelegateMany`): https://sonicscan.org/tx/0xb64c4fd6ae4667a3b7ce9d6ba9679fbd2c591173a0895a5616adc3b039b10c27 -- Withdraw Sonic (`withdraw`): https://sonicscan.org/tx/0xb93b07384ccbace4236d07fac46874039821c84707f69fbee101e9ae5506f470 -- Claim rewards (`claimRewards`): https://sonicscan.org/tx/0xf46de5d07b1feeaf132e58ae0a87075a2cf9308698ab4837c76c0a2b7dd62aa5 +## Contribution Guide -## Test integration +### Module Structure -I've built a simple agent called `askBeets` to test the integration. To run it, you need to configure .env: +All modules must be placed in the [projects](./projects) directory. This ensures consistent organization and easier maintenance of the codebase. -```bash -cd projects/beets-lst -yarn install -cp .env.example .env -# insert test wallet private key into .env -# insert OpenAI API key into .env -``` +### Development Process -and then you can ask questions directly: +1. Fork the repository +2. Create a new branch for your module: + ```bash + git checkout -b feature/module-name + ``` +3. Create your module using the provided script +4. Implement required functionality following the guides +5. Test your implementation thoroughly +6. Create documentation for your module -```bash -yarn run ask "What is my stS balance?" -yarn run ask "Stake 0.1 S" -yarn run ask "Unstake all of my stS" -``` +### Pull Request Process -The agent will perform one or more tasks to execute your request; see for example this GIF where I asked to bot to unstake all of my stS: +1. Ensure your code follows the project's coding standards +2. Update the documentation as needed +3. Create a Pull Request with: + - Clear description of the module's functionality + - List of supported chains + - Any special configuration requirements + - Test results or coverage reports +4. Wait for review from maintainers +### Code Standards +- Use TypeScript for all implementations +- Follow existing code style and formatting +- Include proper error handling +- Add comprehensive comments +- Ensure type safety -https://github.com/user-attachments/assets/2ce0d109-85b5-4548-8bad-2c4bfadaeacf +### Testing +- Test all functions with different input scenarios +- Verify error handling +- Test on all supported networks +## Supported Networks -If you need to see the OpenAI messages, for debug purposes, run with `--verbose` flag: +[Available networks for integration:](https://github.com/RealWagmi/heyanon-sdk/blob/main/src/blockchain/constants/chains.ts) -```bash -yarn run ask "What is my stS balance?" --verbose -``` +### Mainnet Networks + +- ETHEREUM (Ethereum Mainnet, 1) +- BSC (BNB Smart Chain, 56) +- KAVA (Kava EVM, 2222) +- BASE (Base, 8453) +- IOTA (IOTA EVM, 1074) +- AVALANCHE (Avalanche C-Chain, 43114) +- ARBITRUM (Arbitrum One, 42161) +- SONIC (Sonic, 146) + +### Testnet Networks + +- SEPOLIA (Ethereum Testnet Sepolia, 11155111) +- ONE_SEPOLIA (Arbitrum Sepolia Testnet, 421614) From 2fe0c2c11c0749814d1de1abf528026418b111f6 Mon Sep 17 00:00:00 2001 From: coccoinomane Date: Fri, 24 Jan 2025 17:40:45 +0100 Subject: [PATCH 21/33] docs: add askBeets to the beets project README --- projects/beets-lst/README.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index 6d7780d8..4dfdee90 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -20,7 +20,7 @@ Integration with beets.fi Sonic liquid staking module (stS). - "Unstake 100 S worth of stS from @beets-lst" - **Withdrawing** - "How long before I can withdraw from @beets-lst?" - - "Show withdrawal requests from @beets-lst" + - "Show my withdrawal requests from @beets-lst" - "Withdraw from @beets-lst" - "Withdraw all from @beets-lst" - **Info** @@ -59,3 +59,34 @@ Example usage will be added here. - Stake Sonic (`deposit`): https://sonicscan.org/tx/0x19545670b77c9ab7e1eabdab292c1aa9d0abd6e11777ab3147f343cb900c728b - Initiate unstake (`undelegateMany`): https://sonicscan.org/tx/0xb64c4fd6ae4667a3b7ce9d6ba9679fbd2c591173a0895a5616adc3b039b10c27 - Withdraw Sonic (`withdraw`): https://sonicscan.org/tx/0xb93b07384ccbace4236d07fac46874039821c84707f69fbee101e9ae5506f470 + +## askBeest agent + +I've built a simple agent called `askBeets` to test the integration. To run it, you need to configure .env: + +```bash +cd projects/beets-lst +yarn install +cp .env.example .env +# insert test wallet private key into .env +# insert OpenAI API key into .env +``` + +and then you can ask questions directly: + +```bash +yarn run ask "What is my stS balance?" +yarn run ask "Stake 0.1 S" +yarn run ask "Unstake all of my stS" +``` + +The agent will perform one or more tasks to execute your request; see for example this GIF where I asked to bot to unstake all of my stS: + +https://github.com/user-attachments/assets/2ce0d109-85b5-4548-8bad-2c4bfadaeacf + +To see the actual OpenAI responses for debug purposes, run with `--verbose` flag: + +```bash +yarn run ask "What is my stS balance?" --verbose +``` + From 3fd0e99d2bcd13623bf066f511f8930510f77be0 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Fri, 24 Jan 2025 18:12:43 +0100 Subject: [PATCH 22/33] feat: Add data analysis capability to askBeets agent Enhances the agent to analyze tool responses and provide intelligent answers to analytical questions like "find highest withdrawal". Updates system prompt and return logic to support this new capability. --- projects/beets-lst/examples/askBeets.ts | 80 ++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 8 deletions(-) diff --git a/projects/beets-lst/examples/askBeets.ts b/projects/beets-lst/examples/askBeets.ts index f36b67f4..e5a4de62 100644 --- a/projects/beets-lst/examples/askBeets.ts +++ b/projects/beets-lst/examples/askBeets.ts @@ -21,6 +21,21 @@ interface ConversationMessage { name?: string; } +/** + * The askBeets agent. + * + * Ask the agent a question or give it an order. The agent will use the tools + * defined in the tools.ts file to perform the necessary operations. + * + * The agent has an additional step to analyze the data provided by the tools + * and provide a final answer. + * + * For example, if asked "Show the withdrawal request with the highest amount", + * the agent will: + * 1. First call getOpenWithdrawRequests + * 2. Then analyze the response to find the highest amount + * 3. Then provide the answer + */ export async function askBeets(question: string, options?: AskBeetsOptions): Promise { const openaiApiKey = process.env.OPENAI_API_KEY; if (!openaiApiKey) { @@ -86,7 +101,24 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro For example, to unstake all tokens: 1. First call getStakedSonicBalance to get the current balance 2. Then use that balance amount to call unStake - After each tool response, determine if additional steps are needed. + + IMPORTANT: For analytical questions about data: + 1. ALWAYS call the relevant tool first to get the data + 2. When you receive the tool response, analyze the data and provide the answer + 3. DO NOT try to answer analytical questions without first calling the appropriate tool + + For example: + - If asked "Show the withdrawal request with the highest amount": + 1. First call getOpenWithdrawRequests + 2. Then analyze the response to find the highest amount + - If asked about token balances: + 1. First call the relevant balance tool + 2. Then provide the analysis + + After each tool response, analyze the data to determine if: + - Additional steps are needed + - The data needs to be processed to answer the user's question (e.g., finding highest/lowest values, filtering, etc.) + All tools will need the chainName and account arguments: chainName: "sonic", account: "${signer.address}".`, }, { role: 'user', content: question }, @@ -95,6 +127,10 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro const results: FunctionReturn[] = []; let isComplete = false; + if (options?.verbose) { + console.log('System prompt:', util.inspect(messages[0], { depth: null, colors: true })); + } + while (!isComplete) { // Call the LLM to determine which tools to call const completion = await openai.chat.completions.create({ @@ -104,10 +140,6 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro tool_choice: 'auto', }); - if (options?.verbose) { - console.log('Messages:', util.inspect(messages, { depth: null, colors: true })); - } - // Add the LLM response to the conversation const assistantMessage = completion.choices[0].message; messages.push({ @@ -116,9 +148,17 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro tool_calls: assistantMessage.tool_calls, }); + if (options?.verbose) { + console.log('LLM says:', util.inspect(messages[messages.length - 1], { depth: null, colors: true })); + } + // If no tool calls, the assistant is done if (!assistantMessage.tool_calls) { isComplete = true; + // Add the final analysis to results if we have previous tool results + if (results.length > 0 && assistantMessage.content) { + return toResult(assistantMessage.content); + } continue; } @@ -148,24 +188,48 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro return result; } + // Add the tool response to the conversation with more context messages.push({ role: 'tool', tool_call_id: functionCall.id, name: functionName, - content: result.data, + content: JSON.stringify({ + toolName: functionName, + data: result.data, + }), }); + + if (options?.verbose) { + console.log('Tool message:', util.inspect(messages[messages.length - 1], { depth: null, colors: true })); + } + + // Add an analysis prompt if this was the last tool call + if (!assistantMessage.tool_calls?.[1]) { + messages.push({ + role: 'user', + content: 'Based on this data, can you now answer my original question? If you need to call more tools, please do so.', + }); + } } catch (error) { return toResult(`Error executing ${functionName}: ${error instanceof Error ? error.message : 'Unknown error'}`, true); } } - // Combine results into a single response + // Modify the final return logic if (results.length === 0) { return toResult('Could not identify any operations to perform.', true); - } else if (results.length === 1) { + } else if (results.length === 1 && !messages[messages.length - 1].content) { + // If we only have one result and no final analysis, return the tool result return results[0]; } + // If we have a final analysis message, use that as the result + const finalMessage = messages[messages.length - 1]; + if (finalMessage.role === 'assistant' && finalMessage.content) { + return toResult(finalMessage.content); + } + + // Fallback to combining all results if no final analysis const combinedMessage = results.map((r, i) => `Step ${i + 1}: ${r.data}`).join('\n'); return toResult(combinedMessage); } From b9b95b8530a6b8129542d59a61d0ca7f27e94c6c Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Fri, 24 Jan 2025 18:34:50 +0100 Subject: [PATCH 23/33] feat: getNextWithdrawal action --- projects/beets-lst/README.md | 37 ++++++++---------- projects/beets-lst/examples/askBeets.ts | 2 +- .../beets-lst/functions/getNextWithdrawal.ts | 39 +++++++++++++++++++ .../functions/getOpenWithdrawRequests.ts | 4 +- projects/beets-lst/functions/index.ts | 1 + projects/beets-lst/tools.ts | 18 +++++++++ 6 files changed, 78 insertions(+), 23 deletions(-) create mode 100644 projects/beets-lst/functions/getNextWithdrawal.ts diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index 4dfdee90..24db9767 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -8,25 +8,23 @@ Integration with beets.fi Sonic liquid staking module (stS). ## Common Tasks -1. Basic Operations - - - **Staking** - - "Stake 100 S in @beets-lst" - - "Stake half of my Sonic in @beets-lst" - - "How many stS do I have in @beets-lst?" - - **Unstaking** - - "Unstake 100 stS from @beets-lst" - - "Unstake all of my stS from @beets-lst" - - "Unstake 100 S worth of stS from @beets-lst" - - **Withdrawing** - - "How long before I can withdraw from @beets-lst?" - - "Show my withdrawal requests from @beets-lst" - - "Withdraw from @beets-lst" - - "Withdraw all from @beets-lst" - - **Info** - - "How much is worth 1 stS in @beets-lst?" - - "How much is worth 1 S in @beets-lst?" - - "How much Sonic is in the protocol @beets-lst?" +- **Staking** + - "Stake 100 S in @beets-lst" + - "Stake half of my Sonic in @beets-lst" + - "How many stS do I have in @beets-lst?" +- **Unstaking** + - "Unstake 100 stS from @beets-lst" + - "Unstake all of my stS from @beets-lst" + - "Unstake 100 S worth of stS from @beets-lst" +- **Withdrawing** + - "How long before I can withdraw from @beets-lst?" + - "Show my withdrawal requests from @beets-lst" + - "Withdraw from @beets-lst" + - "Withdraw all from @beets-lst" +- **Info** + - "How much is worth 1 stS in @beets-lst?" + - "How much is worth 1 S in @beets-lst?" + - "How much Sonic is in the protocol @beets-lst?" ## Available Functions @@ -89,4 +87,3 @@ To see the actual OpenAI responses for debug purposes, run with `--verbose` flag ```bash yarn run ask "What is my stS balance?" --verbose ``` - diff --git a/projects/beets-lst/examples/askBeets.ts b/projects/beets-lst/examples/askBeets.ts index e5a4de62..24681059 100644 --- a/projects/beets-lst/examples/askBeets.ts +++ b/projects/beets-lst/examples/askBeets.ts @@ -207,7 +207,7 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro if (!assistantMessage.tool_calls?.[1]) { messages.push({ role: 'user', - content: 'Based on this data, can you now answer my original question? If you need to call more tools, please do so.', + content: 'Provide an answer to my original question using the data you collected. If you need more tools, call them.', }); } } catch (error) { diff --git a/projects/beets-lst/functions/getNextWithdrawal.ts b/projects/beets-lst/functions/getNextWithdrawal.ts new file mode 100644 index 00000000..56a043d3 --- /dev/null +++ b/projects/beets-lst/functions/getNextWithdrawal.ts @@ -0,0 +1,39 @@ +import { Address } from 'viem'; +import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { supportedChains } from '../constants'; +import { getOpenWithdrawRequests } from '../helpers/withdrawals'; + +interface Props { + chainName: string; + account: Address; +} + +export async function getNextWithdrawal({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const publicClient = getProvider(chainId); + + await notify(`Getting next withdrawal details...`); + + // Get all withdraws for the user, including non-claimable ones + const withdraws = await getOpenWithdrawRequests(account, publicClient, false); + + if (withdraws.length === 0) { + return toResult('No pending or claimable withdrawals found'); + } + + // Sort withdraws: ready first, then by timestamp + withdraws.sort((a, b) => { + if (a.isReady !== b.isReady) { + return a.isReady ? -1 : 1; + } + return a.readyTime.getTime() - b.readyTime.getTime(); + }); + + const nextWithdraw = withdraws[0]; + const status = nextWithdraw.isReady ? 'is ready to claim' : `will be ready ${nextWithdraw.timeRemaining}`; + + return toResult(`Next withdrawal (ID ${nextWithdraw.id}) of amount ${nextWithdraw.amount} S ${status}`); +} diff --git a/projects/beets-lst/functions/getOpenWithdrawRequests.ts b/projects/beets-lst/functions/getOpenWithdrawRequests.ts index ebd830f0..4f33f1d3 100644 --- a/projects/beets-lst/functions/getOpenWithdrawRequests.ts +++ b/projects/beets-lst/functions/getOpenWithdrawRequests.ts @@ -21,7 +21,7 @@ export async function getOpenWithdrawRequests({ chainName, account }: Props, { n const withdraws = await getOpenWithdrawRequestsHelper(account, publicClient, false); if (withdraws.length === 0) { - return toResult('No pending or unclaimed withdrawals found'); + return toResult('No pending or claimable withdrawals found'); } // Sort withdraws: ready first, then by timestamp @@ -33,7 +33,7 @@ export async function getOpenWithdrawRequests({ chainName, account }: Props, { n }); // Format the response with withdraw IDs - const withdrawalsList = withdraws.map((w) => `- Withdraw ID ${w.id}: ${w.amount} S (${w.timeRemaining})`).join('\n'); + const withdrawalsList = withdraws.map((w) => `- Withdraw ID ${w.id} of amount ${w.amount} S (${w.timeRemaining})`).join('\n'); return toResult(`Pending withdrawals:\n${withdrawalsList}`); } diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index f828e880..20515d6c 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -9,3 +9,4 @@ export { getTotalStakedSonicInProtocol } from './getTotalStakedSonicInProtocol'; export { getProtocolStakedSonicToSonicExchangeRate } from './getProtocolStakedSonicToSonicExchangeRate'; export { getProtocolSonicToStakedSonicExchangeRate } from './getProtocolSonicToStakedSonicExchangeRate'; export { getOpenWithdrawRequests } from './getOpenWithdrawRequests'; +export { getNextWithdrawal } from './getNextWithdrawal'; diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index c764e5ae..258c9c8a 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -197,4 +197,22 @@ export const tools: AiTool[] = [ }, ], }, + { + name: 'getNextWithdrawal', + description: 'Get details of the withdrawal request that is closest to being ready to be withdrawn. This is useful for checking how long before a user can withdraw.', + required: ['chainName', 'account'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Chain name', + }, + { + name: 'account', + type: 'string', + description: 'Account address to check withdrawals for', + }, + ], + }, ]; From d3594a5c1985365737b1ea6c303da9e4c80b2d63 Mon Sep 17 00:00:00 2001 From: coccoinomane Date: Fri, 24 Jan 2025 21:02:09 +0100 Subject: [PATCH 24/33] docs: fix typo in README --- projects/beets-lst/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index 24db9767..ad20e914 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -58,7 +58,7 @@ Example usage will be added here. - Initiate unstake (`undelegateMany`): https://sonicscan.org/tx/0xb64c4fd6ae4667a3b7ce9d6ba9679fbd2c591173a0895a5616adc3b039b10c27 - Withdraw Sonic (`withdraw`): https://sonicscan.org/tx/0xb93b07384ccbace4236d07fac46874039821c84707f69fbee101e9ae5506f470 -## askBeest agent +## Test with the askBeets agent I've built a simple agent called `askBeets` to test the integration. To run it, you need to configure .env: From 1ae745300dc5ff067c76f5f498113d3ea542dd23 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Sat, 25 Jan 2025 12:20:00 +0100 Subject: [PATCH 25/33] docs: improve readme --- projects/beets-lst/README.md | 33 +++++++++++++++------ projects/beets-lst/examples/askBeets.ts | 5 ++-- projects/beets-lst/examples/run.ts | 4 +-- projects/beets-lst/package.json | 3 +- projects/beets-lst/yarn.lock | 39 +++++++++++++++++++++++++ 5 files changed, 70 insertions(+), 14 deletions(-) diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index ad20e914..cbed8819 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -1,6 +1,18 @@ -# beets-lst +# Beets LST - Liquid staking on Sonic -Integration with beets.fi Sonic liquid staking module (stS). +Beets LST allows you to access Sonic staking rewards while maintaining full liquidity of your assets. Maximize your DeFi potential: stS tokens are always liquid and composable, allowing you to earn staking rewards while simultaneously participating in lending markets, liquidity pools, and other DeFi opportunities. Your rewards never stop - even while your assets are put to work across the ecosystem. + +## What Beets LST can do for you + +- **Flexible Staking & Unstaking**: Easily convert between Sonic (S) and staked Sonic (stS) tokens. Unstaking initiates a 14-day cooldown period, after which tokens can be withdrawn. + +- **Liquid Staking Tokens**: Receive stS tokens that represent your staked position, which remain fully liquid and can be used across DeFi while earning staking rewards. + +- **Safe and decentralized**: Your staked assets are automatically distributed across carefully selected validators, providing enhanced decentralization and risk management. + +- **Real-time Exchange Rates**: Track the value of your staked positions with accurate exchange rates between S and stS tokens, which reflect your accrued staking rewards. + +- **Streamlined Withdrawals**: Manage multiple withdrawal requests efficiently, with the ability to track pending withdrawals and withdraw all available tokens in a single transaction once the cooldown period completes. ## Supported Networks @@ -12,16 +24,18 @@ Integration with beets.fi Sonic liquid staking module (stS). - "Stake 100 S in @beets-lst" - "Stake half of my Sonic in @beets-lst" - "How many stS do I have in @beets-lst?" + - "Show my position in @beets-lst" - **Unstaking** - "Unstake 100 stS from @beets-lst" - "Unstake all of my stS from @beets-lst" - "Unstake 100 S worth of stS from @beets-lst" - **Withdrawing** - - "How long before I can withdraw from @beets-lst?" - - "Show my withdrawal requests from @beets-lst" - "Withdraw from @beets-lst" - "Withdraw all from @beets-lst" -- **Info** + - "How long before I can withdraw from @beets-lst?" + - "Show my open withdrawals from @beets-lst" +- **Info and alerts** + - "Alert me when my withdrawal is ready @beets-lst" - "How much is worth 1 stS in @beets-lst?" - "How much is worth 1 S in @beets-lst?" - "How much Sonic is in the protocol @beets-lst?" @@ -53,10 +67,11 @@ Example usage will be added here. ## Contracts and transactions - Liquid staking proxy contract: https://sonicscan.org/address/0xe5da20f15420ad15de0fa650600afc998bbe3955 -- Liquid staking current implementation: https://sonicscan.org/address/0xd5f7fc8ba92756a34693baa386edcc8dd5b3f141 -- Stake Sonic (`deposit`): https://sonicscan.org/tx/0x19545670b77c9ab7e1eabdab292c1aa9d0abd6e11777ab3147f343cb900c728b -- Initiate unstake (`undelegateMany`): https://sonicscan.org/tx/0xb64c4fd6ae4667a3b7ce9d6ba9679fbd2c591173a0895a5616adc3b039b10c27 -- Withdraw Sonic (`withdraw`): https://sonicscan.org/tx/0xb93b07384ccbace4236d07fac46874039821c84707f69fbee101e9ae5506f470 +- Liquid staking implementation contract: https://sonicscan.org/address/0xd5f7fc8ba92756a34693baa386edcc8dd5b3f141 +- Liquid staking helper contract: https://sonicscan.org/address/0x52b16e3d7d25ba64f242e59f9a74799ecc432d78 +- Stake Sonic TX (`deposit`): https://sonicscan.org/tx/0x19545670b77c9ab7e1eabdab292c1aa9d0abd6e11777ab3147f343cb900c728b +- Initiate unstake TX (`undelegateMany`): https://sonicscan.org/tx/0xb64c4fd6ae4667a3b7ce9d6ba9679fbd2c591173a0895a5616adc3b039b10c27 +- Withdraw Sonic TX (`withdraw`): https://sonicscan.org/tx/0xb93b07384ccbace4236d07fac46874039821c84707f69fbee101e9ae5506f470 ## Test with the askBeets agent diff --git a/projects/beets-lst/examples/askBeets.ts b/projects/beets-lst/examples/askBeets.ts index 24681059..093e6c10 100644 --- a/projects/beets-lst/examples/askBeets.ts +++ b/projects/beets-lst/examples/askBeets.ts @@ -7,6 +7,7 @@ import { tools } from '../tools'; import * as functions from '../functions'; import util from 'util'; import { fromHeyAnonToolsToOpenAiTools } from '../helpers/openai'; +import chalk from 'chalk'; interface AskBeetsOptions { verbose?: boolean; @@ -167,8 +168,8 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro const functionName = functionCall.function.name as keyof typeof functions; const functionArgs = JSON.parse(functionCall.function.arguments); - console.log(`Executing function: ${functionName}`); - console.log(`Args: ${JSON.stringify(functionArgs)}`); + console.log(chalk.gray(`[Debug] Executing function: ${functionName}`)); + console.log(chalk.gray(`[Debug] Args: ${JSON.stringify(functionArgs)}`)); const func = functions[functionName]; if (!func) { diff --git a/projects/beets-lst/examples/run.ts b/projects/beets-lst/examples/run.ts index 4177bbad..28157378 100644 --- a/projects/beets-lst/examples/run.ts +++ b/projects/beets-lst/examples/run.ts @@ -1,3 +1,4 @@ +import chalk from 'chalk'; import { askBeets } from './askBeets'; import dotenv from 'dotenv'; @@ -17,8 +18,7 @@ async function main() { console.error(`${result.data}`); process.exit(0); } - console.log(`Response:`); - console.log(result.data); + console.log(`[Response] ${chalk.bold(result.data)}`); } main().catch(console.error); diff --git a/projects/beets-lst/package.json b/projects/beets-lst/package.json index 02e15241..ff98f8e0 100644 --- a/projects/beets-lst/package.json +++ b/projects/beets-lst/package.json @@ -7,7 +7,8 @@ }, "dependencies": { "@heyanon/sdk": "^1.0.4", - "axios": "^1.7.9" + "axios": "^1.7.9", + "chalk": "4" }, "license": "MIT", "engines": { diff --git a/projects/beets-lst/yarn.lock b/projects/beets-lst/yarn.lock index 90fc0186..ef128ea6 100644 --- a/projects/beets-lst/yarn.lock +++ b/projects/beets-lst/yarn.lock @@ -535,6 +535,13 @@ agentkeepalive@^4.2.1: dependencies: humanize-ms "^1.2.1" +ansi-styles@^4.1.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@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" @@ -603,6 +610,14 @@ chai@^5.1.2: loupe "^3.1.0" pathval "^2.0.0" +chalk@4: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + check-error@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" @@ -615,6 +630,18 @@ check-error@^2.1.1: resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -798,6 +825,11 @@ get-stream@^8.0.1: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + human-signals@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" @@ -1117,6 +1149,13 @@ strip-literal@^2.0.0: dependencies: js-tokens "^9.0.1" +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + tiny-invariant@^1.3.1: version "1.3.3" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" From a902450e1962451ccbf5aacda918fa09ad364bc5 Mon Sep 17 00:00:00 2001 From: coccoinomane Date: Sun, 26 Jan 2025 10:09:36 +0100 Subject: [PATCH 26/33] docs: README.md improvement --- projects/beets-lst/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index cbed8819..e22a94c5 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -88,16 +88,16 @@ cp .env.example .env and then you can ask questions directly: ```bash -yarn run ask "What is my stS balance?" -yarn run ask "Stake 0.1 S" +yarn run ask "Stake 0.1 S and show my staked balance" yarn run ask "Unstake all of my stS" +yarn run ask "How long before I can withdraw?" ``` The agent will perform one or more tasks to execute your request; see for example this GIF where I asked to bot to unstake all of my stS: https://github.com/user-attachments/assets/2ce0d109-85b5-4548-8bad-2c4bfadaeacf -To see the actual OpenAI responses for debug purposes, run with `--verbose` flag: +To debug the actual OpenAI responses, run `askBeets` with `--verbose` flag: ```bash yarn run ask "What is my stS balance?" --verbose From 453af7c0b3f4a2decc9b207a583ca198aa0d49a7 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Wed, 29 Jan 2025 16:37:42 +0100 Subject: [PATCH 27/33] feat: getStakingApr tool --- projects/beets-lst/functions/getStakingApr.ts | 16 ++++++++++++++ projects/beets-lst/functions/index.ts | 1 + projects/beets-lst/helpers/client.ts | 22 +++++++++++++++++++ projects/beets-lst/tools.ts | 13 +++++++++++ 4 files changed, 52 insertions(+) create mode 100644 projects/beets-lst/functions/getStakingApr.ts diff --git a/projects/beets-lst/functions/getStakingApr.ts b/projects/beets-lst/functions/getStakingApr.ts new file mode 100644 index 00000000..9f05c59b --- /dev/null +++ b/projects/beets-lst/functions/getStakingApr.ts @@ -0,0 +1,16 @@ +import { FunctionReturn, toResult, FunctionOptions, getChainFromName } from '@heyanon/sdk'; +import { supportedChains } from '../constants'; +import { fetchStakingAPR } from '../helpers/client'; + +interface Props { + chainName: string; +} + +export async function getStakingApr({ chainName }: Props, { notify, getProvider }: FunctionOptions): Promise { + const chainId = getChainFromName(chainName); + if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); + if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); + + const apr = await fetchStakingAPR(); + return toResult(`Staking APR: ${apr}`); +} diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/functions/index.ts index 20515d6c..6d6fee17 100644 --- a/projects/beets-lst/functions/index.ts +++ b/projects/beets-lst/functions/index.ts @@ -10,3 +10,4 @@ export { getProtocolStakedSonicToSonicExchangeRate } from './getProtocolStakedSo export { getProtocolSonicToStakedSonicExchangeRate } from './getProtocolSonicToStakedSonicExchangeRate'; export { getOpenWithdrawRequests } from './getOpenWithdrawRequests'; export { getNextWithdrawal } from './getNextWithdrawal'; +export { getStakingApr } from './getStakingApr'; diff --git a/projects/beets-lst/helpers/client.ts b/projects/beets-lst/helpers/client.ts index 004028cf..a966baf2 100644 --- a/projects/beets-lst/helpers/client.ts +++ b/projects/beets-lst/helpers/client.ts @@ -63,3 +63,25 @@ export function findHighestDelegatedValidator(validators: ValidatorData[]): Vali return currentValue > maxValue ? current : max; }); } + +/** + * Fetch the staking yield rate. + * + * To get the APR percentage, multiply the result by 100. + */ +export async function fetchStakingAPR(): Promise { + const query = ` + query { + stsGetGqlStakedSonicData { + stakingApr + } + } + `; + + const response = await executeGraphQLQuery<{ + stsGetGqlStakedSonicData: { + stakingApr: number; + }; + }>(query); + return response.stsGetGqlStakedSonicData.stakingApr; +} diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/tools.ts index 258c9c8a..79fe1358 100644 --- a/projects/beets-lst/tools.ts +++ b/projects/beets-lst/tools.ts @@ -215,4 +215,17 @@ export const tools: AiTool[] = [ }, ], }, + { + name: 'getStakingApr', + description: 'Get the annualized yield from stS tokens in the form of an APR (annual percentage rate)', + required: ['chainName'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(getChainName), + description: 'Chain name', + }, + ], + }, ]; From 76b5f13d42ccf6a32924fb10621eb59eb0ce7db8 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Thu, 20 Feb 2025 18:27:15 +0100 Subject: [PATCH 28/33] refac: moved files for new heyanon guidelines --- projects/beets-lst/.gitignore | 4 +- projects/beets-lst/examples/askBeets.ts | 236 --- projects/beets-lst/package.json | 45 +- projects/beets-lst/{ => src}/abis/index.ts | 0 projects/beets-lst/{ => src}/abis/stsAbi.ts | 0 .../beets-lst/{ => src}/abis/stsHelperAbi.ts | 0 projects/beets-lst/src/ask_beets/askBeets.ts | 288 ++++ .../{examples => src/ask_beets}/run.ts | 6 +- projects/beets-lst/src/ask_beets/tools.ts | 57 + projects/beets-lst/{ => src}/constants.ts | 0 .../{ => src}/functions/getNextWithdrawal.ts | 0 .../functions/getOpenWithdrawRequests.ts | 0 ...tProtocolSonicToStakedSonicExchangeRate.ts | 0 ...tProtocolStakedSonicToSonicExchangeRate.ts | 0 .../{ => src}/functions/getSonicBalance.ts | 0 .../functions/getStakedSonicBalance.ts | 0 .../{ => src}/functions/getStakingApr.ts | 0 .../functions/getTotalSonicInProtocol.ts | 0 .../getTotalStakedSonicInProtocol.ts | 0 .../beets-lst/{ => src}/functions/index.ts | 0 .../beets-lst/{ => src}/functions/stake.ts | 0 .../beets-lst/{ => src}/functions/unStake.ts | 0 .../beets-lst/{ => src}/functions/withdraw.ts | 0 .../{ => src}/functions/withdrawAll.ts | 0 .../beets-lst/{ => src}/helpers/client.ts | 0 .../beets-lst/{ => src}/helpers/openai.ts | 0 .../{ => src}/helpers/withdrawals.ts | 0 projects/beets-lst/{ => src}/index.ts | 0 projects/beets-lst/{ => src}/tools.ts | 0 projects/beets-lst/tsconfig.json | 55 +- projects/beets-lst/tsup.config.ts | 23 + projects/beets-lst/yarn.lock | 1403 ----------------- 32 files changed, 442 insertions(+), 1675 deletions(-) delete mode 100644 projects/beets-lst/examples/askBeets.ts rename projects/beets-lst/{ => src}/abis/index.ts (100%) rename projects/beets-lst/{ => src}/abis/stsAbi.ts (100%) rename projects/beets-lst/{ => src}/abis/stsHelperAbi.ts (100%) create mode 100644 projects/beets-lst/src/ask_beets/askBeets.ts rename projects/beets-lst/{examples => src/ask_beets}/run.ts (71%) create mode 100644 projects/beets-lst/src/ask_beets/tools.ts rename projects/beets-lst/{ => src}/constants.ts (100%) rename projects/beets-lst/{ => src}/functions/getNextWithdrawal.ts (100%) rename projects/beets-lst/{ => src}/functions/getOpenWithdrawRequests.ts (100%) rename projects/beets-lst/{ => src}/functions/getProtocolSonicToStakedSonicExchangeRate.ts (100%) rename projects/beets-lst/{ => src}/functions/getProtocolStakedSonicToSonicExchangeRate.ts (100%) rename projects/beets-lst/{ => src}/functions/getSonicBalance.ts (100%) rename projects/beets-lst/{ => src}/functions/getStakedSonicBalance.ts (100%) rename projects/beets-lst/{ => src}/functions/getStakingApr.ts (100%) rename projects/beets-lst/{ => src}/functions/getTotalSonicInProtocol.ts (100%) rename projects/beets-lst/{ => src}/functions/getTotalStakedSonicInProtocol.ts (100%) rename projects/beets-lst/{ => src}/functions/index.ts (100%) rename projects/beets-lst/{ => src}/functions/stake.ts (100%) rename projects/beets-lst/{ => src}/functions/unStake.ts (100%) rename projects/beets-lst/{ => src}/functions/withdraw.ts (100%) rename projects/beets-lst/{ => src}/functions/withdrawAll.ts (100%) rename projects/beets-lst/{ => src}/helpers/client.ts (100%) rename projects/beets-lst/{ => src}/helpers/openai.ts (100%) rename projects/beets-lst/{ => src}/helpers/withdrawals.ts (100%) rename projects/beets-lst/{ => src}/index.ts (100%) rename projects/beets-lst/{ => src}/tools.ts (100%) create mode 100644 projects/beets-lst/tsup.config.ts delete mode 100644 projects/beets-lst/yarn.lock diff --git a/projects/beets-lst/.gitignore b/projects/beets-lst/.gitignore index a6cef30f..78a39a47 100644 --- a/projects/beets-lst/.gitignore +++ b/projects/beets-lst/.gitignore @@ -1,4 +1,6 @@ node_modules .vscode .env -contracts \ No newline at end of file +src/contracts +src/requests +dist \ No newline at end of file diff --git a/projects/beets-lst/examples/askBeets.ts b/projects/beets-lst/examples/askBeets.ts deleted file mode 100644 index 093e6c10..00000000 --- a/projects/beets-lst/examples/askBeets.ts +++ /dev/null @@ -1,236 +0,0 @@ -import OpenAI from 'openai'; -import { privateKeyToAccount } from 'viem/accounts'; -import { createPublicClient, http, createWalletClient } from 'viem'; -import { sonic } from 'viem/chains'; -import { FunctionOptions, FunctionReturn, toResult } from '@heyanon/sdk'; -import { tools } from '../tools'; -import * as functions from '../functions'; -import util from 'util'; -import { fromHeyAnonToolsToOpenAiTools } from '../helpers/openai'; -import chalk from 'chalk'; - -interface AskBeetsOptions { - verbose?: boolean; - notify?: (message: string) => Promise; -} - -interface ConversationMessage { - role: 'system' | 'user' | 'assistant' | 'tool'; - content: string; - tool_calls?: OpenAI.Chat.Completions.ChatCompletionMessage['tool_calls']; - tool_call_id?: string; - name?: string; -} - -/** - * The askBeets agent. - * - * Ask the agent a question or give it an order. The agent will use the tools - * defined in the tools.ts file to perform the necessary operations. - * - * The agent has an additional step to analyze the data provided by the tools - * and provide a final answer. - * - * For example, if asked "Show the withdrawal request with the highest amount", - * the agent will: - * 1. First call getOpenWithdrawRequests - * 2. Then analyze the response to find the highest amount - * 3. Then provide the answer - */ -export async function askBeets(question: string, options?: AskBeetsOptions): Promise { - const openaiApiKey = process.env.OPENAI_API_KEY; - if (!openaiApiKey) { - throw new Error('OPENAI_API_KEY environment variable is required'); - } - const openai = new OpenAI({ apiKey: openaiApiKey }); - - const privateKey = process.env.PRIVATE_KEY; - if (!privateKey) { - throw new Error('PRIVATE_KEY environment variable is required'); - } - - const notify = options?.notify || (async (message: string) => console.log(`[Notification] ${message}`)); - - const signer = privateKeyToAccount(`0x${privateKey}`); - const provider = createPublicClient({ - chain: sonic, - transport: http(), - }); - - // Create minimal FunctionOptions object - const functionOptions: FunctionOptions = { - getProvider: () => provider, - sendTransactions: async ({ chainId, account, transactions }) => { - // Create wallet client - const walletClient = createWalletClient({ - account: signer, - chain: provider.chain, - transport: http(), - }); - - const results = []; - - // Send transactions sequentially - for (const tx of transactions) { - const hash = await walletClient.sendTransaction({ - to: tx.target, - data: tx.data, - value: tx.value || 0n, - }); - - const receipt = await provider.waitForTransactionReceipt({ hash }); - - results.push({ - hash: receipt.transactionHash, - message: `Transaction confirmed with hash: ${receipt.transactionHash}`, - }); - } - - return { - isMultisig: false, - data: results, - }; - }, - notify, - }; - - const messages: ConversationMessage[] = [ - { - role: 'system', - content: `You will interact with the Beets protocol via your tools. Given a request, you will need to determine which tools to call. - For operations that require multiple steps (like "unstake all"), you should first get required information before executing actions. - For example, to unstake all tokens: - 1. First call getStakedSonicBalance to get the current balance - 2. Then use that balance amount to call unStake - - IMPORTANT: For analytical questions about data: - 1. ALWAYS call the relevant tool first to get the data - 2. When you receive the tool response, analyze the data and provide the answer - 3. DO NOT try to answer analytical questions without first calling the appropriate tool - - For example: - - If asked "Show the withdrawal request with the highest amount": - 1. First call getOpenWithdrawRequests - 2. Then analyze the response to find the highest amount - - If asked about token balances: - 1. First call the relevant balance tool - 2. Then provide the analysis - - After each tool response, analyze the data to determine if: - - Additional steps are needed - - The data needs to be processed to answer the user's question (e.g., finding highest/lowest values, filtering, etc.) - - All tools will need the chainName and account arguments: chainName: "sonic", account: "${signer.address}".`, - }, - { role: 'user', content: question }, - ]; - - const results: FunctionReturn[] = []; - let isComplete = false; - - if (options?.verbose) { - console.log('System prompt:', util.inspect(messages[0], { depth: null, colors: true })); - } - - while (!isComplete) { - // Call the LLM to determine which tools to call - const completion = await openai.chat.completions.create({ - model: 'gpt-4', - messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[], - tools: tools.map((tool) => fromHeyAnonToolsToOpenAiTools(tool)), - tool_choice: 'auto', - }); - - // Add the LLM response to the conversation - const assistantMessage = completion.choices[0].message; - messages.push({ - role: 'assistant', - content: assistantMessage.content || '', - tool_calls: assistantMessage.tool_calls, - }); - - if (options?.verbose) { - console.log('LLM says:', util.inspect(messages[messages.length - 1], { depth: null, colors: true })); - } - - // If no tool calls, the assistant is done - if (!assistantMessage.tool_calls) { - isComplete = true; - // Add the final analysis to results if we have previous tool results - if (results.length > 0 && assistantMessage.content) { - return toResult(assistantMessage.content); - } - continue; - } - - // Determine which tool to call and its arguments - const functionCall = assistantMessage.tool_calls[0]; - const functionName = functionCall.function.name as keyof typeof functions; - const functionArgs = JSON.parse(functionCall.function.arguments); - - console.log(chalk.gray(`[Debug] Executing function: ${functionName}`)); - console.log(chalk.gray(`[Debug] Args: ${JSON.stringify(functionArgs)}`)); - - const func = functions[functionName]; - if (!func) { - return toResult(`Function ${functionName} not found.`, true); - } - - // Replace chain & address for good measure - functionArgs.chainName = 'sonic'; - functionArgs.account = signer.address; - - // Call the tool and add the result to the conversation - try { - const result = await func(functionArgs, functionOptions); - results.push(result); - - if (!result.success) { - return result; - } - - // Add the tool response to the conversation with more context - messages.push({ - role: 'tool', - tool_call_id: functionCall.id, - name: functionName, - content: JSON.stringify({ - toolName: functionName, - data: result.data, - }), - }); - - if (options?.verbose) { - console.log('Tool message:', util.inspect(messages[messages.length - 1], { depth: null, colors: true })); - } - - // Add an analysis prompt if this was the last tool call - if (!assistantMessage.tool_calls?.[1]) { - messages.push({ - role: 'user', - content: 'Provide an answer to my original question using the data you collected. If you need more tools, call them.', - }); - } - } catch (error) { - return toResult(`Error executing ${functionName}: ${error instanceof Error ? error.message : 'Unknown error'}`, true); - } - } - - // Modify the final return logic - if (results.length === 0) { - return toResult('Could not identify any operations to perform.', true); - } else if (results.length === 1 && !messages[messages.length - 1].content) { - // If we only have one result and no final analysis, return the tool result - return results[0]; - } - - // If we have a final analysis message, use that as the result - const finalMessage = messages[messages.length - 1]; - if (finalMessage.role === 'assistant' && finalMessage.content) { - return toResult(finalMessage.content); - } - - // Fallback to combining all results if no final analysis - const combinedMessage = results.map((r, i) => `Step ${i + 1}: ${r.data}`).join('\n'); - return toResult(combinedMessage); -} diff --git a/projects/beets-lst/package.json b/projects/beets-lst/package.json index ff98f8e0..98a0bbf2 100644 --- a/projects/beets-lst/package.json +++ b/projects/beets-lst/package.json @@ -1,26 +1,49 @@ { "name": "@projects/beets-lst", "version": "1.0.0", + "license": "MIT", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "module": "dist/index.mjs", + "files": [ + "dist" + ], + "engines": { + "node": ">=18.x" + }, + "publishConfig": { + "access": "public" + }, "scripts": { - "yarn": "yarn install", - "ask": "ts-node examples/run.ts" + "start": "tsup --watch", + "build": "tsup", + "test": "vitest --run", + "lint": "tsdx lint", + "prepare": "pnpm run build", + "size": "size-limit", + "analyze": "size-limit --why", + "format": "prettier --write \"*/**/*.ts\"", + "ask": "tsup src/ask_beets/run.ts && node dist/run.js" }, "dependencies": { - "@heyanon/sdk": "^1.0.4", + "@balancer/sdk": "^2.1.3", + "@heyanon/sdk": "^2.0.2", "axios": "^1.7.9", - "chalk": "4" - }, - "license": "MIT", - "engines": { - "npm": "please-use-yarn", - "node": ">=18.x", - "yarn": ">=1.22" + "chalk": "4", + "viem": "2.22.9", + "vitest": "^2.1.8" }, "devDependencies": { + "@size-limit/preset-small-lib": "^9.0.0", + "@types/big.js": "^6.2.0", + "@types/jest": "^29.5.12", + "@types/node": "^22.13.4", "dotenv": "^16.4.7", "openai": "^4.80.0", "prettier": "^3.4.2", - "ts-node": "^10.9.2", + "tsdx": "^0.14.1", + "tslib": "^2.6.2", + "tsup": "^7.2.0", "typescript": "^5.7.3" } } diff --git a/projects/beets-lst/abis/index.ts b/projects/beets-lst/src/abis/index.ts similarity index 100% rename from projects/beets-lst/abis/index.ts rename to projects/beets-lst/src/abis/index.ts diff --git a/projects/beets-lst/abis/stsAbi.ts b/projects/beets-lst/src/abis/stsAbi.ts similarity index 100% rename from projects/beets-lst/abis/stsAbi.ts rename to projects/beets-lst/src/abis/stsAbi.ts diff --git a/projects/beets-lst/abis/stsHelperAbi.ts b/projects/beets-lst/src/abis/stsHelperAbi.ts similarity index 100% rename from projects/beets-lst/abis/stsHelperAbi.ts rename to projects/beets-lst/src/abis/stsHelperAbi.ts diff --git a/projects/beets-lst/src/ask_beets/askBeets.ts b/projects/beets-lst/src/ask_beets/askBeets.ts new file mode 100644 index 00000000..767a3639 --- /dev/null +++ b/projects/beets-lst/src/ask_beets/askBeets.ts @@ -0,0 +1,288 @@ +import OpenAI from 'openai'; +import { privateKeyToAccount } from 'viem/accounts'; +import { createPublicClient, http, createWalletClient } from 'viem'; +import { sonic } from 'viem/chains'; +import { EVM, FunctionOptions, FunctionReturn, SolanaFunctionOptions, toResult } from '@heyanon/sdk'; +import { tools } from '../tools'; +import { tools as askBeetsTools } from './tools'; +import * as functions from '../functions'; +import util from 'util'; +import chalk from 'chalk'; +import { fromHeyAnonToolsToOpenAiTools } from '../helpers/openai'; + +// AI configuration +const OPENAI_MODEL = 'gpt-4o'; +const DEEPSEEK_MODEL = 'deepseek-reasoner'; +const PROMPT_TYPE: 'minimal' | 'extended' = 'minimal'; + +// Protocol & chain configuration +const CHAIN_NAME = 'sonic'; +const CHAIN_VIEM = sonic; +const PROTOCOL_NAME = 'Beets'; + +interface AskBeetsOptions { + verbose?: boolean; + notify?: (message: string) => Promise; + analysis?: boolean; +} + +interface ConversationMessage { + role: 'system' | 'user' | 'assistant' | 'tool'; + content: string; + tool_calls?: OpenAI.Chat.Completions.ChatCompletionMessage['tool_calls']; + tool_call_id?: string; + name?: string; +} + +function getSystemPrompt(options: AskBeetsOptions | undefined, chainName: string, account: string) { + if (PROMPT_TYPE === 'minimal') { + return getSystemPromptMinimal(options, chainName, account); + } else { + return getSystemPromptExtended(options, chainName, account); + } +} + +function getSystemPromptMinimal(_options: AskBeetsOptions | undefined, chainName: string, account: string) { + const basePrompt = `You will interact with the ${PROTOCOL_NAME} protocol via your tools. Given a request, you will need to determine which tools to call.`; + + const tokenPrompt = `\nYou WILL NOT modify token addresses, names or symbols, not even to make them plural.`; + + const toolConfigPrompt = `\nAll tools that require the chainName and account arguments will need the following default values: chainName: "${chainName}", account: "${account}".`; + + return basePrompt + tokenPrompt + toolConfigPrompt; +} + +function getSystemPromptExtended(_options: AskBeetsOptions | undefined, chainName: string, account: string) { + const basePrompt = `You will interact with the ${PROTOCOL_NAME} protocol via your tools. Given a request, you will need to determine which tools to call. + +For operations that require multiple steps (like "withdraw all"), you should first get required information before executing actions. +For example, to withdraw all liquidity positions: +1. First call getMyPositionsPortfolio to get a list of all the positions +2. Then use the ID of each position to withdraw it`; + + const rawResponsePrompt = ` +IMPORTANT: For all tool responses: +1. Return the EXACT tool response without ANY modifications or analysis +2. Do not reformat, summarize, or add explanatory text +3. Do not interpret or process the data in any way`; + + const toolConfigPrompt = `\nAll tools that require the chainName and account arguments will need the following default values: chainName: "${chainName}", account: "${account}".`; + + const nextStepsPrompt = `\nAfter each tool response, determine if additional steps are needed.`; + + return basePrompt + rawResponsePrompt + toolConfigPrompt + nextStepsPrompt; +} + +function getLlmClient() { + const openaiApiKey = process.env.OPENAI_API_KEY; + const deepseekApiKey = process.env.DEEPSEEK_API_KEY; + if (!openaiApiKey && !deepseekApiKey) { + throw new Error('OPENAI_API_KEY or DEEPSEEK_API_KEY environment variable is required'); + } + if (deepseekApiKey) { + return new OpenAI({ apiKey: deepseekApiKey, baseURL: 'https://api.deepseek.com/v1' }); + } else { + return new OpenAI({ apiKey: openaiApiKey }); + } +} + +function getLlmModel() { + const deepseekApiKey = process.env.DEEPSEEK_API_KEY; + if (deepseekApiKey) { + return DEEPSEEK_MODEL; + } else { + return OPENAI_MODEL; + } +} + +/** + * The askBeets agent. + * + * Ask the agent a question or give it an order. The agent will use the tools + * defined in the tools.ts file to perform the necessary operations. + * + * The agent has an additional step to analyze the data provided by the tools + * and provide a final answer. + */ +export async function askBeets(question: string, options?: AskBeetsOptions): Promise { + const llmClient = getLlmClient(); + + const privateKey = process.env.PRIVATE_KEY; + if (!privateKey) { + throw new Error('PRIVATE_KEY environment variable is required'); + } + + const notify = options?.notify || (async (message: string) => console.log(`[Notification] ${message}`)); + + const signer = privateKeyToAccount(`0x${privateKey}`); + const provider = createPublicClient({ + chain: CHAIN_VIEM, + transport: http(), + }); + + // Create minimal FunctionOptions object + const functionOptions: FunctionOptions = { + evm: { + getProvider: () => provider, + getRecipient: () => Promise.resolve(signer.address), + sendTransactions: async (props: EVM.types.SendTransactionProps) => { + // Create wallet client + const walletClient = createWalletClient({ + account: signer, + chain: provider.chain, + transport: http(), + }); + + const txsReturns = []; + + // Send transactions sequentially + for (const tx of props.transactions) { + const hash = await walletClient.sendTransaction({ + to: tx.target, + data: tx.data, + value: tx.value || 0n, + }); + + const receipt = await provider.waitForTransactionReceipt({ hash }); + + if (!receipt?.status || receipt.status !== 'success') { + throw new Error(`Transaction failed with hash: ${receipt.transactionHash}`); + } + + txsReturns.push({ + hash: receipt.transactionHash, + message: `Transaction confirmed with hash: ${receipt.transactionHash}`, + }); + } + + return { + isMultisig: false, + data: txsReturns, + }; + }, + signTypedDatas: async (typedDatas) => { + const signatures = await Promise.all(typedDatas.map((typedData) => signer.signTypedData(typedData))); + return signatures; + }, + }, + // Placeholder for Solana options + solana: {} as SolanaFunctionOptions, + notify, + }; + + const messages: ConversationMessage[] = [ + { + role: 'system', + content: getSystemPrompt(options, CHAIN_NAME, signer.address), + }, + { role: 'user', content: question }, + ]; + + const funcReturns: FunctionReturn[] = []; + let isComplete = false; + + if (options?.verbose) { + console.log('System prompt:', util.inspect(messages[0], { depth: null, colors: true })); + } + + while (!isComplete) { + // Call the LLM to determine which tools to call + const completion = await llmClient.chat.completions.create({ + model: getLlmModel(), + messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[], + tools: [...tools, ...askBeetsTools].map((tool) => fromHeyAnonToolsToOpenAiTools(tool)), + tool_choice: 'auto', + }); + + // Add the LLM response to the conversation + const assistantMessage = completion.choices[0].message; + messages.push({ + role: 'assistant', + content: assistantMessage.content || '', + tool_calls: assistantMessage.tool_calls, + }); + + if (options?.verbose) { + console.log('LLM says:', util.inspect(messages[messages.length - 1], { depth: null, colors: true })); + } + + // If no tool calls, the assistant is done + if (!assistantMessage.tool_calls) { + isComplete = true; + continue; + } + + // Execute all tool calls instead of just the first one + for (const functionCall of assistantMessage.tool_calls) { + const functionName = functionCall.function.name as keyof typeof functions; + const functionArgs = JSON.parse(functionCall.function.arguments); + + console.log(chalk.gray(`[Debug] Executing function: ${functionName}`)); + console.log(chalk.gray(`[Debug] Args: ${JSON.stringify(functionArgs)}`)); + + const func = functions[functionName]; + if (!func) { + throw new Error(`Function ${functionName} not found.`); + } + + // Replace chain & address for good measure + functionArgs.chainName = CHAIN_NAME; + functionArgs.account = signer.address; + + // Call the tool and add the result to the conversation + try { + const funcReturn = await func(functionArgs, functionOptions); + funcReturns.push(funcReturn); + console.log(chalk.gray(`[Debug] Function returned ${funcReturn.success ? 'success' : 'failure'}`)); + + if (!funcReturn.success) { + return funcReturn; + } else { + console.log(chalk.gray(`[Debug] Function output: ${funcReturn.data}`)); + } + + // Add the tool response to the conversation with more context + messages.push({ + role: 'tool', + tool_call_id: functionCall.id, + name: functionName, + content: funcReturn.data, + }); + + if (options?.verbose) { + console.log(`Tool '${functionName}' message:`, util.inspect(messages[messages.length - 1], { depth: null, colors: true })); + } + } catch (error) { + throw new Error(`Error executing tool '${functionName}': ${error instanceof Error ? `${error.message}` : 'Unknown error'}`); + } + } + } + + // Return if we have no results + if (funcReturns.length === 0) { + throw new Error('Could not identify any operations to perform.'); + } + + // Internal consistency check + const finalMessage = messages[messages.length - 1]; + if (finalMessage.role !== 'assistant') { + throw new Error('Final message is not an assistant message'); + } + const assistantFinalComment = finalMessage.content; + + // Return all tool calls followed by the final comment of the assistant + let combinedMessage = funcReturns + .map((r, i) => { + const toolName = messages.find((m) => m.role === 'tool' && m.content === r.data)?.name || 'Unknown Tool'; + const msg = chalk.underline.bold(`TOOL CALL ${i + 1}`) + `: ${toolName}`; + return `${msg}\n${r.data}`; + }) + .join('\n'); + + // Add the final comment of the assistant + if (assistantFinalComment) { + combinedMessage += `\n${chalk.underline.bold('ASSISTANT FINAL COMMENT')}\n${assistantFinalComment}`; + } + + return toResult(combinedMessage); +} diff --git a/projects/beets-lst/examples/run.ts b/projects/beets-lst/src/ask_beets/run.ts similarity index 71% rename from projects/beets-lst/examples/run.ts rename to projects/beets-lst/src/ask_beets/run.ts index 28157378..fc7ca8b9 100644 --- a/projects/beets-lst/examples/run.ts +++ b/projects/beets-lst/src/ask_beets/run.ts @@ -1,4 +1,3 @@ -import chalk from 'chalk'; import { askBeets } from './askBeets'; import dotenv from 'dotenv'; @@ -11,14 +10,15 @@ if (!question) { } const verbose = process.argv.includes('--verbose'); +const analysis = process.argv.includes('--analysis'); async function main() { - const result = await askBeets(question, { verbose }); + const result = await askBeets(question, { verbose, analysis }); if (!result.success) { console.error(`${result.data}`); process.exit(0); } - console.log(`[Response] ${chalk.bold(result.data)}`); + console.log(`[Response]\n${result.data}`); } main().catch(console.error); diff --git a/projects/beets-lst/src/ask_beets/tools.ts b/projects/beets-lst/src/ask_beets/tools.ts new file mode 100644 index 00000000..59cc51ce --- /dev/null +++ b/projects/beets-lst/src/ask_beets/tools.ts @@ -0,0 +1,57 @@ +import { AiTool, EVM } from '@heyanon/sdk'; +import { supportedChains } from '../constants'; + +/** + * Tools specific for the askBeets agent, and that are not + * included in the HeyAnon integration because they could + * interfer with HeyAnon's functionality. + */ +export const tools: AiTool[] = [ + { + name: 'getTokenAddressFromSymbol', + description: 'Get the address of a token from its symbol.', + required: ['chainName', 'symbol'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(EVM.utils.getChainName), + description: 'Chain name', + }, + { + name: 'symbol', + type: 'string', + description: 'Token symbol (e.g. "wS", "stS", "USDC.e")', + }, + ], + }, + { + name: 'getTokenBalance', + description: "Get the balance of a token in the user's wallet.", + required: ['chainName', 'account', 'tokenAddress'], + props: [ + { + name: 'chainName', + type: 'string', + enum: supportedChains.map(EVM.utils.getChainName), + description: 'Chain name', + }, + { + name: 'account', + type: 'string', + description: 'Account address', + }, + { + name: 'tokenAddress', + type: 'string', + description: 'Token address', + }, + ], + }, + { + name: 'getBeetsCapabilities', + description: 'Get information about what Beets DEX can do and example prompts.', + required: [], + props: [], + }, +]; diff --git a/projects/beets-lst/constants.ts b/projects/beets-lst/src/constants.ts similarity index 100% rename from projects/beets-lst/constants.ts rename to projects/beets-lst/src/constants.ts diff --git a/projects/beets-lst/functions/getNextWithdrawal.ts b/projects/beets-lst/src/functions/getNextWithdrawal.ts similarity index 100% rename from projects/beets-lst/functions/getNextWithdrawal.ts rename to projects/beets-lst/src/functions/getNextWithdrawal.ts diff --git a/projects/beets-lst/functions/getOpenWithdrawRequests.ts b/projects/beets-lst/src/functions/getOpenWithdrawRequests.ts similarity index 100% rename from projects/beets-lst/functions/getOpenWithdrawRequests.ts rename to projects/beets-lst/src/functions/getOpenWithdrawRequests.ts diff --git a/projects/beets-lst/functions/getProtocolSonicToStakedSonicExchangeRate.ts b/projects/beets-lst/src/functions/getProtocolSonicToStakedSonicExchangeRate.ts similarity index 100% rename from projects/beets-lst/functions/getProtocolSonicToStakedSonicExchangeRate.ts rename to projects/beets-lst/src/functions/getProtocolSonicToStakedSonicExchangeRate.ts diff --git a/projects/beets-lst/functions/getProtocolStakedSonicToSonicExchangeRate.ts b/projects/beets-lst/src/functions/getProtocolStakedSonicToSonicExchangeRate.ts similarity index 100% rename from projects/beets-lst/functions/getProtocolStakedSonicToSonicExchangeRate.ts rename to projects/beets-lst/src/functions/getProtocolStakedSonicToSonicExchangeRate.ts diff --git a/projects/beets-lst/functions/getSonicBalance.ts b/projects/beets-lst/src/functions/getSonicBalance.ts similarity index 100% rename from projects/beets-lst/functions/getSonicBalance.ts rename to projects/beets-lst/src/functions/getSonicBalance.ts diff --git a/projects/beets-lst/functions/getStakedSonicBalance.ts b/projects/beets-lst/src/functions/getStakedSonicBalance.ts similarity index 100% rename from projects/beets-lst/functions/getStakedSonicBalance.ts rename to projects/beets-lst/src/functions/getStakedSonicBalance.ts diff --git a/projects/beets-lst/functions/getStakingApr.ts b/projects/beets-lst/src/functions/getStakingApr.ts similarity index 100% rename from projects/beets-lst/functions/getStakingApr.ts rename to projects/beets-lst/src/functions/getStakingApr.ts diff --git a/projects/beets-lst/functions/getTotalSonicInProtocol.ts b/projects/beets-lst/src/functions/getTotalSonicInProtocol.ts similarity index 100% rename from projects/beets-lst/functions/getTotalSonicInProtocol.ts rename to projects/beets-lst/src/functions/getTotalSonicInProtocol.ts diff --git a/projects/beets-lst/functions/getTotalStakedSonicInProtocol.ts b/projects/beets-lst/src/functions/getTotalStakedSonicInProtocol.ts similarity index 100% rename from projects/beets-lst/functions/getTotalStakedSonicInProtocol.ts rename to projects/beets-lst/src/functions/getTotalStakedSonicInProtocol.ts diff --git a/projects/beets-lst/functions/index.ts b/projects/beets-lst/src/functions/index.ts similarity index 100% rename from projects/beets-lst/functions/index.ts rename to projects/beets-lst/src/functions/index.ts diff --git a/projects/beets-lst/functions/stake.ts b/projects/beets-lst/src/functions/stake.ts similarity index 100% rename from projects/beets-lst/functions/stake.ts rename to projects/beets-lst/src/functions/stake.ts diff --git a/projects/beets-lst/functions/unStake.ts b/projects/beets-lst/src/functions/unStake.ts similarity index 100% rename from projects/beets-lst/functions/unStake.ts rename to projects/beets-lst/src/functions/unStake.ts diff --git a/projects/beets-lst/functions/withdraw.ts b/projects/beets-lst/src/functions/withdraw.ts similarity index 100% rename from projects/beets-lst/functions/withdraw.ts rename to projects/beets-lst/src/functions/withdraw.ts diff --git a/projects/beets-lst/functions/withdrawAll.ts b/projects/beets-lst/src/functions/withdrawAll.ts similarity index 100% rename from projects/beets-lst/functions/withdrawAll.ts rename to projects/beets-lst/src/functions/withdrawAll.ts diff --git a/projects/beets-lst/helpers/client.ts b/projects/beets-lst/src/helpers/client.ts similarity index 100% rename from projects/beets-lst/helpers/client.ts rename to projects/beets-lst/src/helpers/client.ts diff --git a/projects/beets-lst/helpers/openai.ts b/projects/beets-lst/src/helpers/openai.ts similarity index 100% rename from projects/beets-lst/helpers/openai.ts rename to projects/beets-lst/src/helpers/openai.ts diff --git a/projects/beets-lst/helpers/withdrawals.ts b/projects/beets-lst/src/helpers/withdrawals.ts similarity index 100% rename from projects/beets-lst/helpers/withdrawals.ts rename to projects/beets-lst/src/helpers/withdrawals.ts diff --git a/projects/beets-lst/index.ts b/projects/beets-lst/src/index.ts similarity index 100% rename from projects/beets-lst/index.ts rename to projects/beets-lst/src/index.ts diff --git a/projects/beets-lst/tools.ts b/projects/beets-lst/src/tools.ts similarity index 100% rename from projects/beets-lst/tools.ts rename to projects/beets-lst/src/tools.ts diff --git a/projects/beets-lst/tsconfig.json b/projects/beets-lst/tsconfig.json index 94ccf0bb..7cf3fcb5 100644 --- a/projects/beets-lst/tsconfig.json +++ b/projects/beets-lst/tsconfig.json @@ -1,30 +1,43 @@ { + // see https://www.typescriptlang.org/tsconfig to better understand tsconfigs + "include": [ + "src", + "types" + ], "compilerOptions": { - "target": "ES2020", - "module": "commonjs", + "outDir": "./dist", + "module": "esnext", "lib": [ - "ES2020" + "dom", + "esnext" ], - "moduleResolution": "node", + "importHelpers": true, + "target": "es2020", + // output .d.ts declaration files for consumers + "declaration": true, + // output .js.map sourcemap files for consumers + "sourceMap": true, + // match output dir to input dir. e.g. dist/index instead of dist/src/index + "rootDir": "./src", + // stricter type-checking for stronger correctness. Recommended by TS "strict": true, + // linter checks for common issues + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + // noUnused* overlap with @typescript-eslint/no-unused-vars, can disable if duplicative + "noUnusedLocals": true, + "noUnusedParameters": true, + // use Node's module resolution algorithm, instead of the legacy TS one + "moduleResolution": "node", + // transpile JSX to React.createElement + "jsx": "react", + // interop between ESM and CJS modules. Recommended by TS "esModuleInterop": true, + // significant perf increase by skipping checking .d.ts files, particularly those in node_modules. Recommended by TS "skipLibCheck": true, + // error out if import and file system have a casing mismatch. Recommended by TS "forceConsistentCasingInFileNames": true, - "outDir": "./dist", - "rootDir": ".", - "resolveJsonModule": true, - "allowJs": true - }, - "ts-node": { - "compilerOptions": { - "module": "commonjs" - } - }, - "include": [ - "./**/*.ts" - ], - "exclude": [ - "node_modules", - "dist" - ] + // allow experimental decorators, used for memoization + "experimentalDecorators": true, + } } \ No newline at end of file diff --git a/projects/beets-lst/tsup.config.ts b/projects/beets-lst/tsup.config.ts new file mode 100644 index 00000000..9a933162 --- /dev/null +++ b/projects/beets-lst/tsup.config.ts @@ -0,0 +1,23 @@ +import { exec } from 'child_process'; +import { defineConfig } from 'tsup'; + +export default defineConfig((options) => ({ + entry: { + index: './src/index.ts', + }, + format: ['esm', 'cjs'], + dts: false, + treeshake: true, + splitting: true, + clean: !options.watch, + onSuccess: async () => { + exec('tsc --emitDeclarationOnly --declaration', (err) => { + if (err) { + console.error(err); + if (!options.watch) { + process.exit(1); + } + } + }); + }, +})); diff --git a/projects/beets-lst/yarn.lock b/projects/beets-lst/yarn.lock deleted file mode 100644 index ef128ea6..00000000 --- a/projects/beets-lst/yarn.lock +++ /dev/null @@ -1,1403 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adraffy/ens-normalize@^1.10.1": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" - integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@heyanon/sdk@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@heyanon/sdk/-/sdk-1.0.4.tgz#97c74d7b4c3c189acd1fda923f3e5dc141c680cc" - integrity sha512-OWWOjbKeUqCIlNQJy7R2ixVxL+1kFTM7gbvN4THArVyMw7bMif4iIk+ZCaeVKkKSBXtoVh7u03PzX10dPcLzVg== - dependencies: - "@real-wagmi/sdk" "^1.4.5" - viem "^2.22.7" - vitest "^2.1.8" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jridgewell/resolve-uri@^3.0.3": - 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.10", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@noble/curves@1.7.0", "@noble/curves@~1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.7.0.tgz#0512360622439256df892f21d25b388f52505e45" - integrity sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw== - dependencies: - "@noble/hashes" "1.6.0" - -"@noble/curves@^1.6.0", "@noble/curves@~1.8.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.1.tgz#19bc3970e205c99e4bdb1c64a4785706bce497ff" - integrity sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ== - dependencies: - "@noble/hashes" "1.7.1" - -"@noble/hashes@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.0.tgz#d4bfb516ad6e7b5111c216a5cc7075f4cf19e6c5" - integrity sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ== - -"@noble/hashes@1.6.1", "@noble/hashes@~1.6.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" - integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== - -"@noble/hashes@1.7.1", "@noble/hashes@^1.5.0", "@noble/hashes@~1.7.1": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.1.tgz#5738f6d765710921e7a751e00c20ae091ed8db0f" - integrity sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ== - -"@real-wagmi/sdk@^1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@real-wagmi/sdk/-/sdk-1.4.5.tgz#967bc7494934241941eb45de6eab0b92d610bc1d" - integrity sha512-IfCA86jWWswli86yBPK194IzuMDLBGkuKSvHNjW9xTmlhAKP9lOGD26W6Z50zLMokv0WfxqoH69KS2Z/kOFecA== - dependencies: - "@uniswap/token-lists" "1.0.0-beta.33" - big.js "^6.2.1" - decimal.js-light "^2.5.1" - tiny-invariant "^1.3.1" - toformat "^2.0.0" - viem "^2.7.20" - vitest "^1.3.1" - -"@rollup/rollup-android-arm-eabi@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz#d4dd60da0075a6ce9a6c76d71b8204f3e1822285" - integrity sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA== - -"@rollup/rollup-android-arm64@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz#25c4d33259a7a2ccd2f52a5ffcc0bb3ab3f0729d" - integrity sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g== - -"@rollup/rollup-darwin-arm64@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz#d137dff254b19163a6b52ac083a71cd055dae844" - integrity sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g== - -"@rollup/rollup-darwin-x64@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz#58ff20b5dacb797d3adca19f02a21c532f9d55bf" - integrity sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ== - -"@rollup/rollup-freebsd-arm64@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz#96ce1a241c591ec3e068f4af765d94eddb24e60c" - integrity sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew== - -"@rollup/rollup-freebsd-x64@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz#e59e7ede505be41f0b4311b0b943f8eb44938467" - integrity sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA== - -"@rollup/rollup-linux-arm-gnueabihf@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz#e455ca6e4ff35bd46d62201c153352e717000a7b" - integrity sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw== - -"@rollup/rollup-linux-arm-musleabihf@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz#bc1a93d807d19e70b1e343a5bfea43723bcd6327" - integrity sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg== - -"@rollup/rollup-linux-arm64-gnu@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz#f38bf843f1dc3d5de680caf31084008846e3efae" - integrity sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA== - -"@rollup/rollup-linux-arm64-musl@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz#b3987a96c18b7287129cf735be2dbf83e94d9d05" - integrity sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g== - -"@rollup/rollup-linux-loongarch64-gnu@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz#0f0324044e71c4f02e9f49e7ec4e347b655b34ee" - integrity sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ== - -"@rollup/rollup-linux-powerpc64le-gnu@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz#809479f27f1fd5b4eecd2aa732132ad952d454ba" - integrity sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ== - -"@rollup/rollup-linux-riscv64-gnu@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz#7bc75c4f22db04d3c972f83431739cfa41c6a36e" - integrity sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw== - -"@rollup/rollup-linux-s390x-gnu@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz#cfe8052345c55864d83ae343362cf1912480170e" - integrity sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ== - -"@rollup/rollup-linux-x64-gnu@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz#c6b048f1e25f3fea5b4bd246232f4d07a159c5a0" - integrity sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g== - -"@rollup/rollup-linux-x64-musl@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz#615273ac52d1a201f4de191cbd3389016a9d7d80" - integrity sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA== - -"@rollup/rollup-win32-arm64-msvc@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz#32ed85810c1b831c648eca999d68f01255b30691" - integrity sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw== - -"@rollup/rollup-win32-ia32-msvc@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz#d47effada68bcbfdccd30c4a788d42e4542ff4d3" - integrity sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ== - -"@rollup/rollup-win32-x64-msvc@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz#7a2d89a82cf0388d60304964217dd7beac6de645" - integrity sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw== - -"@scure/base@~1.2.1", "@scure/base@~1.2.2", "@scure/base@~1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.4.tgz#002eb571a35d69bdb4c214d0995dff76a8dcd2a9" - integrity sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ== - -"@scure/bip32@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.6.0.tgz#6dbc6b4af7c9101b351f41231a879d8da47e0891" - integrity sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA== - dependencies: - "@noble/curves" "~1.7.0" - "@noble/hashes" "~1.6.0" - "@scure/base" "~1.2.1" - -"@scure/bip32@^1.5.0": - version "1.6.2" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.6.2.tgz#093caa94961619927659ed0e711a6e4bf35bffd0" - integrity sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw== - dependencies: - "@noble/curves" "~1.8.1" - "@noble/hashes" "~1.7.1" - "@scure/base" "~1.2.2" - -"@scure/bip39@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.5.0.tgz#c8f9533dbd787641b047984356531d84485f19be" - integrity sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A== - dependencies: - "@noble/hashes" "~1.6.0" - "@scure/base" "~1.2.1" - -"@scure/bip39@^1.4.0": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.5.4.tgz#07fd920423aa671be4540d59bdd344cc1461db51" - integrity sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA== - dependencies: - "@noble/hashes" "~1.7.1" - "@scure/base" "~1.2.4" - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/estree@1.0.6", "@types/estree@^1.0.0": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - -"@types/node-fetch@^2.6.4": - version "2.6.12" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03" - integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== - dependencies: - "@types/node" "*" - form-data "^4.0.0" - -"@types/node@*": - version "22.10.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.7.tgz#14a1ca33fd0ebdd9d63593ed8d3fbc882a6d28d7" - integrity sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg== - dependencies: - undici-types "~6.20.0" - -"@types/node@^18.11.18": - version "18.19.71" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.71.tgz#96d4f0a0be735ead6c8998c62a4b2c0012a5d09a" - integrity sha512-evXpcgtZm8FY4jqBSN8+DmOTcVkkvTmAayeo4Wf3m1xAruyVGzGuDh/Fb/WWX2yLItUiho42ozyJjB0dw//Tkw== - dependencies: - undici-types "~5.26.4" - -"@uniswap/token-lists@1.0.0-beta.33": - version "1.0.0-beta.33" - resolved "https://registry.yarnpkg.com/@uniswap/token-lists/-/token-lists-1.0.0-beta.33.tgz#966ba96c9ccc8f0e9e09809890b438203f2b1911" - integrity sha512-JQkXcpRI3jFG8y3/CGC4TS8NkDgcxXaOQuYW8Qdvd6DcDiIyg2vVYCG9igFEzF0G6UvxgHkBKC7cWCgzZNYvQg== - -"@vitest/expect@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.6.0.tgz#0b3ba0914f738508464983f4d811bc122b51fb30" - integrity sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ== - dependencies: - "@vitest/spy" "1.6.0" - "@vitest/utils" "1.6.0" - chai "^4.3.10" - -"@vitest/expect@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.8.tgz#13fad0e8d5a0bf0feb675dcf1d1f1a36a1773bc1" - integrity sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw== - dependencies: - "@vitest/spy" "2.1.8" - "@vitest/utils" "2.1.8" - chai "^5.1.2" - tinyrainbow "^1.2.0" - -"@vitest/mocker@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.8.tgz#51dec42ac244e949d20009249e033e274e323f73" - integrity sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA== - dependencies: - "@vitest/spy" "2.1.8" - estree-walker "^3.0.3" - magic-string "^0.30.12" - -"@vitest/pretty-format@2.1.8", "@vitest/pretty-format@^2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.8.tgz#88f47726e5d0cf4ba873d50c135b02e4395e2bca" - integrity sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ== - dependencies: - tinyrainbow "^1.2.0" - -"@vitest/runner@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.6.0.tgz#a6de49a96cb33b0e3ba0d9064a3e8d6ce2f08825" - integrity sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg== - dependencies: - "@vitest/utils" "1.6.0" - p-limit "^5.0.0" - pathe "^1.1.1" - -"@vitest/runner@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.8.tgz#b0e2dd29ca49c25e9323ea2a45a5125d8729759f" - integrity sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg== - dependencies: - "@vitest/utils" "2.1.8" - pathe "^1.1.2" - -"@vitest/snapshot@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.6.0.tgz#deb7e4498a5299c1198136f56e6e0f692e6af470" - integrity sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ== - dependencies: - magic-string "^0.30.5" - pathe "^1.1.1" - pretty-format "^29.7.0" - -"@vitest/snapshot@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.8.tgz#d5dc204f4b95dc8b5e468b455dfc99000047d2de" - integrity sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg== - dependencies: - "@vitest/pretty-format" "2.1.8" - magic-string "^0.30.12" - pathe "^1.1.2" - -"@vitest/spy@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.6.0.tgz#362cbd42ccdb03f1613798fde99799649516906d" - integrity sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw== - dependencies: - tinyspy "^2.2.0" - -"@vitest/spy@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.8.tgz#bc41af3e1e6a41ae3b67e51f09724136b88fa447" - integrity sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg== - dependencies: - tinyspy "^3.0.2" - -"@vitest/utils@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.6.0.tgz#5c5675ca7d6f546a7b4337de9ae882e6c57896a1" - integrity sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw== - dependencies: - diff-sequences "^29.6.3" - estree-walker "^3.0.3" - loupe "^2.3.7" - pretty-format "^29.7.0" - -"@vitest/utils@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.8.tgz#f8ef85525f3362ebd37fd25d268745108d6ae388" - integrity sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA== - dependencies: - "@vitest/pretty-format" "2.1.8" - loupe "^3.1.2" - tinyrainbow "^1.2.0" - -abitype@1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.7.tgz#876a0005d211e1c9132825d45bcee7b46416b284" - integrity sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw== - -abitype@^1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.8.tgz#3554f28b2e9d6e9f35eb59878193eabd1b9f46ba" - integrity sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg== - -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" - -acorn-walk@^8.1.1, acorn-walk@^8.3.2: - version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.14.0, acorn@^8.4.1: - version "8.14.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" - integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== - -agentkeepalive@^4.2.1: - version "4.6.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" - integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ== - dependencies: - humanize-ms "^1.2.1" - -ansi-styles@^4.1.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@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -assertion-error@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" - integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== - -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== - -axios@^1.7.9: - version "1.7.9" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.9.tgz#d7d071380c132a24accda1b2cfc1535b79ec650a" - integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -big.js@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.2.tgz#be3bb9ac834558b53b099deef2a1d06ac6368e1a" - integrity sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ== - -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -chai@^4.3.10: - version "4.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" - integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.1.0" - -chai@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.2.tgz#3afbc340b994ae3610ca519a6c70ace77ad4378d" - integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - -chalk@4: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - -check-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" - integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -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" - -confbox@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" - integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.3: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^4.3.4, debug@^4.3.7: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -decimal.js-light@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" - integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== - -deep-eql@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" - integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== - dependencies: - type-detect "^4.0.0" - -deep-eql@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" - integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== - -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== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dotenv@^16.4.7: - version "16.4.7" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" - integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== - -es-module-lexer@^1.5.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" - integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== - -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -estree-walker@^3.0.3: - 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" - -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== - -eventemitter3@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -expect-type@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" - integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== - -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - -form-data-encoder@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" - integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== - -form-data@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" - integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -formdata-node@^4.3.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" - integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== - dependencies: - node-domexception "1.0.0" - web-streams-polyfill "4.0.0-beta.3" - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isows@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.6.tgz#0da29d706fa51551c663c627ace42769850f86e7" - integrity sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw== - -js-tokens@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" - integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== - -local-pkg@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.1.tgz#69658638d2a95287534d4c2fff757980100dbb6d" - integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ== - dependencies: - mlly "^1.7.3" - pkg-types "^1.2.1" - -loupe@^2.3.6, loupe@^2.3.7: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" - -loupe@^3.1.0, loupe@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" - integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== - -magic-string@^0.30.12, magic-string@^0.30.5: - version "0.30.17" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" - integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -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: - 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" - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mlly@^1.7.3, mlly@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f" - integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw== - dependencies: - acorn "^8.14.0" - pathe "^2.0.1" - pkg-types "^1.3.0" - ufo "^1.5.4" - -ms@^2.0.0, 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== - -nanoid@^3.3.8: - version "3.3.8" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" - integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== - -node-domexception@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - -node-fetch@^2.6.7: - 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" - -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -openai@^4.80.0: - version "4.80.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.80.0.tgz#693e5be69a21ed31658a5e0cd8132056cd7a6fb8" - integrity sha512-5TqdNQgjOMxo3CkCvtjzuSwuznO/o3q5aak0MTy6IjRvPtvVA1wAFGJU3eZT1JHzhs2wFb/xtDG0o6Y/2KGCfw== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - -ox@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ox/-/ox-0.6.5.tgz#e6506a589bd6af9b5fecfcb2c641b63c9882edb6" - integrity sha512-vmnH8KvMDwFZDbNY1mq2CBRBWIgSliZB/dFV0xKp+DfF/dJkTENt6nmA+DzHSSAgL/GO2ydjkXWvlndJgSY4KQ== - dependencies: - "@adraffy/ens-normalize" "^1.10.1" - "@noble/curves" "^1.6.0" - "@noble/hashes" "^1.5.0" - "@scure/bip32" "^1.5.0" - "@scure/bip39" "^1.4.0" - abitype "^1.0.6" - eventemitter3 "5.0.1" - -p-limit@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" - integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== - dependencies: - yocto-queue "^1.0.0" - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -pathe@^1.1.1, pathe@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== - -pathe@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.2.tgz#5ed86644376915b3c7ee4d00ac8c348d671da3a5" - integrity sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -pathval@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" - integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== - -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== - -pkg-types@^1.2.1, pkg-types@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" - integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== - dependencies: - confbox "^0.1.8" - mlly "^1.7.4" - pathe "^2.0.1" - -postcss@^8.4.43: - version "8.5.1" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" - integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prettier@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" - integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== - -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -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== - -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -rollup@^4.20.0: - version "4.31.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.31.0.tgz#b84af969a0292cb047dce2c0ec5413a9457597a4" - integrity sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw== - dependencies: - "@types/estree" "1.0.6" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.31.0" - "@rollup/rollup-android-arm64" "4.31.0" - "@rollup/rollup-darwin-arm64" "4.31.0" - "@rollup/rollup-darwin-x64" "4.31.0" - "@rollup/rollup-freebsd-arm64" "4.31.0" - "@rollup/rollup-freebsd-x64" "4.31.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.31.0" - "@rollup/rollup-linux-arm-musleabihf" "4.31.0" - "@rollup/rollup-linux-arm64-gnu" "4.31.0" - "@rollup/rollup-linux-arm64-musl" "4.31.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.31.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.31.0" - "@rollup/rollup-linux-riscv64-gnu" "4.31.0" - "@rollup/rollup-linux-s390x-gnu" "4.31.0" - "@rollup/rollup-linux-x64-gnu" "4.31.0" - "@rollup/rollup-linux-x64-musl" "4.31.0" - "@rollup/rollup-win32-arm64-msvc" "4.31.0" - "@rollup/rollup-win32-ia32-msvc" "4.31.0" - "@rollup/rollup-win32-x64-msvc" "4.31.0" - fsevents "~2.3.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - -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== - -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== - -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -std-env@^3.5.0, std-env@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.8.0.tgz#b56ffc1baf1a29dcc80a3bdf11d7fca7c315e7d5" - integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-literal@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.1.tgz#26906e65f606d49f748454a08084e94190c2e5ad" - integrity sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q== - dependencies: - js-tokens "^9.0.1" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -tiny-invariant@^1.3.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" - integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== - -tinybench@^2.5.1, tinybench@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" - integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== - -tinyexec@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" - integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== - -tinypool@^0.8.3: - version "0.8.4" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.4.tgz#e217fe1270d941b39e98c625dcecebb1408c9aa8" - integrity sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== - -tinypool@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.2.tgz#706193cc532f4c100f66aa00b01c42173d9051b2" - integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== - -tinyrainbow@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" - integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== - -tinyspy@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" - integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== - -tinyspy@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" - integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== - -toformat@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/toformat/-/toformat-2.0.0.tgz#7a043fd2dfbe9021a4e36e508835ba32056739d8" - integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-node@^10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -type-detect@^4.0.0, type-detect@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" - integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== - -typescript@^5.7.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" - integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== - -ufo@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" - integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -viem@^2.22.7, viem@^2.7.20: - version "2.22.10" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.22.10.tgz#64fdfdc6ded7e9f372da0caf30f781aca517b24a" - integrity sha512-amYq+bxD3k9gUx4JXzKtpKrnw1Mc3f4s32g6Axo8twpum+47r+9M2g+qh63gzrs0goTTVUsmg3n9ev+zELKRDw== - dependencies: - "@noble/curves" "1.7.0" - "@noble/hashes" "1.6.1" - "@scure/bip32" "1.6.0" - "@scure/bip39" "1.5.0" - abitype "1.0.7" - isows "1.0.6" - ox "0.6.5" - ws "8.18.0" - -vite-node@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.0.tgz#2c7e61129bfecc759478fa592754fd9704aaba7f" - integrity sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw== - dependencies: - cac "^6.7.14" - debug "^4.3.4" - pathe "^1.1.1" - picocolors "^1.0.0" - vite "^5.0.0" - -vite-node@2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.8.tgz#9495ca17652f6f7f95ca7c4b568a235e0c8dbac5" - integrity sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg== - dependencies: - cac "^6.7.14" - debug "^4.3.7" - es-module-lexer "^1.5.4" - pathe "^1.1.2" - vite "^5.0.0" - -vite@^5.0.0: - version "5.4.12" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.12.tgz#627d12ff06de3942557dfe8632fd712a12a072c7" - integrity sha512-KwUaKB27TvWwDJr1GjjWthLMATbGEbeWYZIbGZ5qFIsgPP3vWzLu4cVooqhm5/Z2SPDUMjyPVjTztm5tYKwQxA== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.43" - rollup "^4.20.0" - optionalDependencies: - fsevents "~2.3.3" - -vitest@^1.3.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.0.tgz#9d5ad4752a3c451be919e412c597126cffb9892f" - integrity sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA== - dependencies: - "@vitest/expect" "1.6.0" - "@vitest/runner" "1.6.0" - "@vitest/snapshot" "1.6.0" - "@vitest/spy" "1.6.0" - "@vitest/utils" "1.6.0" - acorn-walk "^8.3.2" - chai "^4.3.10" - debug "^4.3.4" - execa "^8.0.1" - local-pkg "^0.5.0" - magic-string "^0.30.5" - pathe "^1.1.1" - picocolors "^1.0.0" - std-env "^3.5.0" - strip-literal "^2.0.0" - tinybench "^2.5.1" - tinypool "^0.8.3" - vite "^5.0.0" - vite-node "1.6.0" - why-is-node-running "^2.2.2" - -vitest@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.8.tgz#2e6a00bc24833574d535c96d6602fb64163092fa" - integrity sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ== - dependencies: - "@vitest/expect" "2.1.8" - "@vitest/mocker" "2.1.8" - "@vitest/pretty-format" "^2.1.8" - "@vitest/runner" "2.1.8" - "@vitest/snapshot" "2.1.8" - "@vitest/spy" "2.1.8" - "@vitest/utils" "2.1.8" - chai "^5.1.2" - debug "^4.3.7" - expect-type "^1.1.0" - magic-string "^0.30.12" - pathe "^1.1.2" - std-env "^3.8.0" - tinybench "^2.9.0" - tinyexec "^0.3.1" - tinypool "^1.0.1" - tinyrainbow "^1.2.0" - vite "^5.0.0" - vite-node "2.1.8" - why-is-node-running "^2.3.0" - -web-streams-polyfill@4.0.0-beta.3: - version "4.0.0-beta.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" - integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== - -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@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -why-is-node-running@^2.2.2, why-is-node-running@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" - integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - -ws@8.18.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" - integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== From 47a57344d05e7492f7c1ac4269dbc5786802d755 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Thu, 20 Feb 2025 18:40:20 +0100 Subject: [PATCH 29/33] refac: adapted codebase to heyanon sdk v2 --- projects/beets-lst/pnpm-lock.yaml | 9909 +++++++++++++++++ projects/beets-lst/src/ask_beets/askBeets.ts | 4 +- projects/beets-lst/src/constants.ts | 6 +- .../src/functions/getNextWithdrawal.ts | 6 +- .../src/functions/getOpenWithdrawRequests.ts | 6 +- ...tProtocolSonicToStakedSonicExchangeRate.ts | 6 +- ...tProtocolStakedSonicToSonicExchangeRate.ts | 8 +- .../src/functions/getSonicBalance.ts | 6 +- .../src/functions/getStakedSonicBalance.ts | 6 +- .../beets-lst/src/functions/getStakingApr.ts | 6 +- .../src/functions/getTotalSonicInProtocol.ts | 6 +- .../getTotalStakedSonicInProtocol.ts | 6 +- projects/beets-lst/src/functions/stake.ts | 10 +- projects/beets-lst/src/functions/unStake.ts | 10 +- projects/beets-lst/src/functions/withdraw.ts | 10 +- .../beets-lst/src/functions/withdrawAll.ts | 10 +- projects/beets-lst/src/helpers/openai.ts | 1 - projects/beets-lst/src/tools.ts | 28 +- 18 files changed, 9978 insertions(+), 66 deletions(-) create mode 100644 projects/beets-lst/pnpm-lock.yaml diff --git a/projects/beets-lst/pnpm-lock.yaml b/projects/beets-lst/pnpm-lock.yaml new file mode 100644 index 00000000..84c53dd0 --- /dev/null +++ b/projects/beets-lst/pnpm-lock.yaml @@ -0,0 +1,9909 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@balancer/sdk': + specifier: ^2.1.3 + version: 2.1.3(typescript@5.7.3) + '@heyanon/sdk': + specifier: ^2.0.2 + version: 2.1.2(@ton/crypto@3.3.0)(@types/node@22.13.4)(typescript@5.7.3) + axios: + specifier: ^1.7.9 + version: 1.7.9 + chalk: + specifier: '4' + version: 4.1.2 + viem: + specifier: 2.22.9 + version: 2.22.9(typescript@5.7.3) + vitest: + specifier: ^2.1.8 + version: 2.1.9(@types/node@22.13.4) + +devDependencies: + '@size-limit/preset-small-lib': + specifier: ^9.0.0 + version: 9.0.0(size-limit@9.0.0) + '@types/big.js': + specifier: ^6.2.0 + version: 6.2.2 + '@types/jest': + specifier: ^29.5.12 + version: 29.5.14 + '@types/node': + specifier: ^22.13.4 + version: 22.13.4 + dotenv: + specifier: ^16.4.7 + version: 16.4.7 + openai: + specifier: ^4.80.0 + version: 4.85.3(ws@8.18.0) + prettier: + specifier: ^3.4.2 + version: 3.5.1 + tsdx: + specifier: ^0.14.1 + version: 0.14.1(@types/node@22.13.4) + tslib: + specifier: ^2.6.2 + version: 2.8.1 + tsup: + specifier: ^7.2.0 + version: 7.3.0(typescript@5.7.3) + typescript: + specifier: ^5.7.3 + version: 5.7.3 + +packages: + + /@adraffy/ens-normalize@1.11.0: + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + dev: false + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@babel/code-frame@7.26.2: + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + dev: true + + /@babel/compat-data@7.26.8: + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.26.9: + resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helpers': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.26.9: + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + dev: true + + /@babel/helper-annotate-as-pure@7.25.9: + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.26.9 + dev: true + + /@babel/helper-compilation-targets@7.26.5: + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.26.9(@babel/core@7.26.9): + resolution: {integrity: sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.26.9 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.9): + resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.2.0 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.0.3(@babel/core@7.26.9): + resolution: {integrity: sha512-dULDd/APiP4JowYDAMosecKOi/1v+UId99qhBGiO3myM29KtAVKS/R3x3OJJNBR0FeYB1BcYb2dCwkhqvxWXXQ==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.26.9 + debug: 4.4.0 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.9): + resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + debug: 4.4.0 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-member-expression-to-functions@7.25.9: + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-module-imports@7.25.9: + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9): + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-optimise-call-expression@7.25.9: + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.26.9 + dev: true + + /@babel/helper-plugin-utils@7.26.5: + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers@7.26.5(@babel/core@7.26.9): + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.25.9: + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-string-parser@7.25.9: + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.25.9: + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.25.9: + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-wrap-function@7.25.9: + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers@7.26.9: + resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + dev: true + + /@babel/parser@7.26.9: + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.26.9 + dev: true + + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.26.9): + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.9): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.9): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.9): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.9): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.9): + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.9): + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.9): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.9): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.9): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.9): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.9): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.9): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.9): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.9): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.9): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.9): + resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.9) + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.9): + resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.9): + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.9) + '@babel/traverse': 7.26.9 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/template': 7.26.9 + dev: true + + /@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.9): + resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.9): + resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.9): + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.9): + resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.9) + dev: true + + /@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + regenerator-transform: 0.15.2 + dev: true + + /@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.9): + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.9): + resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.26.7(@babel/core@7.26.9): + resolution: {integrity: sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/preset-env@7.26.9(@babel/core@7.26.9): + resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/core': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.9) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.9) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.9) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.9) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.9) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.9) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.9) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.9) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.9) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.9) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.9) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.9) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.9) + '@babel/plugin-transform-typeof-symbol': 7.26.7(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.9) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.9) + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.9) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.9) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.9) + core-js-compat: 3.40.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.9): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/types': 7.26.9 + esutils: 2.0.3 + dev: true + + /@babel/runtime@7.26.9: + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + + /@babel/template@7.26.9: + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + dev: true + + /@babel/traverse@7.26.9: + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.26.9: + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + dev: true + + /@balancer/sdk@2.1.3(typescript@5.7.3): + resolution: {integrity: sha512-wFLpClEIgqPwtfw4RTfV/nBs21MI4i6LC9odvgFXYfKrSbOITE4gSTsu79PqRsIDrJfaVF649y43YDDmeDmhgQ==} + engines: {node: '>=18.x'} + dependencies: + decimal.js-light: 2.5.1 + lodash.clonedeep: 4.5.0 + viem: 2.22.9(typescript@5.7.3) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + dev: false + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@cnakazawa/watch@1.0.4: + resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} + engines: {node: '>=0.1.95'} + hasBin: true + dependencies: + exec-sh: 0.3.6 + minimist: 1.2.8 + dev: true + + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@heyanon/sdk@2.1.2(@ton/crypto@3.3.0)(@types/node@22.13.4)(typescript@5.7.3): + resolution: {integrity: sha512-bG6DakzR5Z/KraeT6ybDT2+8J34TxOn64UF8iXqCK+rO8aRVXQZBcuorOPHDAbez22igIiRG1ivDW2GMYhFCKA==} + engines: {node: '>=18'} + dependencies: + '@real-wagmi/sdk': 1.4.5(@types/node@22.13.4)(typescript@5.7.3) + '@solana/web3.js': 1.98.0 + '@ton-api/client': 0.3.1(@ton/core@0.60.1) + '@ton-api/ton-adapter': 0.3.0(@ton-api/client@0.3.1)(@ton/core@0.60.1) + '@ton/core': 0.60.1(@ton/crypto@3.3.0) + '@ton/ton': 15.2.1(@ton/core@0.60.1)(@ton/crypto@3.3.0) + viem: 2.22.9(typescript@5.7.3) + vitest: 2.1.9(@types/node@22.13.4) + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@ton/crypto' + - '@types/node' + - '@vitest/browser' + - '@vitest/ui' + - bufferutil + - debug + - encoding + - happy-dom + - jsdom + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - typescript + - utf-8-validate + - zod + dev: false + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console@25.5.0: + resolution: {integrity: sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + chalk: 3.0.0 + jest-message-util: 25.5.0 + jest-util: 25.5.0 + slash: 3.0.0 + dev: true + + /@jest/core@25.5.4: + resolution: {integrity: sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/console': 25.5.0 + '@jest/reporters': 25.5.1 + '@jest/test-result': 25.5.0 + '@jest/transform': 25.5.1 + '@jest/types': 25.5.0 + ansi-escapes: 4.3.2 + chalk: 3.0.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 25.5.0 + jest-config: 25.5.4 + jest-haste-map: 25.5.1 + jest-message-util: 25.5.0 + jest-regex-util: 25.2.6 + jest-resolve: 25.5.1 + jest-resolve-dependencies: 25.5.4 + jest-runner: 25.5.4 + jest-runtime: 25.5.4 + jest-snapshot: 25.5.1 + jest-util: 25.5.0 + jest-validate: 25.5.0 + jest-watcher: 25.5.0 + micromatch: 4.0.8 + p-each-series: 2.2.0 + realpath-native: 2.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /@jest/environment@25.5.0: + resolution: {integrity: sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/fake-timers': 25.5.0 + '@jest/types': 25.5.0 + jest-mock: 25.5.0 + dev: true + + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + dev: true + + /@jest/fake-timers@25.5.0: + resolution: {integrity: sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + jest-message-util: 25.5.0 + jest-mock: 25.5.0 + jest-util: 25.5.0 + lolex: 5.1.2 + dev: true + + /@jest/globals@25.5.2: + resolution: {integrity: sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/environment': 25.5.0 + '@jest/types': 25.5.0 + expect: 25.5.0 + dev: true + + /@jest/reporters@25.5.1: + resolution: {integrity: sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw==} + engines: {node: '>= 8.3'} + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 25.5.0 + '@jest/test-result': 25.5.0 + '@jest/transform': 25.5.1 + '@jest/types': 25.5.0 + chalk: 3.0.0 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-haste-map: 25.5.1 + jest-resolve: 25.5.1 + jest-util: 25.5.0 + jest-worker: 25.5.0 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 3.1.0 + terminal-link: 2.1.1 + v8-to-istanbul: 4.1.4 + optionalDependencies: + node-notifier: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + + /@jest/source-map@25.5.0: + resolution: {integrity: sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==} + engines: {node: '>= 8.3'} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + dev: true + + /@jest/test-result@25.5.0: + resolution: {integrity: sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/console': 25.5.0 + '@jest/types': 25.5.0 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@25.5.4: + resolution: {integrity: sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/test-result': 25.5.0 + graceful-fs: 4.2.11 + jest-haste-map: 25.5.1 + jest-runner: 25.5.4 + jest-runtime: 25.5.4 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /@jest/transform@25.5.1: + resolution: {integrity: sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==} + engines: {node: '>= 8.3'} + dependencies: + '@babel/core': 7.26.9 + '@jest/types': 25.5.0 + babel-plugin-istanbul: 6.1.1 + chalk: 3.0.0 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 25.5.1 + jest-regex-util: 25.2.6 + jest-util: 25.5.0 + micromatch: 4.0.8 + pirates: 4.0.6 + realpath-native: 2.0.0 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@25.5.0: + resolution: {integrity: sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==} + engines: {node: '>= 8.3'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 1.1.2 + '@types/yargs': 15.0.19 + chalk: 3.0.0 + dev: true + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.13.4 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.8: + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true + + /@noble/curves@1.7.0: + resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} + engines: {node: ^14.21.3 || >=16} + dependencies: + '@noble/hashes': 1.6.0 + dev: false + + /@noble/curves@1.8.1: + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + engines: {node: ^14.21.3 || >=16} + dependencies: + '@noble/hashes': 1.7.1 + dev: false + + /@noble/hashes@1.6.0: + resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} + engines: {node: ^14.21.3 || >=16} + dev: false + + /@noble/hashes@1.6.1: + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + engines: {node: ^14.21.3 || >=16} + dev: false + + /@noble/hashes@1.7.1: + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.0 + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@real-wagmi/sdk@1.4.5(@types/node@22.13.4)(typescript@5.7.3): + resolution: {integrity: sha512-IfCA86jWWswli86yBPK194IzuMDLBGkuKSvHNjW9xTmlhAKP9lOGD26W6Z50zLMokv0WfxqoH69KS2Z/kOFecA==} + engines: {node: '>=18'} + dependencies: + '@uniswap/token-lists': 1.0.0-beta.33 + big.js: 6.2.2 + decimal.js-light: 2.5.1 + tiny-invariant: 1.3.3 + toformat: 2.0.0 + viem: 2.22.9(typescript@5.7.3) + vitest: 1.6.1(@types/node@22.13.4) + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/node' + - '@vitest/browser' + - '@vitest/ui' + - bufferutil + - happy-dom + - jsdom + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - typescript + - utf-8-validate + - zod + dev: false + + /@rollup/plugin-babel@5.3.1(@babel/core@7.26.9)(rollup@1.32.1): + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@rollup/pluginutils': 3.1.0(rollup@1.32.1) + rollup: 1.32.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@rollup/plugin-commonjs@11.1.0(rollup@1.32.1): + resolution: {integrity: sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@1.32.1) + commondir: 1.0.1 + estree-walker: 1.0.1 + glob: 7.2.3 + is-reference: 1.2.1 + magic-string: 0.25.9 + resolve: 1.22.10 + rollup: 1.32.1 + dev: true + + /@rollup/plugin-json@4.1.0(rollup@1.32.1): + resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@1.32.1) + rollup: 1.32.1 + dev: true + + /@rollup/plugin-node-resolve@9.0.0(rollup@1.32.1): + resolution: {integrity: sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@1.32.1) + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + rollup: 1.32.1 + dev: true + + /@rollup/plugin-replace@2.4.2(rollup@1.32.1): + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@1.32.1) + magic-string: 0.25.9 + rollup: 1.32.1 + dev: true + + /@rollup/pluginutils@3.1.0(rollup@1.32.1): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 1.32.1 + dev: true + + /@rollup/rollup-android-arm-eabi@4.34.8: + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@rollup/rollup-android-arm64@4.34.8: + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@rollup/rollup-darwin-arm64@4.34.8: + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@rollup/rollup-darwin-x64@4.34.8: + resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@rollup/rollup-freebsd-arm64@4.34.8: + resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@rollup/rollup-freebsd-x64@4.34.8: + resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.34.8: + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.34.8: + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.34.8: + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.34.8: + resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-loongarch64-gnu@4.34.8: + resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.34.8: + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.34.8: + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.34.8: + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.34.8: + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.34.8: + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.34.8: + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.34.8: + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.34.8: + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@rtsao/scc@1.1.0: + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + dev: true + + /@scure/base@1.2.4: + resolution: {integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==} + dev: false + + /@scure/bip32@1.6.0: + resolution: {integrity: sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==} + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/base': 1.2.4 + dev: false + + /@scure/bip39@1.5.0: + resolution: {integrity: sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A==} + dependencies: + '@noble/hashes': 1.6.1 + '@scure/base': 1.2.4 + dev: false + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@size-limit/esbuild@9.0.0(size-limit@9.0.0): + resolution: {integrity: sha512-y3NY0inaFeLqV6SRXNVILhawQdQcODxF30qft6OalsrqtQtBjt++6ZeahYhUbrVexUEWRh6c7yPCe8RvHn8hlA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + size-limit: 9.0.0 + dependencies: + esbuild: 0.19.12 + nanoid: 3.3.8 + size-limit: 9.0.0 + dev: true + + /@size-limit/file@9.0.0(size-limit@9.0.0): + resolution: {integrity: sha512-oM2UaH2FRq4q22k+R+P6xCpzET10T94LFdSjb9svVu/vOD7NaB9LGcG6se8TW1BExXiyXO4GEhLsBt3uMKM3qA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + size-limit: 9.0.0 + dependencies: + semver: 7.5.4 + size-limit: 9.0.0 + dev: true + + /@size-limit/preset-small-lib@9.0.0(size-limit@9.0.0): + resolution: {integrity: sha512-nkbZxn12pTpABYVyX5nsjQuLFpn8wDmd2XKoq/MiqKOc3ocz5BBwXTruqTL5ZKDW1OxEAWZMQlxf2kg3kY3X1Q==} + peerDependencies: + size-limit: 9.0.0 + dependencies: + '@size-limit/esbuild': 9.0.0(size-limit@9.0.0) + '@size-limit/file': 9.0.0(size-limit@9.0.0) + size-limit: 9.0.0 + dev: true + + /@solana/buffer-layout@4.0.1: + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + dependencies: + buffer: 6.0.3 + dev: false + + /@solana/web3.js@1.98.0: + resolution: {integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==} + dependencies: + '@babel/runtime': 7.26.9 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.6.0 + bigint-buffer: 1.1.5 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.1.3 + node-fetch: 2.7.0 + rpc-websockets: 9.0.4 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@swc/helpers@0.5.15: + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + dependencies: + tslib: 2.8.1 + dev: false + + /@ton-api/client@0.3.1(@ton/core@0.60.1): + resolution: {integrity: sha512-QwKcYcX9vaudJK7E7Gfx87A/TU1LgAUrNGdW6OZVKvKxttoUQUtEtRqLk3xqyuhQK24IYAd6BQ6Ki33X7zSdaw==} + peerDependencies: + '@ton/core': '>=0.59.0' + dependencies: + '@ton/core': 0.60.1(@ton/crypto@3.3.0) + core-js-pure: 3.40.0 + dev: false + + /@ton-api/ton-adapter@0.3.0(@ton-api/client@0.3.1)(@ton/core@0.60.1): + resolution: {integrity: sha512-axR7MiViOays+10GSjyvGQHexf3qermN7dFjQVtIXbF2Aj5gC1CnIHh4xbSUJVGn0JsrH8tOO027dO73wJnSXw==} + peerDependencies: + '@ton-api/client': ^0.3.0 + '@ton/core': '>=0.59.0' + dependencies: + '@ton-api/client': 0.3.1(@ton/core@0.60.1) + '@ton/core': 0.60.1(@ton/crypto@3.3.0) + dev: false + + /@ton/core@0.60.1(@ton/crypto@3.3.0): + resolution: {integrity: sha512-8FwybYbfkk57C3l9gvnlRhRBHbLYmeu0LbB1z9N+dhDz0Z+FJW8w0TJlks8CgHrAFxsT3FlR2LsqFnsauMp38w==} + peerDependencies: + '@ton/crypto': '>=3.2.0' + dependencies: + '@ton/crypto': 3.3.0 + symbol.inspect: 1.0.1 + dev: false + + /@ton/crypto-primitives@2.1.0: + resolution: {integrity: sha512-PQesoyPgqyI6vzYtCXw4/ZzevePc4VGcJtFwf08v10OevVJHVfW238KBdpj1kEDQkxWLeuNHEpTECNFKnP6tow==} + dependencies: + jssha: 3.2.0 + dev: false + + /@ton/crypto@3.3.0: + resolution: {integrity: sha512-/A6CYGgA/H36OZ9BbTaGerKtzWp50rg67ZCH2oIjV1NcrBaCK9Z343M+CxedvM7Haf3f/Ee9EhxyeTp0GKMUpA==} + dependencies: + '@ton/crypto-primitives': 2.1.0 + jssha: 3.2.0 + tweetnacl: 1.0.3 + dev: false + + /@ton/ton@15.2.1(@ton/core@0.60.1)(@ton/crypto@3.3.0): + resolution: {integrity: sha512-ICzozzATRfymkVfFVZrfVpKnCc5PLxAVeaB62mx/HsgllsjnR64UuoLuE6hqWHcA3/Hft9YLGdk2/rOHGZM6qA==} + peerDependencies: + '@ton/core': '>=0.60.0' + '@ton/crypto': '>=3.2.0' + dependencies: + '@ton/core': 0.60.1(@ton/crypto@3.3.0) + '@ton/crypto': 3.3.0 + axios: 1.7.9 + dataloader: 2.2.3 + symbol.inspect: 1.0.1 + teslabot: 1.5.0 + zod: 3.24.2 + transitivePeerDependencies: + - debug + dev: false + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.26.9 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + dev: true + + /@types/babel__traverse@7.20.6: + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + dependencies: + '@babel/types': 7.26.9 + dev: true + + /@types/big.js@6.2.2: + resolution: {integrity: sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==} + dev: true + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 22.13.4 + dev: false + + /@types/eslint-visitor-keys@1.0.0: + resolution: {integrity: sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==} + dev: true + + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: true + + /@types/estree@1.0.6: + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + dependencies: + '@types/node': 22.13.4 + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + + /@types/istanbul-reports@1.1.2: + resolution: {integrity: sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/jest@25.2.3: + resolution: {integrity: sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw==} + dependencies: + jest-diff: 25.5.0 + pretty-format: 25.5.0 + dev: true + + /@types/jest@29.5.14: + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/node-fetch@2.6.12: + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + dependencies: + '@types/node': 22.13.4 + form-data: 4.0.2 + dev: true + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: false + + /@types/node@18.19.76: + resolution: {integrity: sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/node@22.13.4: + resolution: {integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==} + dependencies: + undici-types: 6.20.0 + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: true + + /@types/prettier@1.19.1: + resolution: {integrity: sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==} + dev: true + + /@types/resolve@1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 22.13.4 + dev: true + + /@types/stack-utils@1.0.1: + resolution: {integrity: sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==} + dev: true + + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true + + /@types/uuid@8.3.4: + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + dev: false + + /@types/ws@7.4.7: + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + dependencies: + '@types/node': 22.13.4 + dev: false + + /@types/ws@8.5.14: + resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==} + dependencies: + '@types/node': 22.13.4 + dev: false + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true + + /@types/yargs@15.0.19: + resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@types/yargs@17.0.33: + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0)(eslint@6.8.0)(typescript@5.7.3): + resolution: {integrity: sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + peerDependencies: + '@typescript-eslint/parser': ^2.0.0 + eslint: ^5.0.0 || ^6.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/experimental-utils': 2.34.0(eslint@6.8.0)(typescript@5.7.3) + '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@5.7.3) + eslint: 6.8.0 + functional-red-black-tree: 1.0.1 + regexpp: 3.2.0 + tsutils: 3.21.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/experimental-utils@2.34.0(eslint@6.8.0)(typescript@5.7.3): + resolution: {integrity: sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + peerDependencies: + eslint: '*' + dependencies: + '@types/json-schema': 7.0.15 + '@typescript-eslint/typescript-estree': 2.34.0(typescript@5.7.3) + eslint: 6.8.0 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@5.7.3): + resolution: {integrity: sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@types/eslint-visitor-keys': 1.0.0 + '@typescript-eslint/experimental-utils': 2.34.0(eslint@6.8.0)(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 2.34.0(typescript@5.7.3) + eslint: 6.8.0 + eslint-visitor-keys: 1.3.0 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@2.34.0(typescript@5.7.3): + resolution: {integrity: sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + debug: 4.4.0 + eslint-visitor-keys: 1.3.0 + glob: 7.2.3 + is-glob: 4.0.3 + lodash: 4.17.21 + semver: 7.7.1 + tsutils: 3.21.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@uniswap/token-lists@1.0.0-beta.33: + resolution: {integrity: sha512-JQkXcpRI3jFG8y3/CGC4TS8NkDgcxXaOQuYW8Qdvd6DcDiIyg2vVYCG9igFEzF0G6UvxgHkBKC7cWCgzZNYvQg==} + engines: {node: '>=10'} + dev: false + + /@vitest/expect@1.6.1: + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + dependencies: + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + chai: 4.5.0 + dev: false + + /@vitest/expect@2.1.9: + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + dependencies: + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.0 + tinyrainbow: 1.2.0 + dev: false + + /@vitest/mocker@2.1.9(vite@5.4.14): + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.17 + vite: 5.4.14(@types/node@22.13.4) + dev: false + + /@vitest/pretty-format@2.1.9: + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + dependencies: + tinyrainbow: 1.2.0 + dev: false + + /@vitest/runner@1.6.1: + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + dependencies: + '@vitest/utils': 1.6.1 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: false + + /@vitest/runner@2.1.9: + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + dependencies: + '@vitest/utils': 2.1.9 + pathe: 1.1.2 + dev: false + + /@vitest/snapshot@1.6.1: + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + dependencies: + magic-string: 0.30.17 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: false + + /@vitest/snapshot@2.1.9: + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.17 + pathe: 1.1.2 + dev: false + + /@vitest/spy@1.6.1: + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + dependencies: + tinyspy: 2.2.1 + dev: false + + /@vitest/spy@2.1.9: + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + dependencies: + tinyspy: 3.0.2 + dev: false + + /@vitest/utils@1.6.1: + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: false + + /@vitest/utils@2.1.9: + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + dependencies: + '@vitest/pretty-format': 2.1.9 + loupe: 3.1.3 + tinyrainbow: 1.2.0 + dev: false + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: false + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + dev: true + + /abitype@1.0.7(typescript@5.7.3): + resolution: {integrity: sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.7.3 + dev: false + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: true + + /acorn-globals@4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + dev: true + + /acorn-jsx@5.3.2(acorn@7.4.1): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 7.4.1 + dev: true + + /acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.14.0 + dev: false + + /acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + /agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: true + + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + dev: true + + /arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + dev: true + + /array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + dev: true + + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + is-string: 1.1.1 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: true + + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + 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.1.1 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + 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.1.1 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + dev: true + + /arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 + dev: true + + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: false + + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + dev: false + + /assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: true + + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + dev: true + + /astral-regex@1.0.0: + resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} + engines: {node: '>=4'} + dev: true + + /async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /asyncro@3.0.0: + resolution: {integrity: sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.1.0 + dev: true + + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: true + + /aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + dev: true + + /axe-core@4.10.2: + resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} + engines: {node: '>=4'} + dev: true + + /axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + dev: true + + /babel-eslint@10.1.0(eslint@6.8.0): + resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} + engines: {node: '>=6'} + deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. + peerDependencies: + eslint: '>= 4.12.1' + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + eslint: 6.8.0 + eslint-visitor-keys: 1.3.0 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-jest@25.5.1(@babel/core@7.26.9): + resolution: {integrity: sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==} + engines: {node: '>= 8.3'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@jest/transform': 25.5.1 + '@jest/types': 25.5.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 25.5.0(@babel/core@7.26.9) + chalk: 3.0.0 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-annotate-pure-calls@0.4.0(@babel/core@7.26.9): + resolution: {integrity: sha512-oi4M/PWUJOU9ZyRGoPTfPMqdyMp06jbJAomd3RcyYuzUtBOddv98BqLm96Lucpi2QFoQHkdGQt0ACvw7VzVEQA==} + peerDependencies: + '@babel/core': ^6.0.0-0 || 7.x + dependencies: + '@babel/core': 7.26.9 + dev: true + + /babel-plugin-dev-expression@0.2.3(@babel/core@7.26.9): + resolution: {integrity: sha512-rP5LK9QQTzCW61nVVzw88En1oK8t8gTsIeC6E61oelxNsU842yMjF0G1MxhvUpCkxCEIj7sE8/e5ieTheT//uw==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.26.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@25.5.0: + resolution: {integrity: sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==} + engines: {node: '>= 8.3'} + dependencies: + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + '@types/babel__traverse': 7.20.6 + dev: true + + /babel-plugin-macros@2.8.0: + resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} + dependencies: + '@babel/runtime': 7.26.9 + cosmiconfig: 6.0.0 + resolve: 1.22.10 + dev: true + + /babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.9): + resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/core': 7.26.9 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.9) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.9): + resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.9) + core-js-compat: 3.40.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.0.4(@babel/core@7.26.9): + resolution: {integrity: sha512-+/uCzO9JTYVZVGCpZpVAQkgPGt2zkR0VYiZvJ4aVoCe4ccgpKvNQqcjzAgQzSsjK64Jhc5hvrCR3l0087BevkA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-define-polyfill-provider': 0.0.3(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.9): + resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-transform-rename-import@2.3.0: + resolution: {integrity: sha512-dPgJoT57XC0PqSnLgl2FwNvxFrWlspatX2dkk7yjKQj5HHGw071vAcOf+hqW8ClqcBDMvEbm6mevn5yHAD8mlQ==} + dev: true + + /babel-preset-current-node-syntax@0.1.4(@babel/core@7.26.9): + resolution: {integrity: sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.9) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.9) + dev: true + + /babel-preset-jest@25.5.0(@babel/core@7.26.9): + resolution: {integrity: sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==} + engines: {node: '>= 8.3'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + babel-plugin-jest-hoist: 25.5.0 + babel-preset-current-node-syntax: 0.1.4(@babel/core@7.26.9) + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base-x@3.0.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: true + + /big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + dev: false + + /bigint-buffer@1.1.5: + resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + bindings: 1.5.0 + dev: false + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: true + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: false + + /borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + dependencies: + bn.js: 5.2.1 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + dev: true + + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browser-resolve@1.11.3: + resolution: {integrity: sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==} + dependencies: + resolve: 1.1.7 + dev: true + + /browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001700 + electron-to-chromium: 1.5.102 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + dev: true + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.10 + dev: false + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /bufferutil@4.0.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.8.4 + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /bundle-require@4.2.1(esbuild@0.19.12): + resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + dependencies: + esbuild: 0.19.12 + load-tsconfig: 0.2.5 + dev: true + + /bytes-iec@3.1.1: + resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} + engines: {node: '>= 0.8'} + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + /cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + dev: true + + /call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.2.7 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001700: + resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} + dev: true + + /capture-exit@2.0.0: + resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} + engines: {node: 6.* || 8.* || >= 10.*} + dependencies: + rsvp: 4.8.5 + dev: true + + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true + + /chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + dev: false + + /chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: false + + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + dev: false + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + dependencies: + restore-cursor: 2.0.0 + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners@1.3.1: + resolution: {integrity: sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==} + engines: {node: '>=4'} + dev: true + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: true + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + dev: false + + /confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: true + + /core-js-compat@3.40.0: + resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} + dependencies: + browserslist: 4.24.4 + dev: true + + /core-js-pure@3.40.0: + resolution: {integrity: sha512-AtDzVIgRrmRKQai62yuSIN5vNiQjcJakJb4fbhVw3ehxx7Lohphvw9SGNWKhLFqSxC4ilD0g/L1huAYFQU3Q6A==} + requiresBuild: true + dev: false + + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: true + + /cosmiconfig@6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + + /cross-spawn@6.0.6: + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /data-urls@1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + dev: true + + /data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /dataloader@2.2.3: + resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + dev: false + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.1.0 + dev: false + + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.7 + dev: true + + /define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + dev: true + + /define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + dev: true + + /delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /diff-sequences@25.2.6: + resolution: {integrity: sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==} + engines: {node: '>= 8.3'} + dev: true + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + dependencies: + webidl-conversions: 4.0.2 + dev: true + + /dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dev: true + + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: true + + /electron-to-chromium@1.5.102: + resolution: {integrity: sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==} + dev: true + + /emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + 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.3 + 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.2.7 + 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-regex: 1.2.1 + 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 + 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.18 + dev: true + + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + /es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + dev: true + + /es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + dev: false + + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + + /es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + /es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + dev: true + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: false + + /es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + dependencies: + es6-promise: 4.2.8 + dev: false + + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + dev: false + + /escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-prettier@6.15.0(eslint@6.8.0): + resolution: {integrity: sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==} + hasBin: true + peerDependencies: + eslint: '>=3.14.1' + dependencies: + eslint: 6.8.0 + get-stdin: 6.0.0 + dev: true + + /eslint-config-react-app@5.2.1(@typescript-eslint/eslint-plugin@2.34.0)(@typescript-eslint/parser@2.34.0)(babel-eslint@10.1.0)(eslint-plugin-flowtype@3.13.0)(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@2.5.1)(eslint-plugin-react@7.37.4)(eslint@6.8.0)(typescript@3.9.10): + resolution: {integrity: sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==} + peerDependencies: + '@typescript-eslint/eslint-plugin': 2.x + '@typescript-eslint/parser': 2.x + babel-eslint: 10.x + eslint: 6.x + eslint-plugin-flowtype: 3.x || 4.x + eslint-plugin-import: 2.x + eslint-plugin-jsx-a11y: 6.x + eslint-plugin-react: 7.x + eslint-plugin-react-hooks: 1.x || 2.x + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0)(eslint@6.8.0)(typescript@5.7.3) + '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@5.7.3) + babel-eslint: 10.1.0(eslint@6.8.0) + confusing-browser-globals: 1.0.11 + eslint: 6.8.0 + eslint-plugin-flowtype: 3.13.0(eslint@6.8.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@2.34.0)(eslint@6.8.0) + eslint-plugin-jsx-a11y: 6.10.2(eslint@6.8.0) + eslint-plugin-react: 7.37.4(eslint@6.8.0) + eslint-plugin-react-hooks: 2.5.1(eslint@6.8.0) + typescript: 3.9.10 + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.12.0(@typescript-eslint/parser@2.34.0)(eslint-import-resolver-node@0.3.9)(eslint@6.8.0): + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@5.7.3) + debug: 3.2.7 + eslint: 6.8.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-flowtype@3.13.0(eslint@6.8.0): + resolution: {integrity: sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==} + engines: {node: '>=4'} + peerDependencies: + eslint: '>=5.0.0' + dependencies: + eslint: 6.8.0 + lodash: 4.17.21 + dev: true + + /eslint-plugin-import@2.31.0(@typescript-eslint/parser@2.34.0)(eslint@6.8.0): + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@rtsao/scc': 1.1.0 + '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@5.7.3) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 6.8.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@2.34.0)(eslint-import-resolver-node@0.3.9)(eslint@6.8.0) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jsx-a11y@6.10.2(eslint@6.8.0): + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.10.2 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 6.8.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + dev: true + + /eslint-plugin-prettier@3.4.1(eslint-config-prettier@6.15.0)(eslint@6.8.0)(prettier@1.19.1): + resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} + engines: {node: '>=6.0.0'} + peerDependencies: + eslint: '>=5.0.0' + eslint-config-prettier: '*' + prettier: '>=1.13.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 6.8.0 + eslint-config-prettier: 6.15.0(eslint@6.8.0) + prettier: 1.19.1 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-plugin-react-hooks@2.5.1(eslint@6.8.0): + resolution: {integrity: sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g==} + engines: {node: '>=7'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + dependencies: + eslint: 6.8.0 + dev: true + + /eslint-plugin-react@7.37.4(eslint@6.8.0): + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 6.8.0 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-utils@1.4.3: + resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint@6.8.0: + resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + dependencies: + '@babel/code-frame': 7.26.2 + ajv: 6.12.6 + chalk: 2.4.2 + cross-spawn: 6.0.6 + debug: 4.4.0 + doctrine: 3.0.0 + eslint-scope: 5.1.1 + eslint-utils: 1.4.3 + eslint-visitor-keys: 1.3.0 + espree: 6.2.1 + esquery: 1.6.0 + esutils: 2.0.3 + file-entry-cache: 5.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 12.4.0 + ignore: 4.0.6 + import-fresh: 3.3.1 + imurmurhash: 0.1.4 + inquirer: 7.3.3 + is-glob: 4.0.3 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.3.0 + lodash: 4.17.21 + minimatch: 3.1.2 + mkdirp: 0.5.6 + natural-compare: 1.4.0 + optionator: 0.8.3 + progress: 2.0.3 + regexpp: 2.0.1 + semver: 6.3.1 + strip-ansi: 5.2.0 + strip-json-comments: 3.1.1 + table: 5.4.6 + text-table: 0.2.0 + v8-compile-cache: 2.4.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@6.2.1: + resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} + engines: {node: '>=6.0.0'} + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + eslint-visitor-keys: 1.3.0 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + dev: true + + /estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: true + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.6 + dev: false + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: true + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: false + + /exec-sh@0.3.6: + resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} + dev: true + + /execa@1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} + dependencies: + cross-spawn: 6.0.6 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /execa@3.4.0: + resolution: {integrity: sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==} + engines: {node: ^8.12.0 || >=9.7.0} + dependencies: + cross-spawn: 7.0.6 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.6 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: false + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + dev: false + + /expect@25.5.0: + resolution: {integrity: sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + ansi-styles: 4.3.0 + jest-get-type: 25.2.6 + jest-matcher-utils: 25.5.0 + jest-message-util: 25.5.0 + jest-regex-util: 25.2.6 + dev: true + + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + dev: true + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + + /extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + dev: true + + /eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + dev: false + + /fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + dependencies: + reusify: 1.0.4 + dev: true + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-entry-cache@5.0.1: + resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} + engines: {node: '>=4'} + dependencies: + flat-cache: 2.0.1 + dev: true + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + + /fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@2.0.1: + resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} + engines: {node: '>=4'} + dependencies: + flatted: 2.0.2 + rimraf: 2.6.3 + write: 1.0.3 + dev: true + + /flatted@2.0.2: + resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} + dev: true + + /follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + dev: true + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + dev: true + + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + dev: true + + /form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + dev: true + + /form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + /formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + dev: true + + /fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + 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 + dev: true + + /functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: false + + /get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + 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-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + /get-stdin@6.0.0: + resolution: {integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==} + engines: {node: '>=4'} + dev: true + + /get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.2 + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.2 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: false + + /get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + dev: true + + /get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: true + + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@12.4.0: + resolution: {integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.8.1 + dev: true + + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + dev: true + + /globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /growly@1.3.0: + resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} + requiresBuild: true + dev: true + optional: true + + /har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + dev: true + + /har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + dev: true + + /has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.1 + dev: true + + /has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + dev: true + + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.1.0 + + /has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: true + + /has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + dev: true + + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: false + + /humanize-duration@3.32.1: + resolution: {integrity: sha512-inh5wue5XdfObhu/IGEMiA1nUXigSGcaKNemcbLRKa7jXYGDZXr3LoT9pTIzq2hPEbld7w/qv9h+ikWGz8fL1g==} + dev: true + + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore@4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + dev: true + + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + dev: true + + /internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + dev: true + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: true + + /ip-regex@2.1.0: + resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} + engines: {node: '>=4'} + dev: true + + /is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + dependencies: + hasown: 2.0.2 + dev: true + + /is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + 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 + dev: true + + /is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + dependencies: + has-bigints: 1.1.0 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: true + + /is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + dependencies: + ci-info: 2.0.0 + dev: true + + /is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 + dev: true + + /is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + dev: true + + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: true + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + + /is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.6 + dev: true + + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: true + + /is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + dev: true + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + dev: true + + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.18 + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: true + + /is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + dev: true + + /is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + is-docker: 2.2.1 + dev: true + optional: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /isomorphic-ws@4.0.1(ws@7.5.10): + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + dependencies: + ws: 7.5.10 + dev: false + + /isows@1.0.6(ws@8.18.0): + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + dev: false + + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.26.9 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.26.9 + '@babel/parser': 7.26.9 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.4.0 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + dev: true + + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /jayson@4.1.3: + resolution: {integrity: sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + JSONStream: 1.3.5 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.10) + json-stringify-safe: 5.0.1 + uuid: 8.3.2 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /jest-changed-files@25.5.0: + resolution: {integrity: sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + execa: 3.4.0 + throat: 5.0.0 + dev: true + + /jest-cli@25.5.4: + resolution: {integrity: sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw==} + engines: {node: '>= 8.3'} + hasBin: true + dependencies: + '@jest/core': 25.5.4 + '@jest/test-result': 25.5.0 + '@jest/types': 25.5.0 + chalk: 3.0.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.2.0 + is-ci: 2.0.0 + jest-config: 25.5.4 + jest-util: 25.5.0 + jest-validate: 25.5.0 + prompts: 2.4.2 + realpath-native: 2.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-config@25.5.4: + resolution: {integrity: sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==} + engines: {node: '>= 8.3'} + dependencies: + '@babel/core': 7.26.9 + '@jest/test-sequencer': 25.5.4 + '@jest/types': 25.5.0 + babel-jest: 25.5.1(@babel/core@7.26.9) + chalk: 3.0.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-environment-jsdom: 25.5.0 + jest-environment-node: 25.5.0 + jest-get-type: 25.2.6 + jest-jasmine2: 25.5.4 + jest-regex-util: 25.2.6 + jest-resolve: 25.5.1 + jest-util: 25.5.0 + jest-validate: 25.5.0 + micromatch: 4.0.8 + pretty-format: 25.5.0 + realpath-native: 2.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-diff@25.5.0: + resolution: {integrity: sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==} + engines: {node: '>= 8.3'} + dependencies: + chalk: 3.0.0 + diff-sequences: 25.2.6 + jest-get-type: 25.2.6 + pretty-format: 25.5.0 + dev: true + + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-docblock@25.3.0: + resolution: {integrity: sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==} + engines: {node: '>= 8.3'} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@25.5.0: + resolution: {integrity: sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + chalk: 3.0.0 + jest-get-type: 25.2.6 + jest-util: 25.5.0 + pretty-format: 25.5.0 + dev: true + + /jest-environment-jsdom@25.5.0: + resolution: {integrity: sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/environment': 25.5.0 + '@jest/fake-timers': 25.5.0 + '@jest/types': 25.5.0 + jest-mock: 25.5.0 + jest-util: 25.5.0 + jsdom: 15.2.1 + transitivePeerDependencies: + - bufferutil + - canvas + - utf-8-validate + dev: true + + /jest-environment-node@25.5.0: + resolution: {integrity: sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/environment': 25.5.0 + '@jest/fake-timers': 25.5.0 + '@jest/types': 25.5.0 + jest-mock: 25.5.0 + jest-util: 25.5.0 + semver: 6.3.1 + dev: true + + /jest-get-type@25.2.6: + resolution: {integrity: sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==} + engines: {node: '>= 8.3'} + dev: true + + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map@25.5.1: + resolution: {integrity: sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + '@types/graceful-fs': 4.1.9 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-serializer: 25.5.0 + jest-util: 25.5.0 + jest-worker: 25.5.0 + micromatch: 4.0.8 + sane: 4.1.0 + walker: 1.0.8 + which: 2.0.2 + optionalDependencies: + fsevents: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-jasmine2@25.5.4: + resolution: {integrity: sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==} + engines: {node: '>= 8.3'} + dependencies: + '@babel/traverse': 7.26.9 + '@jest/environment': 25.5.0 + '@jest/source-map': 25.5.0 + '@jest/test-result': 25.5.0 + '@jest/types': 25.5.0 + chalk: 3.0.0 + co: 4.6.0 + expect: 25.5.0 + is-generator-fn: 2.1.0 + jest-each: 25.5.0 + jest-matcher-utils: 25.5.0 + jest-message-util: 25.5.0 + jest-runtime: 25.5.4 + jest-snapshot: 25.5.1 + jest-util: 25.5.0 + pretty-format: 25.5.0 + throat: 5.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-leak-detector@25.5.0: + resolution: {integrity: sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==} + engines: {node: '>= 8.3'} + dependencies: + jest-get-type: 25.2.6 + pretty-format: 25.5.0 + dev: true + + /jest-matcher-utils@25.5.0: + resolution: {integrity: sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==} + engines: {node: '>= 8.3'} + dependencies: + chalk: 3.0.0 + jest-diff: 25.5.0 + jest-get-type: 25.2.6 + pretty-format: 25.5.0 + dev: true + + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-message-util@25.5.0: + resolution: {integrity: sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==} + engines: {node: '>= 8.3'} + dependencies: + '@babel/code-frame': 7.26.2 + '@jest/types': 25.5.0 + '@types/stack-utils': 1.0.1 + chalk: 3.0.0 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + slash: 3.0.0 + stack-utils: 1.0.5 + dev: true + + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.26.2 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@25.5.0: + resolution: {integrity: sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@25.5.1): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 25.5.1 + dev: true + + /jest-regex-util@25.2.6: + resolution: {integrity: sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==} + engines: {node: '>= 8.3'} + dev: true + + /jest-resolve-dependencies@25.5.4: + resolution: {integrity: sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + jest-regex-util: 25.2.6 + jest-snapshot: 25.5.1 + dev: true + + /jest-resolve@25.5.1: + resolution: {integrity: sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + browser-resolve: 1.11.3 + chalk: 3.0.0 + graceful-fs: 4.2.11 + jest-pnp-resolver: 1.2.3(jest-resolve@25.5.1) + read-pkg-up: 7.0.1 + realpath-native: 2.0.0 + resolve: 1.22.10 + slash: 3.0.0 + dev: true + + /jest-runner@25.5.4: + resolution: {integrity: sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/console': 25.5.0 + '@jest/environment': 25.5.0 + '@jest/test-result': 25.5.0 + '@jest/types': 25.5.0 + chalk: 3.0.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 25.5.4 + jest-docblock: 25.3.0 + jest-haste-map: 25.5.1 + jest-jasmine2: 25.5.4 + jest-leak-detector: 25.5.0 + jest-message-util: 25.5.0 + jest-resolve: 25.5.1 + jest-runtime: 25.5.4 + jest-util: 25.5.0 + jest-worker: 25.5.0 + source-map-support: 0.5.21 + throat: 5.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-runtime@25.5.4: + resolution: {integrity: sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==} + engines: {node: '>= 8.3'} + hasBin: true + dependencies: + '@jest/console': 25.5.0 + '@jest/environment': 25.5.0 + '@jest/globals': 25.5.2 + '@jest/source-map': 25.5.0 + '@jest/test-result': 25.5.0 + '@jest/transform': 25.5.1 + '@jest/types': 25.5.0 + '@types/yargs': 15.0.19 + chalk: 3.0.0 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-config: 25.5.4 + jest-haste-map: 25.5.1 + jest-message-util: 25.5.0 + jest-mock: 25.5.0 + jest-regex-util: 25.2.6 + jest-resolve: 25.5.1 + jest-snapshot: 25.5.1 + jest-util: 25.5.0 + jest-validate: 25.5.0 + realpath-native: 2.0.0 + slash: 3.0.0 + strip-bom: 4.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-serializer@25.5.0: + resolution: {integrity: sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==} + engines: {node: '>= 8.3'} + dependencies: + graceful-fs: 4.2.11 + dev: true + + /jest-snapshot@25.5.1: + resolution: {integrity: sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==} + engines: {node: '>= 8.3'} + dependencies: + '@babel/types': 7.26.9 + '@jest/types': 25.5.0 + '@types/prettier': 1.19.1 + chalk: 3.0.0 + expect: 25.5.0 + graceful-fs: 4.2.11 + jest-diff: 25.5.0 + jest-get-type: 25.2.6 + jest-matcher-utils: 25.5.0 + jest-message-util: 25.5.0 + jest-resolve: 25.5.1 + make-dir: 3.1.0 + natural-compare: 1.4.0 + pretty-format: 25.5.0 + semver: 6.3.1 + dev: true + + /jest-util@25.5.0: + resolution: {integrity: sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + chalk: 3.0.0 + graceful-fs: 4.2.11 + is-ci: 2.0.0 + make-dir: 3.1.0 + dev: true + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.13.4 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@25.5.0: + resolution: {integrity: sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + camelcase: 5.3.1 + chalk: 3.0.0 + jest-get-type: 25.2.6 + leven: 3.1.0 + pretty-format: 25.5.0 + dev: true + + /jest-watch-typeahead@0.5.0: + resolution: {integrity: sha512-4r36w9vU8+rdg48hj0Z7TvcSqVP6Ao8dk04grlHQNgduyCB0SqrI0xWIl85ZhXrzYvxQ0N5H+rRLAejkQzEHeQ==} + dependencies: + ansi-escapes: 4.3.2 + chalk: 3.0.0 + jest-regex-util: 25.2.6 + jest-watcher: 25.5.0 + slash: 3.0.0 + string-length: 3.1.0 + strip-ansi: 6.0.1 + dev: true + + /jest-watcher@25.5.0: + resolution: {integrity: sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/test-result': 25.5.0 + '@jest/types': 25.5.0 + ansi-escapes: 4.3.2 + chalk: 3.0.0 + jest-util: 25.5.0 + string-length: 3.1.0 + dev: true + + /jest-worker@24.9.0: + resolution: {integrity: sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==} + engines: {node: '>= 6'} + dependencies: + merge-stream: 2.0.0 + supports-color: 6.1.0 + dev: true + + /jest-worker@25.5.0: + resolution: {integrity: sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==} + engines: {node: '>= 8.3'} + dependencies: + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + + /jest@25.5.4: + resolution: {integrity: sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ==} + engines: {node: '>= 8.3'} + hasBin: true + dependencies: + '@jest/core': 25.5.4 + import-local: 3.2.0 + jest-cli: 25.5.4 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: true + + /jpjs@1.2.1: + resolution: {integrity: sha512-GxJWybWU4NV0RNKi6EIqk6IRPOTqd/h+U7sbtyuD7yUISUzV78LdHnq2xkevJsTlz/EImux4sWj+wfMiwKLkiw==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + dev: false + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: true + + /jsdom@15.2.1: + resolution: {integrity: sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==} + engines: {node: '>=8'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 7.4.1 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + nwsapi: 2.2.16 + parse5: 5.1.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9(request@2.88.2) + saxes: 3.1.11 + symbol-tree: 3.2.4 + tough-cookie: 3.0.1 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 1.1.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + ws: 7.5.10 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: false + + /jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + + /jssha@3.2.0: + resolution: {integrity: sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q==} + dev: false + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + dev: true + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + dev: true + + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + dependencies: + language-subtag-registry: 0.3.23 + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: true + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: false + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log-symbols@3.0.0: + resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} + engines: {node: '>=8'} + dependencies: + chalk: 2.4.2 + dev: true + + /log-update@2.3.0: + resolution: {integrity: sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==} + engines: {node: '>=4'} + dependencies: + ansi-escapes: 3.2.0 + cli-cursor: 2.1.0 + wrap-ansi: 3.0.1 + dev: true + + /lolex@5.1.2: + resolution: {integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: false + + /loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + dev: false + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.8.1 + dev: true + + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + dev: false + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.7.1 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + dependencies: + acorn: 8.14.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.5.4 + dev: false + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: true + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /nanospinner@1.2.2: + resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==} + dependencies: + picocolors: 1.1.1 + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + dev: true + + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + requiresBuild: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-notifier@6.0.0: + resolution: {integrity: sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==} + requiresBuild: true + dependencies: + growly: 1.3.0 + is-wsl: 2.2.0 + semver: 6.3.1 + shellwords: 0.1.1 + which: 1.3.1 + dev: true + optional: true + + /node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.10 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: 1.1.0 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + + /nwsapi@2.2.16: + resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + dev: true + + /oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + dev: true + + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + dev: true + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + dependencies: + mimic-fn: 1.2.0 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + + /openai@4.85.3(ws@8.18.0): + resolution: {integrity: sha512-KTMXAK6FPd2IvsPtglMt0J1GyVrjMxCYzu/mVbCPabzzquSJoZlYpHtE0p0ScZPyt11XTc757xSO4j39j5g+Xw==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + dependencies: + '@types/node': 18.19.76 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - encoding + dev: true + + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + dev: true + + /ora@4.1.1: + resolution: {integrity: sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==} + engines: {node: '>=8'} + dependencies: + chalk: 3.0.0 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + log-symbols: 3.0.0 + mute-stream: 0.0.8 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + dev: true + + /ox@0.6.5(typescript@5.7.3): + resolution: {integrity: sha512-vmnH8KvMDwFZDbNY1mq2CBRBWIgSliZB/dFV0xKp+DfF/dJkTENt6nmA+DzHSSAgL/GO2ydjkXWvlndJgSY4KQ==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/bip32': 1.6.0 + '@scure/bip39': 1.5.0 + abitype: 1.0.7(typescript@5.7.3) + eventemitter3: 5.0.1 + typescript: 5.7.3 + transitivePeerDependencies: + - zod + dev: false + + /p-each-series@2.2.0: + resolution: {integrity: sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==} + engines: {node: '>=8'} + dev: true + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.1.1 + dev: false + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse5@5.1.0: + resolution: {integrity: sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==} + dev: true + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + dev: true + + /pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: false + + /pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + dev: false + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: false + + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + dev: false + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: true + + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + dev: false + + /pn@1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + dev: true + + /posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: true + + /possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + dev: true + + /postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.3 + yaml: 2.7.0 + dev: true + + /postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + dev: false + + /prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@1.19.1: + resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /prettier@3.5.1: + resolution: {integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-format@25.5.0: + resolution: {integrity: sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + react-is: 16.13.1 + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + /progress-estimator@0.2.2: + resolution: {integrity: sha512-GF76Ac02MTJD6o2nMNtmtOFjwWCnHcvXyn5HOWPQnEMO8OTLw7LAvNmrwe8LmdsB+eZhwUu9fX/c9iQnBxWaFA==} + dependencies: + chalk: 2.4.2 + cli-spinners: 1.3.1 + humanize-duration: 3.32.1 + log-update: 2.3.0 + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + dependencies: + punycode: 2.3.1 + dev: true + + /pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /realpath-native@2.0.0: + resolution: {integrity: sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==} + engines: {node: '>=8'} + dev: true + + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.10 + dev: true + + /reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + 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.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + dev: true + + /regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: true + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.26.9 + dev: true + + /regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + 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 + dev: true + + /regexpp@2.0.1: + resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} + engines: {node: '>=6.5.0'} + dev: true + + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + dev: true + + /regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + dev: true + + /regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + dependencies: + jsesc: 3.0.2 + dev: true + + /remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: true + + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true + + /request-promise-core@1.1.4(request@2.88.2): + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + dependencies: + lodash: 4.17.21 + request: 2.88.2 + dev: true + + /request-promise-native@1.0.9(request@2.88.2): + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + dev: true + + /request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: true + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + dev: true + + /resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + dependencies: + path-parse: 1.0.7 + dev: true + + /resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup-plugin-sourcemaps@0.6.3(@types/node@22.13.4)(rollup@1.32.1): + resolution: {integrity: sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==} + engines: {node: '>=10.0.0'} + peerDependencies: + '@types/node': '>=10.0.0' + rollup: '>=0.31.2' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@1.32.1) + '@types/node': 22.13.4 + rollup: 1.32.1 + source-map-resolve: 0.6.0 + dev: true + + /rollup-plugin-terser@5.3.1(rollup@1.32.1): + resolution: {integrity: sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: '>=0.66.0 <3' + dependencies: + '@babel/code-frame': 7.26.2 + jest-worker: 24.9.0 + rollup: 1.32.1 + rollup-pluginutils: 2.8.2 + serialize-javascript: 4.0.0 + terser: 4.8.1 + dev: true + + /rollup-plugin-typescript2@0.27.3(rollup@1.32.1)(typescript@3.9.10): + resolution: {integrity: sha512-gmYPIFmALj9D3Ga1ZbTZAKTXq1JKlTQBtj299DXhqYz9cL3g/AQfUvbb2UhH+Nf++cCq941W2Mv7UcrcgLzJJg==} + peerDependencies: + rollup: '>=1.26.3' + typescript: '>=2.4.0' + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@1.32.1) + find-cache-dir: 3.3.2 + fs-extra: 8.1.0 + resolve: 1.17.0 + rollup: 1.32.1 + tslib: 2.0.1 + typescript: 3.9.10 + dev: true + + /rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + dependencies: + estree-walker: 0.6.1 + dev: true + + /rollup@1.32.1: + resolution: {integrity: sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==} + hasBin: true + dependencies: + '@types/estree': 1.0.6 + '@types/node': 22.13.4 + acorn: 7.4.1 + dev: true + + /rollup@4.34.8: + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 + fsevents: 2.3.3 + + /rpc-websockets@9.0.4: + resolution: {integrity: sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==} + dependencies: + '@swc/helpers': 0.5.15 + '@types/uuid': 8.3.4 + '@types/ws': 8.5.14 + buffer: 6.0.3 + eventemitter3: 5.0.1 + uuid: 8.3.2 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + dev: false + + /rsvp@4.8.5: + resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} + engines: {node: 6.* || >= 7.*} + dev: true + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: true + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: true + + /safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + dev: true + + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + dev: true + + /safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /sane@4.1.0: + resolution: {integrity: sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==} + engines: {node: 6.* || 8.* || >= 10.*} + deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added + hasBin: true + dependencies: + '@cnakazawa/watch': 1.0.4 + anymatch: 2.0.0 + capture-exit: 2.0.0 + exec-sh: 0.3.6 + execa: 1.0.0 + fb-watchman: 2.0.2 + micromatch: 3.1.10 + minimist: 1.2.8 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + dev: true + + /saxes@3.1.11: + resolution: {integrity: sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==} + engines: {node: '>=8'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + dev: true + + /set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: true + + /shellwords@0.1.1: + resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} + requiresBuild: true + dev: true + optional: true + + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + dev: true + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + dev: true + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /size-limit@9.0.0: + resolution: {integrity: sha512-DrA7o2DeRN3s+vwCA9nn7Ck9Y4pn9t0GNUwQRpKqBtBmNkl6LA2s/NlNCdtKHrEkRTeYA1ZQ65mnYveo9rUqgA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + bytes-iec: 3.1.1 + chokidar: 3.6.0 + globby: 11.1.0 + lilconfig: 2.1.0 + nanospinner: 1.2.2 + picocolors: 1.1.1 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@2.1.0: + resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} + engines: {node: '>=6'} + dependencies: + ansi-styles: 3.2.1 + astral-regex: 1.0.0 + is-fullwidth-code-point: 2.0.0 + dev: true + + /snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /source-map-resolve@0.6.0: + resolution: {integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.21 + dev: true + + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + dev: true + + /spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + dev: true + + /split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: true + + /stack-utils@1.0.5: + resolution: {integrity: sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: false + + /static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + dev: false + + /stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + dev: true + + /string-length@3.1.0: + resolution: {integrity: sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==} + engines: {node: '>=8'} + dependencies: + astral-regex: 1.0.0 + strip-ansi: 5.2.0 + dev: true + + /string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + + /string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + dev: true + + /string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + dev: true + + /string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.9 + dev: true + + /string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + dev: true + + /string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: true + + /strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.1.0 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + dependencies: + js-tokens: 9.0.1 + dev: false + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + + /superstruct@2.0.2: + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@6.1.0: + resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} + engines: {node: '>=6'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /symbol.inspect@1.0.1: + resolution: {integrity: sha512-YQSL4duoHmLhsTD1Pw8RW6TZ5MaTX5rXJnqacJottr2P2LZBF/Yvrc3ku4NUpMOm8aM0KOCqM+UAkMA5HWQCzQ==} + dev: false + + /table@5.4.6: + resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} + engines: {node: '>=6.0.0'} + dependencies: + ajv: 6.12.6 + lodash: 4.17.21 + slice-ansi: 2.1.0 + string-width: 3.1.0 + dev: true + + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: true + + /terser@4.8.1: + resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + acorn: 8.14.0 + commander: 2.20.3 + source-map: 0.6.1 + source-map-support: 0.5.21 + dev: true + + /teslabot@1.5.0: + resolution: {integrity: sha512-e2MmELhCgrgZEGo7PQu/6bmYG36IDH+YrBI1iGm6jovXkeDIGa3pZ2WSqRjzkuw2vt1EqfkZoV5GpXgqL8QJVg==} + dev: false + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + dev: true + + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + dev: false + + /tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + dev: false + + /tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + dev: false + + /tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + dev: false + + /tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + dev: false + + /tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + dev: false + + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + dev: false + + /tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + dev: false + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /toformat@2.0.0: + resolution: {integrity: sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==} + dev: false + + /tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + dev: true + + /tough-cookie@3.0.1: + resolution: {integrity: sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==} + engines: {node: '>=6'} + dependencies: + ip-regex: 2.1.0 + psl: 1.15.0 + punycode: 2.3.1 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /ts-jest@25.5.1(jest@25.5.4)(typescript@3.9.10): + resolution: {integrity: sha512-kHEUlZMK8fn8vkxDjwbHlxXRB9dHYpyzqKIGDNxbzs+Rz+ssNDSDNusEK8Fk/sDd4xE6iKoQLfFkFVaskmTJyw==} + engines: {node: '>= 8'} + hasBin: true + peerDependencies: + jest: '>=25 <26' + typescript: '>=3.4 <4.0' + dependencies: + bs-logger: 0.2.6 + buffer-from: 1.1.2 + fast-json-stable-stringify: 2.1.0 + jest: 25.5.4 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + micromatch: 4.0.8 + mkdirp: 0.5.6 + semver: 6.3.1 + typescript: 3.9.10 + yargs-parser: 18.1.3 + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tsdx@0.14.1(@types/node@22.13.4): + resolution: {integrity: sha512-keHmFdCL2kx5nYFlBdbE3639HQ2v9iGedAFAajobrUTH2wfX0nLPdDhbHv+GHLQZqf0c5ur1XteE8ek/+Eyj5w==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/parser': 7.26.9 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.9) + '@babel/preset-env': 7.26.9(@babel/core@7.26.9) + '@babel/traverse': 7.26.9 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.26.9)(rollup@1.32.1) + '@rollup/plugin-commonjs': 11.1.0(rollup@1.32.1) + '@rollup/plugin-json': 4.1.0(rollup@1.32.1) + '@rollup/plugin-node-resolve': 9.0.0(rollup@1.32.1) + '@rollup/plugin-replace': 2.4.2(rollup@1.32.1) + '@types/jest': 25.2.3 + '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0)(eslint@6.8.0)(typescript@5.7.3) + '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@5.7.3) + ansi-escapes: 4.3.2 + asyncro: 3.0.0 + babel-eslint: 10.1.0(eslint@6.8.0) + babel-plugin-annotate-pure-calls: 0.4.0(@babel/core@7.26.9) + babel-plugin-dev-expression: 0.2.3(@babel/core@7.26.9) + babel-plugin-macros: 2.8.0 + babel-plugin-polyfill-regenerator: 0.0.4(@babel/core@7.26.9) + babel-plugin-transform-rename-import: 2.3.0 + camelcase: 6.3.0 + chalk: 4.1.2 + enquirer: 2.4.1 + eslint: 6.8.0 + eslint-config-prettier: 6.15.0(eslint@6.8.0) + eslint-config-react-app: 5.2.1(@typescript-eslint/eslint-plugin@2.34.0)(@typescript-eslint/parser@2.34.0)(babel-eslint@10.1.0)(eslint-plugin-flowtype@3.13.0)(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@2.5.1)(eslint-plugin-react@7.37.4)(eslint@6.8.0)(typescript@3.9.10) + eslint-plugin-flowtype: 3.13.0(eslint@6.8.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@2.34.0)(eslint@6.8.0) + eslint-plugin-jsx-a11y: 6.10.2(eslint@6.8.0) + eslint-plugin-prettier: 3.4.1(eslint-config-prettier@6.15.0)(eslint@6.8.0)(prettier@1.19.1) + eslint-plugin-react: 7.37.4(eslint@6.8.0) + eslint-plugin-react-hooks: 2.5.1(eslint@6.8.0) + execa: 4.1.0 + fs-extra: 9.1.0 + jest: 25.5.4 + jest-watch-typeahead: 0.5.0 + jpjs: 1.2.1 + lodash.merge: 4.6.2 + ora: 4.1.1 + pascal-case: 3.1.2 + prettier: 1.19.1 + progress-estimator: 0.2.2 + regenerator-runtime: 0.13.11 + rollup: 1.32.1 + rollup-plugin-sourcemaps: 0.6.3(@types/node@22.13.4)(rollup@1.32.1) + rollup-plugin-terser: 5.3.1(rollup@1.32.1) + rollup-plugin-typescript2: 0.27.3(rollup@1.32.1)(typescript@3.9.10) + sade: 1.8.1 + semver: 7.7.1 + shelljs: 0.8.5 + tiny-glob: 0.2.9 + ts-jest: 25.5.1(jest@25.5.4)(typescript@3.9.10) + tslib: 1.14.1 + typescript: 3.9.10 + transitivePeerDependencies: + - '@types/babel__core' + - '@types/node' + - bufferutil + - canvas + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + - utf-8-validate + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.0.1: + resolution: {integrity: sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==} + dev: true + + /tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + /tsup@7.3.0(typescript@5.7.3): + resolution: {integrity: sha512-Ja1eaSRrE+QarmATlNO5fse2aOACYMBX+IZRKy1T+gpyH+jXgRrl5l4nHIQJQ1DoDgEjHDTw8cpE085UdBZuWQ==} + engines: {node: '>=18'} + deprecated: Breaking node 16 + hasBin: true + peerDependencies: + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + dependencies: + bundle-require: 4.2.1(esbuild@0.19.12) + cac: 6.7.14 + chokidar: 3.6.0 + debug: 4.4.0 + esbuild: 0.19.12 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss-load-config: 4.0.2 + resolve-from: 5.0.0 + rollup: 4.34.8 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /tsutils@3.21.0(typescript@5.7.3): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.7.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: true + + /tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + dev: false + + /type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + dev: false + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + dev: true + + /typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typescript@3.9.10: + resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + /ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + dev: false + + /unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + /unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /update-browserslist-db@1.1.2(browserslist@4.24.4): + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.8.4 + + /uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /v8-compile-cache@2.4.0: + resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} + dev: true + + /v8-to-istanbul@4.1.4: + resolution: {integrity: sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==} + engines: {node: 8.x.x || >=10.10.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 1.9.0 + source-map: 0.7.4 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: true + + /viem@2.22.9(typescript@5.7.3): + resolution: {integrity: sha512-2yy46qYhcdo8GZggQ3Zoq9QCahI0goddzpVI/vSnTpcClQBSDxYRCuAqRzzLqjvJ7hS0UYgplC7eRkM2sYgflw==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/bip32': 1.6.0 + '@scure/bip39': 1.5.0 + abitype: 1.0.7(typescript@5.7.3) + isows: 1.0.6(ws@8.18.0) + ox: 0.6.5(typescript@5.7.3) + typescript: 5.7.3 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + + /vite-node@1.6.1(@types/node@22.13.4): + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.4.0 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.14(@types/node@22.13.4) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + dev: false + + /vite-node@2.1.9(@types/node@22.13.4): + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 1.1.2 + vite: 5.4.14(@types/node@22.13.4) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + dev: false + + /vite@5.4.14(@types/node@22.13.4): + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 22.13.4 + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.34.8 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /vitest@1.6.1(@types/node@22.13.4): + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/node': 22.13.4 + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.4.0 + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.17 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.8.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.14(@types/node@22.13.4) + vite-node: 1.6.1(@types/node@22.13.4) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + dev: false + + /vitest@2.1.9(@types/node@22.13.4): + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/node': 22.13.4 + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.14) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.14(@types/node@22.13.4) + vite-node: 2.1.9(@types/node@22.13.4) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + dev: false + + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer@1.1.2: + resolution: {integrity: sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==} + dependencies: + domexception: 1.0.1 + webidl-conversions: 4.0.2 + xml-name-validator: 3.0.0 + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + dev: true + + /which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + dev: true + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: true + + /which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.5 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: false + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /wrap-ansi@3.0.1: + resolution: {integrity: sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==} + engines: {node: '>=4'} + dependencies: + string-width: 2.1.1 + strip-ansi: 4.0.0 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /write@1.0.3: + resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} + engines: {node: '>=4'} + dependencies: + mkdirp: 0.5.6 + dev: true + + /ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + dev: true + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + + /yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + dev: false + + /zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + dev: false diff --git a/projects/beets-lst/src/ask_beets/askBeets.ts b/projects/beets-lst/src/ask_beets/askBeets.ts index 767a3639..6c110ede 100644 --- a/projects/beets-lst/src/ask_beets/askBeets.ts +++ b/projects/beets-lst/src/ask_beets/askBeets.ts @@ -2,7 +2,7 @@ import OpenAI from 'openai'; import { privateKeyToAccount } from 'viem/accounts'; import { createPublicClient, http, createWalletClient } from 'viem'; import { sonic } from 'viem/chains'; -import { EVM, FunctionOptions, FunctionReturn, SolanaFunctionOptions, toResult } from '@heyanon/sdk'; +import { EVM, FunctionOptions, FunctionReturn, SolanaFunctionOptions, TonFunctionOptions, toResult } from '@heyanon/sdk'; import { tools } from '../tools'; import { tools as askBeetsTools } from './tools'; import * as functions from '../functions'; @@ -167,6 +167,8 @@ export async function askBeets(question: string, options?: AskBeetsOptions): Pro }, // Placeholder for Solana options solana: {} as SolanaFunctionOptions, + // Placeholder for Telegram TON options + ton: {} as TonFunctionOptions, notify, }; diff --git a/projects/beets-lst/src/constants.ts b/projects/beets-lst/src/constants.ts index 6ba35a56..bc738372 100644 --- a/projects/beets-lst/src/constants.ts +++ b/projects/beets-lst/src/constants.ts @@ -1,6 +1,8 @@ -import { ChainId } from '@heyanon/sdk'; +import { EVM } from '@heyanon/sdk'; -export const supportedChains = [ChainId.SONIC]; +const { ChainIds } = EVM.constants; + +export const supportedChains = [ChainIds.sonic]; export const STS_ADDRESS = '0xe5da20f15420ad15de0fa650600afc998bbe3955'; diff --git a/projects/beets-lst/src/functions/getNextWithdrawal.ts b/projects/beets-lst/src/functions/getNextWithdrawal.ts index 56a043d3..7578c2e5 100644 --- a/projects/beets-lst/src/functions/getNextWithdrawal.ts +++ b/projects/beets-lst/src/functions/getNextWithdrawal.ts @@ -1,5 +1,5 @@ import { Address } from 'viem'; -import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { FunctionReturn, toResult, EVM, FunctionOptions, EvmChain } from '@heyanon/sdk'; import { supportedChains } from '../constants'; import { getOpenWithdrawRequests } from '../helpers/withdrawals'; @@ -8,8 +8,8 @@ interface Props { account: Address; } -export async function getNextWithdrawal({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); +export async function getNextWithdrawal({ chainName, account }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getOpenWithdrawRequests.ts b/projects/beets-lst/src/functions/getOpenWithdrawRequests.ts index 4f33f1d3..8db7e982 100644 --- a/projects/beets-lst/src/functions/getOpenWithdrawRequests.ts +++ b/projects/beets-lst/src/functions/getOpenWithdrawRequests.ts @@ -1,5 +1,5 @@ import { Address } from 'viem'; -import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { FunctionReturn, toResult, EVM, FunctionOptions, EvmChain } from '@heyanon/sdk'; import { supportedChains } from '../constants'; import { getOpenWithdrawRequests as getOpenWithdrawRequestsHelper } from '../helpers/withdrawals'; @@ -8,8 +8,8 @@ interface Props { account: Address; } -export async function getOpenWithdrawRequests({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); +export async function getOpenWithdrawRequests({ chainName, account }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getProtocolSonicToStakedSonicExchangeRate.ts b/projects/beets-lst/src/functions/getProtocolSonicToStakedSonicExchangeRate.ts index 414d1e84..56dd9073 100644 --- a/projects/beets-lst/src/functions/getProtocolSonicToStakedSonicExchangeRate.ts +++ b/projects/beets-lst/src/functions/getProtocolSonicToStakedSonicExchangeRate.ts @@ -1,5 +1,5 @@ import { formatUnits } from 'viem'; -import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { FunctionReturn, toResult, EVM, FunctionOptions, EvmChain } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS } from '../constants'; import { stsAbi } from '../abis'; @@ -7,8 +7,8 @@ interface Props { chainName: string; } -export async function getProtocolSonicToStakedSonicExchangeRate({ chainName }: Props, { notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); +export async function getProtocolSonicToStakedSonicExchangeRate({ chainName }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getProtocolStakedSonicToSonicExchangeRate.ts b/projects/beets-lst/src/functions/getProtocolStakedSonicToSonicExchangeRate.ts index ac5a2962..855193ff 100644 --- a/projects/beets-lst/src/functions/getProtocolStakedSonicToSonicExchangeRate.ts +++ b/projects/beets-lst/src/functions/getProtocolStakedSonicToSonicExchangeRate.ts @@ -1,5 +1,5 @@ -import { Address, formatUnits } from 'viem'; -import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { formatUnits } from 'viem'; +import { FunctionReturn, toResult, EVM, FunctionOptions, EvmChain } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS } from '../constants'; import { stsAbi } from '../abis'; @@ -7,8 +7,8 @@ interface Props { chainName: string; } -export async function getProtocolStakedSonicToSonicExchangeRate({ chainName }: Props, { notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); +export async function getProtocolStakedSonicToSonicExchangeRate({ chainName }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getSonicBalance.ts b/projects/beets-lst/src/functions/getSonicBalance.ts index f7c01e82..6b97c4b5 100644 --- a/projects/beets-lst/src/functions/getSonicBalance.ts +++ b/projects/beets-lst/src/functions/getSonicBalance.ts @@ -1,5 +1,5 @@ import { Address, formatUnits } from 'viem'; -import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { FunctionReturn, toResult, EVM, FunctionOptions, EvmChain } from '@heyanon/sdk'; import { supportedChains } from '../constants'; interface Props { @@ -7,8 +7,8 @@ interface Props { account: Address; } -export async function getSonicBalance({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); +export async function getSonicBalance({ chainName, account }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getStakedSonicBalance.ts b/projects/beets-lst/src/functions/getStakedSonicBalance.ts index 9b08d8c0..c2e79a16 100644 --- a/projects/beets-lst/src/functions/getStakedSonicBalance.ts +++ b/projects/beets-lst/src/functions/getStakedSonicBalance.ts @@ -1,5 +1,5 @@ import { Address, formatUnits } from 'viem'; -import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { FunctionReturn, toResult, EVM, FunctionOptions, EvmChain } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS } from '../constants'; import { stsAbi } from '../abis'; @@ -8,8 +8,8 @@ interface Props { account: Address; } -export async function getStakedSonicBalance({ chainName, account }: Props, { notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); +export async function getStakedSonicBalance({ chainName, account }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getStakingApr.ts b/projects/beets-lst/src/functions/getStakingApr.ts index 9f05c59b..9baa570a 100644 --- a/projects/beets-lst/src/functions/getStakingApr.ts +++ b/projects/beets-lst/src/functions/getStakingApr.ts @@ -1,4 +1,4 @@ -import { FunctionReturn, toResult, FunctionOptions, getChainFromName } from '@heyanon/sdk'; +import { FunctionReturn, toResult, EVM, EvmChain } from '@heyanon/sdk'; import { supportedChains } from '../constants'; import { fetchStakingAPR } from '../helpers/client'; @@ -6,8 +6,8 @@ interface Props { chainName: string; } -export async function getStakingApr({ chainName }: Props, { notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); +export async function getStakingApr({ chainName }: Props): Promise { + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getTotalSonicInProtocol.ts b/projects/beets-lst/src/functions/getTotalSonicInProtocol.ts index aa5e8205..854657a6 100644 --- a/projects/beets-lst/src/functions/getTotalSonicInProtocol.ts +++ b/projects/beets-lst/src/functions/getTotalSonicInProtocol.ts @@ -1,5 +1,5 @@ import { formatUnits } from 'viem'; -import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { FunctionReturn, toResult, EVM, FunctionOptions, EvmChain } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS } from '../constants'; import { stsAbi } from '../abis'; @@ -7,8 +7,8 @@ interface Props { chainName: string; } -export async function getTotalSonicInProtocol({ chainName }: Props, { notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); +export async function getTotalSonicInProtocol({ chainName }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getTotalStakedSonicInProtocol.ts b/projects/beets-lst/src/functions/getTotalStakedSonicInProtocol.ts index 23f72d5a..05f47e17 100644 --- a/projects/beets-lst/src/functions/getTotalStakedSonicInProtocol.ts +++ b/projects/beets-lst/src/functions/getTotalStakedSonicInProtocol.ts @@ -1,5 +1,5 @@ import { formatUnits } from 'viem'; -import { FunctionReturn, toResult, getChainFromName, FunctionOptions } from '@heyanon/sdk'; +import { FunctionReturn, toResult, EVM, FunctionOptions, EvmChain } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS } from '../constants'; import { stsAbi } from '../abis'; @@ -7,8 +7,8 @@ interface Props { chainName: string; } -export async function getTotalStakedSonicInProtocol({ chainName }: Props, { notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); +export async function getTotalStakedSonicInProtocol({ chainName }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/stake.ts b/projects/beets-lst/src/functions/stake.ts index 0590f35f..66847f72 100644 --- a/projects/beets-lst/src/functions/stake.ts +++ b/projects/beets-lst/src/functions/stake.ts @@ -1,5 +1,5 @@ import { Address, encodeFunctionData, parseUnits, formatUnits } from 'viem'; -import { FunctionReturn, FunctionOptions, TransactionParams, toResult, getChainFromName, checkToApprove } from '@heyanon/sdk'; +import { FunctionReturn, FunctionOptions, toResult, EVM, EvmChain } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS, MIN_DEPOSIT_IN_WEI } from '../constants'; import { stsAbi } from '../abis'; @@ -12,10 +12,10 @@ interface Props { /** * Stake Sonic tokens (S) in Beets.fi liquid staking module */ -export async function stake({ chainName, account, amount }: Props, { sendTransactions, getProvider, notify }: FunctionOptions): Promise { +export async function stake({ chainName, account, amount }: Props, { evm: { sendTransactions }, notify }: FunctionOptions): Promise { if (!account) return toResult('Wallet not connected', true); - const chainId = getChainFromName(chainName); + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); @@ -26,10 +26,10 @@ export async function stake({ chainName, account, amount }: Props, { sendTransac if (amountInWei < parseUnits('0.01', 18)) return toResult('Amount must be greater than 0.01 S', true); if (amountInWei < MIN_DEPOSIT_IN_WEI) return toResult(`Amount must be greater than ${formatUnits(MIN_DEPOSIT_IN_WEI, 18)} S`, true); - const transactions: TransactionParams[] = []; + const transactions: EVM.types.TransactionParams[] = []; // Prepare stake transaction - const tx: TransactionParams = { + const tx: EVM.types.TransactionParams = { target: STS_ADDRESS, data: encodeFunctionData({ abi: stsAbi, diff --git a/projects/beets-lst/src/functions/unStake.ts b/projects/beets-lst/src/functions/unStake.ts index 1716feb5..8902751e 100644 --- a/projects/beets-lst/src/functions/unStake.ts +++ b/projects/beets-lst/src/functions/unStake.ts @@ -1,5 +1,5 @@ import { Address, encodeFunctionData, formatUnits, parseUnits } from 'viem'; -import { FunctionReturn, FunctionOptions, TransactionParams, toResult, getChainFromName } from '@heyanon/sdk'; +import { FunctionReturn, FunctionOptions, toResult, EVM, EvmChain } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS, MIN_UNDELEGATE_IN_WEI } from '../constants'; import { stsAbi } from '../abis'; import { fetchValidators, findHighestDelegatedValidator } from '../helpers/client'; @@ -19,10 +19,10 @@ interface Props { * After 14 days, the user will be able to withdraw their Sonic tokens (S) * using the `withdraw` function. */ -export async function unStake({ chainName, account, amount }: Props, { sendTransactions, notify, getProvider }: FunctionOptions): Promise { +export async function unStake({ chainName, account, amount }: Props, { evm: { sendTransactions }, notify, evm: { getProvider } }: FunctionOptions): Promise { if (!account) return toResult('Wallet not connected', true); - const chainId = getChainFromName(chainName); + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); @@ -58,8 +58,8 @@ export async function unStake({ chainName, account, amount }: Props, { sendTrans return toResult(`Validator does not have enough staked assets. Maximum available: ${targetValidator.assetsDelegated}`, true); } - const transactions: TransactionParams[] = []; - const tx: TransactionParams = { + const transactions: EVM.types.TransactionParams[] = []; + const tx: EVM.types.TransactionParams = { target: STS_ADDRESS, data: encodeFunctionData({ abi: stsAbi, diff --git a/projects/beets-lst/src/functions/withdraw.ts b/projects/beets-lst/src/functions/withdraw.ts index 146a1c7e..5688ae67 100644 --- a/projects/beets-lst/src/functions/withdraw.ts +++ b/projects/beets-lst/src/functions/withdraw.ts @@ -1,5 +1,5 @@ import { Address, encodeFunctionData } from 'viem'; -import { FunctionReturn, toResult, getChainFromName, FunctionOptions, TransactionParams } from '@heyanon/sdk'; +import { FunctionReturn, toResult, EVM, FunctionOptions, EvmChain } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS } from '../constants'; import { stsAbi } from '../abis'; import { getWithdrawRequestInfo } from '../helpers/withdrawals'; @@ -10,8 +10,8 @@ interface Props { withdrawId: string; } -export async function withdraw({ chainName, account, withdrawId }: Props, { sendTransactions, notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); +export async function withdraw({ chainName, account, withdrawId }: Props, { evm: { sendTransactions }, notify, evm: { getProvider } }: FunctionOptions): Promise { + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); @@ -37,8 +37,8 @@ export async function withdraw({ chainName, account, withdrawId }: Props, { send return toResult(`Withdraw request with ID ${withdrawId} is not ready to be claimed; try again in ${withdrawRequest.timeRemaining}`, true); } - const transactions: TransactionParams[] = []; - const tx: TransactionParams = { + const transactions: EVM.types.TransactionParams[] = []; + const tx: EVM.types.TransactionParams = { target: STS_ADDRESS, data: encodeFunctionData({ abi: stsAbi, diff --git a/projects/beets-lst/src/functions/withdrawAll.ts b/projects/beets-lst/src/functions/withdrawAll.ts index 0148362b..24f1eba7 100644 --- a/projects/beets-lst/src/functions/withdrawAll.ts +++ b/projects/beets-lst/src/functions/withdrawAll.ts @@ -1,5 +1,5 @@ import { Address, encodeFunctionData } from 'viem'; -import { FunctionReturn, toResult, getChainFromName, FunctionOptions, TransactionParams } from '@heyanon/sdk'; +import { FunctionReturn, toResult, EVM, FunctionOptions, EvmChain } from '@heyanon/sdk'; import { supportedChains, STS_ADDRESS } from '../constants'; import { stsAbi } from '../abis'; import { getOpenWithdrawRequests } from '../helpers/withdrawals'; @@ -9,8 +9,8 @@ interface Props { account: Address; } -export async function withdrawAll({ chainName, account }: Props, { sendTransactions, notify, getProvider }: FunctionOptions): Promise { - const chainId = getChainFromName(chainName); +export async function withdrawAll({ chainName, account }: Props, { evm: { sendTransactions }, notify, evm: { getProvider } }: FunctionOptions): Promise { + const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); @@ -27,8 +27,8 @@ export async function withdrawAll({ chainName, account }: Props, { sendTransacti const withdrawIds = claimableWithdrawals.map((w) => BigInt(w.id)); const totalAmount = claimableWithdrawals.reduce((sum, w) => sum + Number(w.amount), 0); - const transactions: TransactionParams[] = []; - const tx: TransactionParams = { + const transactions: EVM.types.TransactionParams[] = []; + const tx: EVM.types.TransactionParams = { target: STS_ADDRESS, data: encodeFunctionData({ abi: stsAbi, diff --git a/projects/beets-lst/src/helpers/openai.ts b/projects/beets-lst/src/helpers/openai.ts index 7f277600..fd29c000 100644 --- a/projects/beets-lst/src/helpers/openai.ts +++ b/projects/beets-lst/src/helpers/openai.ts @@ -1,6 +1,5 @@ import { AiTool } from '@heyanon/sdk'; import OpenAI from 'openai'; -import { FunctionParameters } from 'openai/resources'; /** * Convert a HeyAnon tools to an OpenAI tool. diff --git a/projects/beets-lst/src/tools.ts b/projects/beets-lst/src/tools.ts index 79fe1358..0438c35d 100644 --- a/projects/beets-lst/src/tools.ts +++ b/projects/beets-lst/src/tools.ts @@ -1,4 +1,4 @@ -import { AiTool, getChainName } from '@heyanon/sdk'; +import { AiTool, EVM } from '@heyanon/sdk'; import { supportedChains } from './constants'; export const tools: AiTool[] = [ @@ -10,7 +10,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Name of chain where to stake tokens', }, { @@ -33,7 +33,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Name of chain where to unstake tokens', }, { @@ -56,7 +56,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Chain name', }, { @@ -79,7 +79,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Chain name', }, { @@ -97,7 +97,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Chain name', }, { @@ -115,7 +115,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Chain name', }, { @@ -133,7 +133,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Chain name', }, ], @@ -146,7 +146,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Chain name', }, ], @@ -159,7 +159,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Chain name', }, ], @@ -173,7 +173,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Chain name', }, ], @@ -187,7 +187,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Chain name', }, { @@ -205,7 +205,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Chain name', }, { @@ -223,7 +223,7 @@ export const tools: AiTool[] = [ { name: 'chainName', type: 'string', - enum: supportedChains.map(getChainName), + enum: supportedChains.map(EVM.utils.getChainName), description: 'Chain name', }, ], From 9500563a0bc93fee37fb05e37263ab0ed45d2ef9 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Fri, 21 Feb 2025 14:30:49 +0100 Subject: [PATCH 30/33] refac: follow new HeyAnon guidelines --- projects/beets-lst/README.md | 63 ++++++++++--------- projects/beets-lst/src/constants.ts | 26 ++++++++ .../src/functions/getNextWithdrawal.ts | 10 +++ .../src/functions/getOpenWithdrawRequests.ts | 21 ++++++- ...tProtocolSonicToStakedSonicExchangeRate.ts | 11 +++- ...tProtocolStakedSonicToSonicExchangeRate.ts | 8 +++ .../src/functions/getSonicBalance.ts | 9 +++ .../src/functions/getStakedSonicBalance.ts | 9 +++ .../beets-lst/src/functions/getStakingApr.ts | 11 +++- .../src/functions/getTotalSonicInProtocol.ts | 8 +++ .../getTotalStakedSonicInProtocol.ts | 9 +++ projects/beets-lst/src/functions/stake.ts | 10 ++- projects/beets-lst/src/functions/unStake.ts | 14 +++-- projects/beets-lst/src/functions/withdraw.ts | 10 +++ .../beets-lst/src/functions/withdrawAll.ts | 10 +++ projects/beets-lst/src/helpers/amounts.ts | 53 ++++++++++++++++ projects/beets-lst/src/tools.ts | 12 +++- 17 files changed, 248 insertions(+), 46 deletions(-) create mode 100644 projects/beets-lst/src/helpers/amounts.ts diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index e22a94c5..0290f0e6 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -20,25 +20,25 @@ Beets LST allows you to access Sonic staking rewards while maintaining full liqu ## Common Tasks -- **Staking** - - "Stake 100 S in @beets-lst" - - "Stake half of my Sonic in @beets-lst" - - "How many stS do I have in @beets-lst?" - - "Show my position in @beets-lst" -- **Unstaking** - - "Unstake 100 stS from @beets-lst" - - "Unstake all of my stS from @beets-lst" - - "Unstake 100 S worth of stS from @beets-lst" -- **Withdrawing** - - "Withdraw from @beets-lst" - - "Withdraw all from @beets-lst" - - "How long before I can withdraw from @beets-lst?" - - "Show my open withdrawals from @beets-lst" -- **Info and alerts** - - "Alert me when my withdrawal is ready @beets-lst" - - "How much is worth 1 stS in @beets-lst?" - - "How much is worth 1 S in @beets-lst?" - - "How much Sonic is in the protocol @beets-lst?" +1. **Staking** + - Stake 100 S in @beets-lst + - Stake half of my Sonic in @beets-lst + - How much do I have staked in @beets-lst? + - Show my position in @beets-lst +1. **Unstaking** + - Unstake all of my stS from @beets-lst + - Unstake 100 stS from @beets-lst + - Unstake 100 S worth of stS from @beets-lst +1. **Withdrawing** + - Withdraw all from @beets-lst + - Withdraw from @beets-lst + - How long before I can withdraw from @beets-lst? + - Show my pending withdrawals on @beets-lst +1. **Info and alerts** + - What is the APR of staking Sonic on @beets-lst? + - Alert me when my withdrawal is ready @beets-lst + - How much Sonic is in the protocol @beets-lst? + - How much is worth my staked Sonic in @beets-lst? ## Available Functions @@ -79,26 +79,29 @@ I've built a simple agent called `askBeets` to test the integration. To run it, ```bash cd projects/beets-lst -yarn install +pnpm install cp .env.example .env # insert test wallet private key into .env -# insert OpenAI API key into .env +# insert OpenAI or DeepSeek key into .env ``` and then you can ask questions directly: ```bash -yarn run ask "Stake 0.1 S and show my staked balance" -yarn run ask "Unstake all of my stS" -yarn run ask "How long before I can withdraw?" +pnpm ask "What can I do on Beets LST?" +pnpm ask "Stake 100 S in @beets-lst" +pnpm ask "Unstake all of my stS from @beets-lst" +pnpm ask "How long before I can withdraw from @beets-lst?" ``` -The agent will perform one or more tasks to execute your request; see for example this GIF where I asked to bot to unstake all of my stS: - -https://github.com/user-attachments/assets/2ce0d109-85b5-4548-8bad-2c4bfadaeacf - -To debug the actual OpenAI responses, run `askBeets` with `--verbose` flag: +To debug the actual LLM responses, run `askBeets` with `--verbose` flag: ```bash -yarn run ask "What is my stS balance?" --verbose +pnpm ask "Stake 100 S in @beets-lst" --verbose ``` + +## Future improvements + +- Warn the user if swapping is more convenient than unstaking and staking. +- Getter to show the dollar value of the user position. +- Getter to show the user's position: Sonic Balance, stS balance, staking APR, pending withdrawals, dollar value. diff --git a/projects/beets-lst/src/constants.ts b/projects/beets-lst/src/constants.ts index bc738372..348cecde 100644 --- a/projects/beets-lst/src/constants.ts +++ b/projects/beets-lst/src/constants.ts @@ -4,10 +4,36 @@ const { ChainIds } = EVM.constants; export const supportedChains = [ChainIds.sonic]; +/** + * The address of the Beets protocol's staking contract, which + * is also the address of the stS token. + */ export const STS_ADDRESS = '0xe5da20f15420ad15de0fa650600afc998bbe3955'; +/** + * Helper contract needed to get user withdrawals together with + * the withdrawal ID. + */ export const STS_HELPER_ADDRESS = '0x52b16e3d7d25ba64f242e59f9a74799ecc432d78'; +/** + * The minimum amount of Sonic tokens (S) that can be staked. + */ export const MIN_DEPOSIT_IN_WEI = 10000000000000000n; +/** + * The minimum amount of staked Sonic tokens (stS) that can be undelegated. + */ export const MIN_UNDELEGATE_IN_WEI = 1000000000000n; + +/** + * The default precision used to show token amounts, + * expressed as a number of significant digits. + */ +export const DEFAULT_PRECISION = 6; + +/** + * Maximum number of user withdrawals to show in the search + * results, important to avoid the 500 token limit for getters. + */ +export const MAX_WITHDRAWALS_IN_RESULTS = 20; diff --git a/projects/beets-lst/src/functions/getNextWithdrawal.ts b/projects/beets-lst/src/functions/getNextWithdrawal.ts index 7578c2e5..bf0bdc45 100644 --- a/projects/beets-lst/src/functions/getNextWithdrawal.ts +++ b/projects/beets-lst/src/functions/getNextWithdrawal.ts @@ -8,6 +8,16 @@ interface Props { account: Address; } +/** + * Retrieves details about the closest-to-withdrawal request for the specified user, + * including how long until it can be claimed. + * + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @param {Address} props.account - The user account address whose withdrawal requests to check + * @param {FunctionOptions} context - Holds EVM utilities and a notifier + * @returns {Promise} A message about the next withdrawal request or an error message + */ export async function getNextWithdrawal({ chainName, account }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getOpenWithdrawRequests.ts b/projects/beets-lst/src/functions/getOpenWithdrawRequests.ts index 8db7e982..6016f252 100644 --- a/projects/beets-lst/src/functions/getOpenWithdrawRequests.ts +++ b/projects/beets-lst/src/functions/getOpenWithdrawRequests.ts @@ -1,6 +1,6 @@ import { Address } from 'viem'; import { FunctionReturn, toResult, EVM, FunctionOptions, EvmChain } from '@heyanon/sdk'; -import { supportedChains } from '../constants'; +import { MAX_WITHDRAWALS_IN_RESULTS, supportedChains } from '../constants'; import { getOpenWithdrawRequests as getOpenWithdrawRequestsHelper } from '../helpers/withdrawals'; interface Props { @@ -8,6 +8,15 @@ interface Props { account: Address; } +/** + * Retrieves all open (pending or ready) withdrawal requests for a user. + * + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @param {Address} props.account - The user account address whose withdrawal requests to check + * @param {FunctionOptions} context - Holds EVM utilities and a notifier + * @returns {Promise} A formatted message listing withdrawals or an error message + */ export async function getOpenWithdrawRequests({ chainName, account }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); @@ -33,7 +42,13 @@ export async function getOpenWithdrawRequests({ chainName, account }: Props, { n }); // Format the response with withdraw IDs - const withdrawalsList = withdraws.map((w) => `- Withdraw ID ${w.id} of amount ${w.amount} S (${w.timeRemaining})`).join('\n'); + const withdrawalsList = withdraws + .slice(0, MAX_WITHDRAWALS_IN_RESULTS) + .map((w) => `- Withdraw ID ${w.id} of amount ${w.amount} S (${w.timeRemaining})`) + .join('\n'); - return toResult(`Pending withdrawals:\n${withdrawalsList}`); + if (withdraws.length > MAX_WITHDRAWALS_IN_RESULTS) { + return toResult(`${withdraws.length} pending withdrawal(s) found:\n${withdrawalsList}\n\nNote: Only the first ${MAX_WITHDRAWALS_IN_RESULTS} withdrawals are shown.`); + } + return toResult(`${withdraws.length} pending withdrawal(s) found:\n${withdrawalsList}`); } diff --git a/projects/beets-lst/src/functions/getProtocolSonicToStakedSonicExchangeRate.ts b/projects/beets-lst/src/functions/getProtocolSonicToStakedSonicExchangeRate.ts index 56dd9073..31e151f4 100644 --- a/projects/beets-lst/src/functions/getProtocolSonicToStakedSonicExchangeRate.ts +++ b/projects/beets-lst/src/functions/getProtocolSonicToStakedSonicExchangeRate.ts @@ -7,6 +7,15 @@ interface Props { chainName: string; } +/** + * Fetches the conversion rate that determines how many stS tokens can be received + * for each Sonic token (S). + * + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @param {FunctionOptions} context - Holds EVM utilities and a notifier + * @returns {Promise} A message indicating the number of stS tokens per S + */ export async function getProtocolSonicToStakedSonicExchangeRate({ chainName }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); @@ -14,7 +23,7 @@ export async function getProtocolSonicToStakedSonicExchangeRate({ chainName }: P const publicClient = getProvider(chainId); - await notify(`Getting staked Sonic (stS) exchange rate...`); + await notify(`Getting Sonic exchange rate...`); const inverseRate = await publicClient.readContract({ address: STS_ADDRESS, diff --git a/projects/beets-lst/src/functions/getProtocolStakedSonicToSonicExchangeRate.ts b/projects/beets-lst/src/functions/getProtocolStakedSonicToSonicExchangeRate.ts index 855193ff..d3eea53f 100644 --- a/projects/beets-lst/src/functions/getProtocolStakedSonicToSonicExchangeRate.ts +++ b/projects/beets-lst/src/functions/getProtocolStakedSonicToSonicExchangeRate.ts @@ -7,6 +7,14 @@ interface Props { chainName: string; } +/** + * Fetches the conversion rate that determines how many Sonic tokens (S) each stS token is worth. + * + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @param {FunctionOptions} context - Holds EVM utilities and a notifier + * @returns {Promise} A message indicating the number of Sonic tokens (S) per stS token + */ export async function getProtocolStakedSonicToSonicExchangeRate({ chainName }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getSonicBalance.ts b/projects/beets-lst/src/functions/getSonicBalance.ts index 6b97c4b5..c6e37e43 100644 --- a/projects/beets-lst/src/functions/getSonicBalance.ts +++ b/projects/beets-lst/src/functions/getSonicBalance.ts @@ -7,6 +7,15 @@ interface Props { account: Address; } +/** + * Shows the native Sonic (S) balance of the specified address. + * + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @param {Address} props.account - The account address whose balance is retrieved + * @param {FunctionOptions} context - Holds EVM utilities and a notifier + * @returns {Promise} A message indicating the user's Sonic balance or an error + */ export async function getSonicBalance({ chainName, account }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getStakedSonicBalance.ts b/projects/beets-lst/src/functions/getStakedSonicBalance.ts index c2e79a16..8f3c827d 100644 --- a/projects/beets-lst/src/functions/getStakedSonicBalance.ts +++ b/projects/beets-lst/src/functions/getStakedSonicBalance.ts @@ -8,6 +8,15 @@ interface Props { account: Address; } +/** + * Shows the staked Sonic (stS) token balance of the specified address. + * + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @param {Address} props.account - The account address whose stS balance is retrieved + * @param {FunctionOptions} context - Holds EVM utilities and a notifier + * @returns {Promise} A message detailing the user's stS balance + */ export async function getStakedSonicBalance({ chainName, account }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getStakingApr.ts b/projects/beets-lst/src/functions/getStakingApr.ts index 9baa570a..194778e5 100644 --- a/projects/beets-lst/src/functions/getStakingApr.ts +++ b/projects/beets-lst/src/functions/getStakingApr.ts @@ -1,16 +1,23 @@ import { FunctionReturn, toResult, EVM, EvmChain } from '@heyanon/sdk'; import { supportedChains } from '../constants'; import { fetchStakingAPR } from '../helpers/client'; - +import { toSignificant } from '../helpers/amounts'; interface Props { chainName: string; } +/** + * Retrieves the current Annual Percentage Rate (APR) for staking Sonic (S) tokens via stS. + * + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @returns {Promise} A message including the current staking APR or an error + */ export async function getStakingApr({ chainName }: Props): Promise { const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); if (!supportedChains.includes(chainId)) return toResult(`Beets protocol is not supported on ${chainName}`, true); const apr = await fetchStakingAPR(); - return toResult(`Staking APR: ${apr}`); + return toResult(`Staking APR: ${toSignificant(apr * 100, 2, 3)}%`); } diff --git a/projects/beets-lst/src/functions/getTotalSonicInProtocol.ts b/projects/beets-lst/src/functions/getTotalSonicInProtocol.ts index 854657a6..39ea6d36 100644 --- a/projects/beets-lst/src/functions/getTotalSonicInProtocol.ts +++ b/projects/beets-lst/src/functions/getTotalSonicInProtocol.ts @@ -7,6 +7,14 @@ interface Props { chainName: string; } +/** + * Fetches the total amount of Sonic tokens (S) the liquid staking protocol currently holds. + * + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @param {FunctionOptions} context - Holds EVM utilities and a notifier + * @returns {Promise} A message summarizing the total Sonic in the protocol + */ export async function getTotalSonicInProtocol({ chainName }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/getTotalStakedSonicInProtocol.ts b/projects/beets-lst/src/functions/getTotalStakedSonicInProtocol.ts index 05f47e17..14305131 100644 --- a/projects/beets-lst/src/functions/getTotalStakedSonicInProtocol.ts +++ b/projects/beets-lst/src/functions/getTotalStakedSonicInProtocol.ts @@ -7,6 +7,15 @@ interface Props { chainName: string; } +/** + * Shows the total amount of Sonic (S) tokens that are delegated (that is, staked) + * in the liquid staking protocol. + * + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @param {FunctionOptions} context - Holds EVM utilities and a notifier + * @returns {Promise} A message indicating the total staked Sonic (S) in the protocol + */ export async function getTotalStakedSonicInProtocol({ chainName }: Props, { notify, evm: { getProvider } }: FunctionOptions): Promise { const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/stake.ts b/projects/beets-lst/src/functions/stake.ts index 66847f72..390df419 100644 --- a/projects/beets-lst/src/functions/stake.ts +++ b/projects/beets-lst/src/functions/stake.ts @@ -10,7 +10,15 @@ interface Props { } /** - * Stake Sonic tokens (S) in Beets.fi liquid staking module + * Stakes the specified amount of Sonic tokens (S) into the Beets protocol by sending them + * to the staking contract in exchange for staked Sonic (stS). + * + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @param {Address} props.account - The user's address that will stake tokens + * @param {string} props.amount - The amount of Sonic (S) to stake, in decimal format + * @param {FunctionOptions} context - Holds EVM utilities and a notifier + * @returns {Promise} A message confirming the stakes or an error description */ export async function stake({ chainName, account, amount }: Props, { evm: { sendTransactions }, notify }: FunctionOptions): Promise { if (!account) return toResult('Wallet not connected', true); diff --git a/projects/beets-lst/src/functions/unStake.ts b/projects/beets-lst/src/functions/unStake.ts index 8902751e..6b83aa2e 100644 --- a/projects/beets-lst/src/functions/unStake.ts +++ b/projects/beets-lst/src/functions/unStake.ts @@ -11,13 +11,15 @@ interface Props { } /** - * Unstake staked Sonic tokens (stS) + * Initiates the process of unstaking (undelegating) the specified amount of staked Sonic tokens (stS). + * The corresponding Sonic tokens will be ready to be withdrawn after a 14-day waiting period. * - * This action will initiate the undelegation of staked Sonic tokens (stS) - * from the Beets.fi liquid staking module, which will take 14 days to complete. - * - * After 14 days, the user will be able to withdraw their Sonic tokens (S) - * using the `withdraw` function. + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @param {Address} props.account - The user's address that will unstake tokens + * @param {string} props.amount - The amount of stS to unstake, in decimal format + * @param {FunctionOptions} context - Holds EVM utilities and a notifier + * @returns {Promise} A message confirming initiation of unstaking or an error message */ export async function unStake({ chainName, account, amount }: Props, { evm: { sendTransactions }, notify, evm: { getProvider } }: FunctionOptions): Promise { if (!account) return toResult('Wallet not connected', true); diff --git a/projects/beets-lst/src/functions/withdraw.ts b/projects/beets-lst/src/functions/withdraw.ts index 5688ae67..eae78475 100644 --- a/projects/beets-lst/src/functions/withdraw.ts +++ b/projects/beets-lst/src/functions/withdraw.ts @@ -10,6 +10,16 @@ interface Props { withdrawId: string; } +/** + * Claims Sonic tokens (S) from a ready-to-claim withdraw request. + * + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @param {Address} props.account - The user address that owns the withdraw request + * @param {string} props.withdrawId - The identifier for the withdraw request to claim + * @param {FunctionOptions} context - Holds EVM utilities and a notifier + * @returns {Promise} A message confirming a successful withdrawal or an error + */ export async function withdraw({ chainName, account, withdrawId }: Props, { evm: { sendTransactions }, notify, evm: { getProvider } }: FunctionOptions): Promise { const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); diff --git a/projects/beets-lst/src/functions/withdrawAll.ts b/projects/beets-lst/src/functions/withdrawAll.ts index 24f1eba7..6bbf6472 100644 --- a/projects/beets-lst/src/functions/withdrawAll.ts +++ b/projects/beets-lst/src/functions/withdrawAll.ts @@ -9,6 +9,16 @@ interface Props { account: Address; } +/** + * Withdraws Sonic tokens (S) for every withdrawal request that is ready to be claimed, + * in one single transaction. + * + * @param {Object} props - The function input parameters + * @param {string} props.chainName - Name of the blockchain network + * @param {Address} props.account - The user address whose claimable requests will be withdrawn + * @param {FunctionOptions} context - Holds EVM utilities and a notifier + * @returns {Promise} A message detailing the result of withdrawing all claimable requests + */ export async function withdrawAll({ chainName, account }: Props, { evm: { sendTransactions }, notify, evm: { getProvider } }: FunctionOptions): Promise { const chainId = EVM.utils.getChainFromName(chainName as EvmChain); if (!chainId) return toResult(`Unsupported chain name: ${chainName}`, true); diff --git a/projects/beets-lst/src/helpers/amounts.ts b/projects/beets-lst/src/helpers/amounts.ts new file mode 100644 index 00000000..d72e986e --- /dev/null +++ b/projects/beets-lst/src/helpers/amounts.ts @@ -0,0 +1,53 @@ +import { formatUnits } from 'viem'; +import { DEFAULT_PRECISION } from '../constants'; + +/** + * Convert a token amount to a human-readable string, with a + * specified number of significant digits. + * + * Please note that Balancer SDK's TokenAmount.toSignificant + * yields a different result, as it uses a fixed number of + * DECIMAL digits, while this function really does significant + * digits (just like %g formatter in printf). + */ +export function toHumanReadableAmount( + amountInWei: bigint, + decimals: number, + minSignificantDigits = 2, + maxSignificantDigits = DEFAULT_PRECISION, + useThousandsSeparator = true, +): string { + const stringWithFullPrecision = formatUnits(amountInWei, decimals); + return toSignificant(Number(stringWithFullPrecision), minSignificantDigits, maxSignificantDigits, useThousandsSeparator); +} + +/** + * Format a number to a string with the given number of significant + * digits, using a thousands separator if specified. + */ +export function toSignificant( + num: number, + minSignificantDigits: number | undefined = undefined, + maxSignificantDigits: number | undefined = DEFAULT_PRECISION, + useThousandsSeparator = true, +): string { + return num.toLocaleString('en', { + minimumSignificantDigits: minSignificantDigits, + maximumSignificantDigits: maxSignificantDigits, + useGrouping: useThousandsSeparator, + notation: 'standard', // Ensures we don't get scientific notation + }); +} + +/** + * Format a number representing a dollar value to a string. By default, + * it will show two fractional digits. + */ +export function to$$$(num: number, minFractionDigits: number | undefined = 2, maxFractionDigits: number | undefined = 2): string { + return num.toLocaleString('en', { + style: 'currency', + currency: 'USD', + minimumFractionDigits: minFractionDigits, + maximumFractionDigits: maxFractionDigits, + }); +} diff --git a/projects/beets-lst/src/tools.ts b/projects/beets-lst/src/tools.ts index 0438c35d..956d0fdd 100644 --- a/projects/beets-lst/src/tools.ts +++ b/projects/beets-lst/src/tools.ts @@ -27,7 +27,8 @@ export const tools: AiTool[] = [ }, { name: 'unStake', - description: 'Initiate undelegation of staked Sonic tokens (stS). Tokens can be withdrawn after 14 days.', + description: + 'Initiate the undelegation process for staked Sonic tokens (stS). This action effectively "surrenders" stS tokens from the user to the protocol and locks them for a 14-day waiting period. After 14 days, a separate "withdraw" call is required to reclaim the corresponding Sonic tokens.', required: ['chainName', 'account', 'amount'], props: [ { @@ -180,8 +181,7 @@ export const tools: AiTool[] = [ }, { name: 'getOpenWithdrawRequests', - description: - 'Get the list of open withdrawals for the user. A withdrawal is open if it is either ready to be withdrawn or waiting for the 14-day period to elapse. The withdrawal ID will be shown for each withdrawal.', + description: `Get the list of open withdrawals for the user. A withdrawal is open if it is either ready to be withdrawn or waiting for the 14-day period to elapse. The withdrawal ID will be shown for each withdrawal.`, required: ['chainName', 'account'], props: [ { @@ -228,4 +228,10 @@ export const tools: AiTool[] = [ }, ], }, + { + name: 'getBeetsCapabilities', + description: 'Get information about what Beets DEX can do and example prompts.', + required: [], + props: [], + }, ]; From 5504bf98d086be40ab3c451646b518f4e05e7906 Mon Sep 17 00:00:00 2001 From: "Guido W. Pettinari" Date: Fri, 21 Feb 2025 15:29:48 +0100 Subject: [PATCH 31/33] feat: getBeetsCapabilities tool --- projects/beets-lst/README.md | 10 ++--- .../src/functions/getBeetsCapabilities.ts | 39 +++++++++++++++++++ projects/beets-lst/src/functions/index.ts | 1 + projects/beets-lst/src/tools.ts | 2 +- 4 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 projects/beets-lst/src/functions/getBeetsCapabilities.ts diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index 0290f0e6..00743d41 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -26,9 +26,9 @@ Beets LST allows you to access Sonic staking rewards while maintaining full liqu - How much do I have staked in @beets-lst? - Show my position in @beets-lst 1. **Unstaking** - - Unstake all of my stS from @beets-lst - Unstake 100 stS from @beets-lst - - Unstake 100 S worth of stS from @beets-lst + - Unstake half of my stS from @beets-lst + - Unstake all from @beets-lst 1. **Withdrawing** - Withdraw all from @beets-lst - Withdraw from @beets-lst @@ -37,8 +37,8 @@ Beets LST allows you to access Sonic staking rewards while maintaining full liqu 1. **Info and alerts** - What is the APR of staking Sonic on @beets-lst? - Alert me when my withdrawal is ready @beets-lst - - How much Sonic is in the protocol @beets-lst? - - How much is worth my staked Sonic in @beets-lst? + - How much Sonic does @beets-lst hold? + - How much is worth my staked Sonic on @beets-lst? ## Available Functions @@ -57,7 +57,7 @@ Beets LST allows you to access Sonic staking rewards while maintaining full liqu ## Installation ```bash -yarn add @heyanon/beets-lst +pnpm add @heyanon/beets-lst ``` ## Usage diff --git a/projects/beets-lst/src/functions/getBeetsCapabilities.ts b/projects/beets-lst/src/functions/getBeetsCapabilities.ts new file mode 100644 index 00000000..c351dea3 --- /dev/null +++ b/projects/beets-lst/src/functions/getBeetsCapabilities.ts @@ -0,0 +1,39 @@ +import { FunctionReturn, toResult } from '@heyanon/sdk'; + +/** + * Returns a description of Beets LST capabilities and example prompts. + * + * @returns {Promise} A message describing Beets LST features + */ +export async function getBeetsCapabilities(): Promise { + return toResult( + `Beets LST allows you to access Sonic staking rewards while maintaining full liquidity of your assets. Your stS tokens remain liquid and composable, allowing you to earn staking rewards while participating in DeFi opportunities. + +Here's what you can do with Beets LST: + +1. STAKING + - "Stake 100 S in @beets-lst" + - "Stake half of my Sonic in @beets-lst" + - "How much do I have staked in @beets-lst?" + - "Show my position in @beets-lst" + +2. UNSTAKING + - "Unstake all from @beets-lst" + - "Unstake half from @beets-lst" + - "Unstake 100 stS from @beets-lst" + +3. WITHDRAWING + - "Withdraw all from @beets-lst" + - "Withdraw from @beets-lst" + - "How long before I can withdraw from @beets-lst?" + - "Show my pending withdrawals on @beets-lst" + +4. INFORMATION & ALERTS + - "What is the APR of staking Sonic on @beets-lst?" + - "Alert me when my withdrawal is ready @beets-lst" + - "How much Sonic does @beets-lst hold?" + - "How much is worth my staked Sonic on @beets-lst?" + +Just ask your question in natural language and I'll help you interact with Beets LST!`, + ); +} diff --git a/projects/beets-lst/src/functions/index.ts b/projects/beets-lst/src/functions/index.ts index 6d6fee17..46508b67 100644 --- a/projects/beets-lst/src/functions/index.ts +++ b/projects/beets-lst/src/functions/index.ts @@ -11,3 +11,4 @@ export { getProtocolSonicToStakedSonicExchangeRate } from './getProtocolSonicToS export { getOpenWithdrawRequests } from './getOpenWithdrawRequests'; export { getNextWithdrawal } from './getNextWithdrawal'; export { getStakingApr } from './getStakingApr'; +export { getBeetsCapabilities } from './getBeetsCapabilities'; diff --git a/projects/beets-lst/src/tools.ts b/projects/beets-lst/src/tools.ts index 956d0fdd..4c166a49 100644 --- a/projects/beets-lst/src/tools.ts +++ b/projects/beets-lst/src/tools.ts @@ -230,7 +230,7 @@ export const tools: AiTool[] = [ }, { name: 'getBeetsCapabilities', - description: 'Get information about what Beets DEX can do and example prompts.', + description: 'Get information about what Beets LST can do and example prompts.', required: [], props: [], }, From 97449f7159d55beeb2032f80aef02c1153c5249a Mon Sep 17 00:00:00 2001 From: coccoinomane Date: Mon, 10 Mar 2025 10:57:53 +0100 Subject: [PATCH 32/33] docs: fix internal links in README --- projects/beets-lst/README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index 00743d41..5f6409b0 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -42,17 +42,17 @@ Beets LST allows you to access Sonic staking rewards while maintaining full liqu ## Available Functions -- [stake](functions/stake.ts) -- [unStake](functions/unStake.ts) -- [withdraw](functions/withdraw.ts) -- [withdrawAll](functions/withdrawAll.ts) -- [getSonicBalance](functions/getSonicBalance.ts) -- [getStakedSonicBalance](functions/getStakedSonicBalance.ts) -- [getOpenWithdrawRequests](functions/getOpenWithdrawRequests.ts) -- [getProtocolSonicToStakedSonicExchangeRate](functions/getProtocolSonicToStakedSonicExchangeRate.ts) -- [getProtocolStakedSonicToSonicExchangeRate](functions/getProtocolStakedSonicToSonicExchangeRate.ts) -- [getTotalSonicInProtocol](functions/getTotalSonicInProtocol.ts) -- [getTotalStakedSonicInProtocol](functions/getTotalStakedSonicInProtocol.ts) +- [stake](src/functions/stake.ts) +- [unStake](src/functions/unStake.ts) +- [withdraw](src/functions/withdraw.ts) +- [withdrawAll](src/functions/withdrawAll.ts) +- [getSonicBalance](src/functions/getSonicBalance.ts) +- [getStakedSonicBalance](src/functions/getStakedSonicBalance.ts) +- [getOpenWithdrawRequests](src/functions/getOpenWithdrawRequests.ts) +- [getProtocolSonicToStakedSonicExchangeRate](src/functions/getProtocolSonicToStakedSonicExchangeRate.ts) +- [getProtocolStakedSonicToSonicExchangeRate](src/functions/getProtocolStakedSonicToSonicExchangeRate.ts) +- [getTotalSonicInProtocol](src/functions/getTotalSonicInProtocol.ts) +- [getTotalStakedSonicInProtocol](src/functions/getTotalStakedSonicInProtocol.ts) ## Installation From 4029d835879182403b2ef97f99f5a32e6c22d33d Mon Sep 17 00:00:00 2001 From: coccoinomane Date: Mon, 10 Mar 2025 11:00:53 +0100 Subject: [PATCH 33/33] docs: add help subsection to "common commands" in README --- projects/beets-lst/README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/projects/beets-lst/README.md b/projects/beets-lst/README.md index 5f6409b0..3a438862 100644 --- a/projects/beets-lst/README.md +++ b/projects/beets-lst/README.md @@ -39,6 +39,8 @@ Beets LST allows you to access Sonic staking rewards while maintaining full liqu - Alert me when my withdrawal is ready @beets-lst - How much Sonic does @beets-lst hold? - How much is worth my staked Sonic on @beets-lst? +1. **Help** + - What can I do on @beets-lst? ## Available Functions @@ -60,10 +62,6 @@ Beets LST allows you to access Sonic staking rewards while maintaining full liqu pnpm add @heyanon/beets-lst ``` -## Usage - -Example usage will be added here. - ## Contracts and transactions - Liquid staking proxy contract: https://sonicscan.org/address/0xe5da20f15420ad15de0fa650600afc998bbe3955