diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..41583e36c --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@jsr:registry=https://npm.jsr.io diff --git a/package.json b/package.json index d9058f2a6..8665e7c7c 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "test": "vitest run", "tsc": "tsc", "postinstall": "tar -xzC public -f tradingview/tradingview.tgz", - "prepare": "husky", + "prepare": "ts-patch install && typia patch && husky", "commitlint": "commitlint --edit", "wdio": "wdio run ./wdio.conf.ts" }, @@ -56,7 +56,7 @@ "@cosmjs/tendermint-rpc": "^0.32.1", "@datadog/browser-logs": "^5.23.3", "@dydxprotocol/v4-abacus": "1.13.39", - "@dydxprotocol/v4-client-js": "1.12.2", + "@dydxprotocol/v4-client-js": "1.15.1", "@dydxprotocol/v4-localization": "^1.1.257", "@dydxprotocol/v4-proto": "^7.0.0-dev.0", "@emotion/is-prop-valid": "^1.3.0", @@ -124,6 +124,7 @@ "export-to-csv": "^1.2.3", "fast-json-stable-stringify": "^2.1.0", "graz": "^0.1.19", + "immer": "^10.1.1", "jsdom": "^24.1.0", "lodash": "^4.17.21", "long": "^5.2.3", @@ -143,6 +144,7 @@ "reselect": "^5.1.0", "styled-components": "^6.1.12", "twin.macro": "^3.4.1", + "typia": "^7.1.0", "unionize": "^3.1.0", "use-latest": "^1.2.1", "viem": "^2.16.2", @@ -153,6 +155,7 @@ "@commitlint/cli": "^19.0.3", "@commitlint/config-conventional": "^19.0.3", "@ladle/react": "^4.0.2", + "@ryoppippi/unplugin-typia": "npm:@jsr/ryoppippi__unplugin-typia@^1.1.0", "@testing-library/webdriverio": "^3.2.1", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/color": "^3.0.3", @@ -205,9 +208,11 @@ "rollup-plugin-sourcemaps": "^0.6.3", "stream-browserify": "^3.0.0", "tailwindcss": "^3.4.6", + "ts-morph": "^24.0.0", "ts-node": "^10.9.2", + "ts-patch": "^3.3.0", "tsx": "^4.7.1", - "typescript": "^5.6.3", + "typescript": "^5.7.2", "url-polyfill": "^1.1.12", "util": "^0.12.5", "vite": "^4.3.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 97b9ac906..d495ac0a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,22 +10,22 @@ overrides: dependencies: '@cosmjs/amino': specifier: ^0.32.1 - version: 0.32.3 + version: 0.32.4 '@cosmjs/crypto': specifier: ^0.32.1 version: 0.32.4 '@cosmjs/encoding': specifier: ^0.32.1 - version: 0.32.3 + version: 0.32.4 '@cosmjs/proto-signing': specifier: ^0.32.1 - version: 0.32.3 + version: 0.32.4 '@cosmjs/stargate': specifier: ^0.32.1 - version: 0.32.3 + version: 0.32.4 '@cosmjs/tendermint-rpc': specifier: ^0.32.1 - version: 0.32.3 + version: 0.32.4 '@datadog/browser-logs': specifier: ^5.23.3 version: 5.23.3 @@ -33,8 +33,8 @@ dependencies: specifier: 1.13.39 version: 1.13.39 '@dydxprotocol/v4-client-js': - specifier: 1.12.2 - version: 1.12.2 + specifier: 1.15.1 + version: 1.15.1 '@dydxprotocol/v4-localization': specifier: ^1.1.257 version: 1.1.257 @@ -46,7 +46,7 @@ dependencies: version: 1.3.0 '@funkit/connect': specifier: ^4.0.2 - version: 4.0.2(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(babel-plugin-macros@3.1.0)(hardhat@2.22.13)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)(viem@2.16.2)(wagmi@2.10.9) + version: 4.0.2(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(babel-plugin-macros@3.1.0)(hardhat@2.22.13)(immer@10.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.7.2)(viem@2.17.0)(wagmi@2.10.9) '@hugocxl/react-to-image': specifier: ^0.0.9 version: 0.0.9(html-to-image@1.11.11)(react@18.2.0) @@ -55,13 +55,13 @@ dependencies: version: 5.5.3 '@keplr-wallet/types': specifier: ^0.12.121 - version: 0.12.121 + version: 0.12.162(starknet@6.11.0) '@privy-io/react-auth': specifier: ^1.73.0 - version: 1.73.1(@babel/core@7.23.9)(@types/react@18.3.3)(react-dom@18.2.0)(react-is@18.3.1)(react@18.2.0)(typescript@5.6.3) + version: 1.73.1(@babel/core@7.23.9)(@types/react@18.3.3)(react-dom@18.2.0)(react-is@18.3.1)(react@18.2.0)(typescript@5.7.2) '@privy-io/wagmi': specifier: ^0.2.10 - version: 0.2.10(@privy-io/react-auth@1.73.1)(react-dom@18.2.0)(react@18.2.0)(viem@2.16.2)(wagmi@2.10.9) + version: 0.2.10(@privy-io/react-auth@1.73.1)(react-dom@18.2.0)(react@18.2.0)(viem@2.17.0)(wagmi@2.10.9) '@radix-ui/react-accordion': specifier: ^1.1.2 version: 1.1.2(@types/react-dom@18.2.6)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0) @@ -145,13 +145,13 @@ dependencies: version: 2.2.5(react-redux@9.1.2)(react@18.2.0) '@scure/bip32': specifier: ^1.3.0 - version: 1.3.1 + version: 1.4.0 '@scure/bip39': specifier: ^1.2.0 - version: 1.2.1 + version: 1.3.0 '@skip-go/client': specifier: 0.15.5 - version: 0.15.5(@solana/web3.js@1.93.2)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(starknet@6.11.0)(viem@2.16.2) + version: 0.15.5(@solana/web3.js@1.93.2)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(starknet@6.11.0)(viem@2.17.0) '@solana/web3.js': specifier: ^1.93.0 version: 1.93.2 @@ -235,7 +235,10 @@ dependencies: version: 2.1.0 graz: specifier: ^0.1.19 - version: 0.1.19(@cosmjs/amino@0.32.3)(@cosmjs/cosmwasm-stargate@0.32.4)(@cosmjs/launchpad@0.27.1)(@cosmjs/proto-signing@0.32.3)(@cosmjs/stargate@0.32.3)(@cosmjs/tendermint-rpc@0.32.3)(@leapwallet/cosmos-social-login-capsule-provider@0.0.39)(@types/react@18.3.3)(axios@1.6.7)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(starknet@6.11.0) + version: 0.1.19(@cosmjs/amino@0.32.4)(@cosmjs/cosmwasm-stargate@0.32.4)(@cosmjs/launchpad@0.27.1)(@cosmjs/proto-signing@0.32.4)(@cosmjs/stargate@0.32.4)(@cosmjs/tendermint-rpc@0.32.4)(@leapwallet/cosmos-social-login-capsule-provider@0.0.39)(@types/react@18.3.3)(axios@1.7.7)(immer@10.1.1)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(starknet@6.11.0) + immer: + specifier: ^10.1.1 + version: 10.1.1 jsdom: specifier: ^24.1.0 version: 24.1.0 @@ -250,7 +253,7 @@ dependencies: version: 3.3.0 mipd: specifier: ^0.0.7 - version: 0.0.7(typescript@5.6.3) + version: 0.0.7(typescript@5.7.2) prometheus-query: specifier: ^3.4.0 version: 3.4.0 @@ -293,6 +296,9 @@ dependencies: twin.macro: specifier: ^3.4.1 version: 3.4.1(tailwindcss@3.4.6) + typia: + specifier: ^7.1.0 + version: 7.1.0(@samchon/openapi@2.2.1)(typescript@5.7.2) unionize: specifier: ^3.1.0 version: 3.1.0 @@ -301,10 +307,10 @@ dependencies: version: 1.2.1(@types/react@18.3.3)(react@18.2.0) viem: specifier: ^2.16.2 - version: 2.16.2(typescript@5.6.3) + version: 2.17.0(typescript@5.7.2) wagmi: specifier: ^2.10.7 - version: 2.10.9(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1)(typescript@5.6.3)(viem@2.16.2) + version: 2.10.9(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1)(typescript@5.7.2)(viem@2.17.0) devDependencies: '@babel/core': @@ -312,13 +318,16 @@ devDependencies: version: 7.23.9 '@commitlint/cli': specifier: ^19.0.3 - version: 19.0.3(@types/node@20.12.13)(typescript@5.6.3) + version: 19.0.3(@types/node@20.12.13)(typescript@5.7.2) '@commitlint/config-conventional': specifier: ^19.0.3 version: 19.0.3 '@ladle/react': specifier: ^4.0.2 - version: 4.0.2(@types/node@20.12.13)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3) + version: 4.0.2(@types/node@20.12.13)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.7.2) + '@ryoppippi/unplugin-typia': + specifier: npm:@jsr/ryoppippi__unplugin-typia@^1.1.0 + version: /@jsr/ryoppippi__unplugin-typia@1.1.0(@samchon/openapi@2.2.1)(@types/node@20.12.13)(rollup@2.79.1)(tsx@4.7.1) '@testing-library/webdriverio': specifier: ^3.2.1 version: 3.2.1(webdriverio@8.36.1) @@ -348,25 +357,25 @@ devDependencies: version: 18.2.6 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.6.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.7.2) '@typescript-eslint/parser': specifier: ^6.21.0 - version: 6.21.0(eslint@8.57.0)(typescript@5.6.3) + version: 6.21.0(eslint@8.57.0)(typescript@5.7.2) '@vitejs/plugin-react': specifier: ^4.0.1 version: 4.2.1(vite@4.3.9) '@wdio/browserstack-service': specifier: ^8.32.4 - version: 8.33.1(@wdio/cli@8.33.1)(typescript@5.6.3) + version: 8.33.1(@wdio/cli@8.33.1)(typescript@5.7.2) '@wdio/cli': specifier: ^8.32.4 - version: 8.33.1(typescript@5.6.3) + version: 8.33.1(typescript@5.7.2) '@wdio/globals': specifier: ^8.32.4 - version: 8.33.1(typescript@5.6.3) + version: 8.33.1(typescript@5.7.2) '@wdio/local-runner': specifier: ^8.32.4 - version: 8.33.1(typescript@5.6.3) + version: 8.33.1(typescript@5.7.2) '@wdio/mocha-framework': specifier: ^8.32.4 version: 8.33.1 @@ -375,7 +384,7 @@ devDependencies: version: 8.32.4 '@wdio/types': specifier: ^8.32.4 - version: 8.32.4 + version: 8.36.1 ajv: specifier: ^8.12.0 version: 8.12.0 @@ -384,7 +393,7 @@ devDependencies: version: 2.1.0 axios: specifier: ^1.6.7 - version: 1.6.7 + version: 1.7.7 babel-loader: specifier: ^9.1.2 version: 9.1.2(@babel/core@7.23.9)(webpack@5.91.0) @@ -417,7 +426,7 @@ devDependencies: version: 9.1.0(eslint@8.57.0) eslint-config-standard-with-typescript: specifier: ^43.0.1 - version: 43.0.1(@typescript-eslint/eslint-plugin@6.21.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.2.0)(eslint@8.57.0)(typescript@5.6.3) + version: 43.0.1(@typescript-eslint/eslint-plugin@6.21.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.2.0)(eslint@8.57.0)(typescript@5.7.2) eslint-import-resolver-typescript: specifier: ^3.6.1 version: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) @@ -456,7 +465,7 @@ devDependencies: version: 8.6.6 postcss: specifier: ^8.4.39 - version: 8.4.39 + version: 8.4.49 prettier: specifier: ^3.2.5 version: 3.2.5 @@ -475,15 +484,21 @@ devDependencies: tailwindcss: specifier: ^3.4.6 version: 3.4.6(ts-node@10.9.2) + ts-morph: + specifier: ^24.0.0 + version: 24.0.0 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.12.13)(typescript@5.6.3) + version: 10.9.2(@types/node@20.12.13)(typescript@5.7.2) + ts-patch: + specifier: ^3.3.0 + version: 3.3.0 tsx: specifier: ^4.7.1 version: 4.7.1 typescript: - specifier: ^5.6.3 - version: 5.6.3 + specifier: ^5.7.2 + version: 5.7.2 url-polyfill: specifier: ^1.1.12 version: 1.1.12 @@ -501,7 +516,7 @@ devDependencies: version: 0.4.0(vite@4.3.9) vite-plugin-svgr: specifier: ^3.2.0 - version: 3.2.0(rollup@2.79.1)(typescript@5.6.3)(vite@4.3.9) + version: 3.2.0(rollup@2.79.1)(typescript@5.7.2)(vite@4.3.9) vitest: specifier: 1.4.0 version: 1.4.0(@types/node@20.12.13)(jsdom@24.1.0) @@ -1065,7 +1080,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + picocolors: 1.1.1 /@babel/compat-data@7.24.7: resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} @@ -1342,7 +1357,7 @@ packages: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.1.1 /@babel/parser@7.24.7: resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} @@ -2674,14 +2689,14 @@ packages: engines: {node: '>=0.1.90'} dev: true - /@commitlint/cli@19.0.3(@types/node@20.12.13)(typescript@5.6.3): + /@commitlint/cli@19.0.3(@types/node@20.12.13)(typescript@5.7.2): resolution: {integrity: sha512-mGhh/aYPib4Vy4h+AGRloMY+CqkmtdeKPV9poMcZeImF5e3knQ5VYaSeAM0mEzps1dbKsHvABwaDpafLUuM96g==} engines: {node: '>=v18'} hasBin: true dependencies: '@commitlint/format': 19.0.3 '@commitlint/lint': 19.0.3 - '@commitlint/load': 19.0.3(@types/node@20.12.13)(typescript@5.6.3) + '@commitlint/load': 19.0.3(@types/node@20.12.13)(typescript@5.7.2) '@commitlint/read': 19.0.3 '@commitlint/types': 19.0.3 execa: 8.0.1 @@ -2737,7 +2752,7 @@ packages: engines: {node: '>=v18'} dependencies: '@commitlint/types': 19.0.3 - semver: 7.6.2 + semver: 7.6.3 dev: true /@commitlint/lint@19.0.3: @@ -2750,7 +2765,7 @@ packages: '@commitlint/types': 19.0.3 dev: true - /@commitlint/load@19.0.3(@types/node@20.12.13)(typescript@5.6.3): + /@commitlint/load@19.0.3(@types/node@20.12.13)(typescript@5.7.2): resolution: {integrity: sha512-18Tk/ZcDFRKIoKfEcl7kC+bYkEQ055iyKmGsYDoYWpKf6FUvBrP9bIWapuy/MB+kYiltmP9ITiUx6UXtqC9IRw==} engines: {node: '>=v18'} dependencies: @@ -2759,8 +2774,8 @@ packages: '@commitlint/resolve-extends': 19.0.3 '@commitlint/types': 19.0.3 chalk: 5.3.0 - cosmiconfig: 8.3.6(typescript@5.6.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.12.13)(cosmiconfig@8.3.6)(typescript@5.6.3) + cosmiconfig: 8.3.6(typescript@5.7.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.12.13)(cosmiconfig@8.3.6)(typescript@5.7.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -2861,15 +2876,6 @@ packages: '@cosmjs/utils': 0.31.3 dev: false - /@cosmjs/amino@0.32.3: - resolution: {integrity: sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==} - dependencies: - '@cosmjs/crypto': 0.32.4 - '@cosmjs/encoding': 0.32.4 - '@cosmjs/math': 0.32.4 - '@cosmjs/utils': 0.32.4 - dev: false - /@cosmjs/amino@0.32.4: resolution: {integrity: sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q==} dependencies: @@ -2953,14 +2959,6 @@ packages: readonly-date: 1.0.0 dev: false - /@cosmjs/encoding@0.32.3: - resolution: {integrity: sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==} - dependencies: - base64-js: 1.5.1 - bech32: 1.1.4 - readonly-date: 1.0.0 - dev: false - /@cosmjs/encoding@0.32.4: resolution: {integrity: sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw==} dependencies: @@ -3027,17 +3025,6 @@ packages: long: 4.0.0 dev: false - /@cosmjs/proto-signing@0.32.3: - resolution: {integrity: sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==} - dependencies: - '@cosmjs/amino': 0.32.4 - '@cosmjs/crypto': 0.32.4 - '@cosmjs/encoding': 0.32.4 - '@cosmjs/math': 0.32.4 - '@cosmjs/utils': 0.32.4 - cosmjs-types: 0.9.0 - dev: false - /@cosmjs/proto-signing@0.32.4: resolution: {integrity: sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ==} dependencies: @@ -3094,25 +3081,6 @@ packages: - utf-8-validate dev: false - /@cosmjs/stargate@0.32.3: - resolution: {integrity: sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==} - dependencies: - '@confio/ics23': 0.6.8 - '@cosmjs/amino': 0.32.4 - '@cosmjs/encoding': 0.32.4 - '@cosmjs/math': 0.32.4 - '@cosmjs/proto-signing': 0.32.4 - '@cosmjs/stream': 0.32.4 - '@cosmjs/tendermint-rpc': 0.32.4 - '@cosmjs/utils': 0.32.4 - cosmjs-types: 0.9.0 - xstream: 11.14.0 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - dev: false - /@cosmjs/stargate@0.32.4: resolution: {integrity: sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ==} dependencies: @@ -3163,25 +3131,6 @@ packages: - utf-8-validate dev: false - /@cosmjs/tendermint-rpc@0.32.3: - resolution: {integrity: sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==} - dependencies: - '@cosmjs/crypto': 0.32.4 - '@cosmjs/encoding': 0.32.4 - '@cosmjs/json-rpc': 0.32.4 - '@cosmjs/math': 0.32.4 - '@cosmjs/socket': 0.32.4 - '@cosmjs/stream': 0.32.4 - '@cosmjs/utils': 0.32.4 - axios: 1.7.7 - readonly-date: 1.0.0 - xstream: 11.14.0 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - dev: false - /@cosmjs/tendermint-rpc@0.32.4: resolution: {integrity: sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw==} dependencies: @@ -3228,14 +3177,14 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.9 - /@dao-dao/cosmiframe@0.1.0(@cosmjs/amino@0.32.3)(@cosmjs/proto-signing@0.32.3): + /@dao-dao/cosmiframe@0.1.0(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4): resolution: {integrity: sha512-NW4pGt1ctqDfhn/A6RU2vwnFEu3O4aBNnBMrGnw31n+L35drYNEsA9ZB7KZsHmRRlkNx+jSuJSv2Fv0BFBDDJQ==} peerDependencies: '@cosmjs/amino': '>= ^0.32' '@cosmjs/proto-signing': '>= ^0.32' dependencies: - '@cosmjs/amino': 0.32.3 - '@cosmjs/proto-signing': 0.32.3 + '@cosmjs/amino': 0.32.4 + '@cosmjs/proto-signing': 0.32.4 uuid: 9.0.1 dev: false @@ -3276,8 +3225,8 @@ packages: format-util: 1.0.5 dev: false - /@dydxprotocol/v4-client-js@1.12.2: - resolution: {integrity: sha512-iW1HoOx8XcFzsGfldVyh64Tdy3GRDfeaEWQvy1KT4KWZ6xINMyqs5i6E7Wl8IHtkPQzkzWMN1Exw3JPkXJfGXA==} + /@dydxprotocol/v4-client-js@1.15.1: + resolution: {integrity: sha512-Dd+uQUcPw+pRAPkcw7rBIOjrANJD35e97DY/uxmNobN1cD3lDZx4ztrSMkaokrKWj/KugnFLUFRGCeSBiSi8ag==} dependencies: '@cosmjs/amino': 0.32.4 '@cosmjs/encoding': 0.32.4 @@ -3365,6 +3314,15 @@ packages: dev: true optional: true + /@esbuild/aix-ppc64@0.24.0: + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64@0.17.19: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -3383,6 +3341,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64@0.24.0: + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm@0.17.19: resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -3401,6 +3368,15 @@ packages: dev: true optional: true + /@esbuild/android-arm@0.24.0: + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.17.19: resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -3419,6 +3395,15 @@ packages: dev: true optional: true + /@esbuild/android-x64@0.24.0: + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64@0.17.19: resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -3437,6 +3422,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64@0.24.0: + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64@0.17.19: resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -3455,6 +3449,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64@0.24.0: + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64@0.17.19: resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -3473,6 +3476,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64@0.24.0: + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64@0.17.19: resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -3491,6 +3503,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64@0.24.0: + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.17.19: resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -3509,6 +3530,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64@0.24.0: + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.17.19: resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -3527,6 +3557,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm@0.24.0: + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.17.19: resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -3545,6 +3584,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32@0.24.0: + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64@0.17.19: resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -3563,6 +3611,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64@0.24.0: + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el@0.17.19: resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -3581,6 +3638,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el@0.24.0: + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64@0.17.19: resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -3599,6 +3665,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64@0.24.0: + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64@0.17.19: resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -3617,6 +3692,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64@0.24.0: + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x@0.17.19: resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -3635,6 +3719,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x@0.24.0: + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64@0.17.19: resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -3653,6 +3746,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64@0.24.0: + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64@0.17.19: resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -3671,6 +3773,24 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64@0.24.0: + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-arm64@0.24.0: + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64@0.17.19: resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -3689,6 +3809,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64@0.24.0: + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64@0.17.19: resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -3707,6 +3836,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64@0.24.0: + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64@0.17.19: resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -3725,6 +3863,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64@0.24.0: + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32@0.17.19: resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -3743,6 +3890,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32@0.24.0: + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64@0.17.19: resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -3761,6 +3917,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.24.0: + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4233,7 +4398,7 @@ packages: big.js: 6.2.2 dev: false - /@funkit/connect@4.0.2(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(babel-plugin-macros@3.1.0)(hardhat@2.22.13)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)(viem@2.16.2)(wagmi@2.10.9): + /@funkit/connect@4.0.2(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(babel-plugin-macros@3.1.0)(hardhat@2.22.13)(immer@10.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.7.2)(viem@2.17.0)(wagmi@2.10.9): resolution: {integrity: sha512-aLUZD34S1MIl5k//UdNkhq+lbKoZkJG7Rk8wHpONFCzj3x7pYKDZyv82E1E3GnZsc50+4ONz05c1PL79HXg0vA==} engines: {node: '>=18'} peerDependencies: @@ -4245,9 +4410,9 @@ packages: dependencies: '@datadog/browser-logs': 5.22.0 '@funkit/api-base': 1.4.1 - '@funkit/core': 2.2.8(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(hardhat@2.22.13)(typescript@5.6.3) + '@funkit/core': 2.2.8(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(hardhat@2.22.13)(typescript@5.7.2) '@funkit/utils': 1.0.2 - '@funkit/wagmi-tools': 3.0.19(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(@types/react@18.3.3)(hardhat@2.22.13)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3) + '@funkit/wagmi-tools': 3.0.19(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(@types/react@18.3.3)(hardhat@2.22.13)(immer@10.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.7.2) '@meshconnect/web-link-sdk': 2.1.1 '@moonpay/moonpay-react': 1.8.2(react@18.2.0) '@privy-io/js-sdk-core': 0.21.1 @@ -4256,7 +4421,7 @@ packages: '@vanilla-extract/css': 1.15.3(babel-plugin-macros@3.1.0) '@vanilla-extract/dynamic': 2.1.0 '@vanilla-extract/sprinkles': 1.6.1(@vanilla-extract/css@1.15.3) - '@wagmi/core': 2.13.8(@types/react@18.3.3)(react@18.2.0)(typescript@5.6.3)(viem@2.16.2) + '@wagmi/core': 2.13.8(@types/react@18.3.3)(immer@10.1.1)(react@18.2.0)(typescript@5.7.2)(viem@2.17.0) bech32: 2.0.0 clsx: 2.1.1 qrcode: 1.5.3 @@ -4266,8 +4431,8 @@ packages: react-virtuoso: 4.10.1(react-dom@18.2.0)(react@18.2.0) ua-parser-js: 1.0.37 uuid: 9.0.1 - viem: 2.16.2(typescript@5.6.3) - wagmi: 2.10.9(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1)(typescript@5.6.3)(viem@2.16.2) + viem: 2.17.0(typescript@5.7.2) + wagmi: 2.10.9(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1)(typescript@5.7.2)(viem@2.17.0) transitivePeerDependencies: - '@datadog/browser-rum' - '@ethersproject/address' @@ -4286,7 +4451,7 @@ packages: - zod dev: false - /@funkit/core@2.2.8(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(hardhat@2.22.13)(typescript@5.6.3): + /@funkit/core@2.2.8(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(hardhat@2.22.13)(typescript@5.7.2): resolution: {integrity: sha512-SvLc9pjjNOmIx0OyfWyfou/AAiaiHC3feIkDiIZZEfg5msffb5lBhVnpPTxXyj0B8YP49ya/SqRjBeQm5tDpDQ==} dependencies: '@aws-sdk/client-secrets-manager': 3.674.0 @@ -4298,12 +4463,12 @@ packages: '@uniswap/sdk': 3.0.3(@ethersproject/address@5.7.0)(@ethersproject/contracts@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/providers@5.7.2)(@ethersproject/solidity@5.7.0) '@uniswap/sdk-core': 4.2.1 '@uniswap/v3-sdk': 3.18.1(hardhat@2.22.13) - abitype: 0.10.3(typescript@5.6.3) + abitype: 0.10.3(typescript@5.7.2) big.js: 6.2.2 dotenv: 16.4.5 ethers: 5.7.2 uuid: 9.0.1 - viem: 2.17.0(typescript@5.6.3) + viem: 2.17.0(typescript@5.7.2) transitivePeerDependencies: - '@ethersproject/address' - '@ethersproject/networks' @@ -4321,18 +4486,18 @@ packages: engines: {node: '>=18'} dev: false - /@funkit/wagmi-tools@3.0.19(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(@types/react@18.3.3)(hardhat@2.22.13)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3): + /@funkit/wagmi-tools@3.0.19(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(@types/react@18.3.3)(hardhat@2.22.13)(immer@10.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.7.2): resolution: {integrity: sha512-3k4df1OLkfSq5rh0J7tSXVFG3W82ux7kF8UT41pv4Lop2ZexLOkDLf6jiFhCYQ921YrMdzZCeu8Dh1DVV6Q4ZQ==} engines: {node: '>=18'} peerDependencies: react: ^18.3.0 react-dom: ^18.3.0 dependencies: - '@funkit/core': 2.2.8(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(hardhat@2.22.13)(typescript@5.6.3) - '@wagmi/core': 2.13.8(@types/react@18.3.3)(react@18.2.0)(typescript@5.6.3)(viem@2.17.0) + '@funkit/core': 2.2.8(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(hardhat@2.22.13)(typescript@5.7.2) + '@wagmi/core': 2.13.8(@types/react@18.3.3)(immer@10.1.1)(react@18.2.0)(typescript@5.7.2)(viem@2.17.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - viem: 2.17.0(typescript@5.6.3) + viem: 2.17.0(typescript@5.7.2) transitivePeerDependencies: - '@ethersproject/address' - '@ethersproject/networks' @@ -4763,7 +4928,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 /@jridgewell/resolve-uri@3.1.2: @@ -4780,20 +4945,20 @@ packages: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@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.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 /@js-joda/core@3.2.0: resolution: {integrity: sha512-PMqgJ0sw5B7FKb2d5bWYIoxjri+QlW/Pys7+Rw82jSH0QN3rB05jZ/VrrsUdh1w4+i2kw9JOejXGq/KhDOX7Kg==} @@ -4803,6 +4968,38 @@ packages: resolution: {integrity: sha512-7dqNYwG8gCt4hfg5PKgM7xLEcgSBcx/UgC92OMnhMmvAnq11QzDFPrxUkNR/u5kn17WWLZ8beZ4A3Qrz4pZcmQ==} dev: false + /@jsr/ryoppippi__unplugin-typia@1.1.0(@samchon/openapi@2.2.1)(@types/node@20.12.13)(rollup@2.79.1)(tsx@4.7.1): + resolution: {integrity: sha512-/Azs26dk4J/Lq9nkNCRIC0A0CbOnRnt2RWSKEcGSbhk2Vh3zKut2uyqiwjy7EJccSAnbwZ3fmrYltMiaiyV14A==, tarball: https://npm.jsr.io/~/11/@jsr/ryoppippi__unplugin-typia/1.1.0.tgz} + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@2.79.1) + consola: 3.2.3 + defu: 6.1.4 + diff-match-patch: 1.0.5 + find-cache-dir: 5.0.0 + magic-string: 0.30.14 + pathe: 1.1.2 + pkg-types: 1.2.1 + type-fest: 4.30.0 + typescript: 5.6.3 + typia: 7.1.0(@samchon/openapi@2.2.1)(typescript@5.6.3) + unplugin: 1.16.0 + vite: 6.0.3(@types/node@20.12.13)(tsx@4.7.1) + transitivePeerDependencies: + - '@samchon/openapi' + - '@types/node' + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + dev: true + /@keplr-wallet/common@0.12.121: resolution: {integrity: sha512-CPycrXnBy7+l6qUlOROIt4jXCSdpyTfIJHzDaI5zzBAKxRKFCPx+4LzOb0ZEhZvs8m328f+tfCnWUqngCBPWkA==} dependencies: @@ -4908,7 +5105,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@ladle/react@4.0.2(@types/node@20.12.13)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3): + /@ladle/react@4.0.2(@types/node@20.12.13)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.7.2): resolution: {integrity: sha512-SnYniR/U7kJX1Zh199jhjxqiFa5e5eA8chuX6uYEZYAUtCCY/hQqGr7/7Grr0j6Q4FYu9iQyyV2K1NJKDdUZIw==} engines: {node: '>=18.0.0'} hasBin: true @@ -4941,7 +5138,7 @@ packages: koa: 2.14.2 koa-connect: 2.1.0 lodash.merge: 4.6.2 - msw: 2.1.7(typescript@5.6.3) + msw: 2.1.7(typescript@5.7.2) open: 9.1.0 prism-react-renderer: 2.3.1(react@18.2.0) prop-types: 15.8.1 @@ -4956,7 +5153,7 @@ packages: source-map: 0.7.4 vfile: 6.0.1 vite: 5.0.12(@types/node@20.12.13) - vite-tsconfig-paths: 4.3.1(typescript@5.6.3)(vite@5.0.12) + vite-tsconfig-paths: 4.3.1(typescript@5.7.2)(vite@5.0.12) transitivePeerDependencies: - '@swc/helpers' - '@types/node' @@ -4971,12 +5168,12 @@ packages: - typescript dev: true - /@leapwallet/cosmos-social-login-capsule-provider@0.0.39(@cosmjs/encoding@0.32.3)(@cosmjs/proto-signing@0.32.3)(fp-ts@2.16.8): + /@leapwallet/cosmos-social-login-capsule-provider@0.0.39(@cosmjs/encoding@0.32.4)(@cosmjs/proto-signing@0.32.4)(fp-ts@2.16.8): resolution: {integrity: sha512-7u9ZhiBHK7MeCNFNcnN4ttS11LITL5P6NtBwZ331MppAsGqRkexJQq6fofDZIiGaKiBqAp4qsFKEVM0fohOZBA==} dependencies: '@cosmjs/amino': 0.31.3 '@leapwallet/cosmos-social-login-core': 0.0.1 - '@usecapsule/cosmjs-v0-integration': 1.10.0(@cosmjs/amino@0.31.3)(@cosmjs/encoding@0.32.3)(@cosmjs/proto-signing@0.32.3)(fp-ts@2.16.8) + '@usecapsule/cosmjs-v0-integration': 1.10.0(@cosmjs/amino@0.31.3)(@cosmjs/encoding@0.32.4)(@cosmjs/proto-signing@0.32.4)(fp-ts@2.16.8) '@usecapsule/web-sdk': 1.12.0(fp-ts@2.16.8) long: 5.2.3 transitivePeerDependencies: @@ -4991,7 +5188,7 @@ packages: dependencies: '@cosmjs/amino': 0.31.3 '@cosmjs/proto-signing': 0.31.3 - typescript: 5.6.3 + typescript: 5.7.2 dev: false /@lifeomic/attempt@3.1.0: @@ -5028,7 +5225,7 @@ packages: /@mdx-js/mdx@3.0.0: resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.0 '@types/hast': 3.0.4 '@types/mdx': 2.0.6 @@ -5329,7 +5526,7 @@ packages: dependencies: '@types/debug': 4.1.12 debug: 4.3.4(supports-color@5.5.0) - semver: 7.6.2 + semver: 7.6.3 superstruct: 1.0.4 transitivePeerDependencies: - supports-color @@ -5342,7 +5539,7 @@ packages: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 debug: 4.3.4(supports-color@5.5.0) - semver: 7.6.2 + semver: 7.6.3 superstruct: 1.0.4 transitivePeerDependencies: - supports-color @@ -5358,7 +5555,7 @@ packages: '@types/debug': 4.1.12 debug: 4.3.4(supports-color@5.5.0) pony-cause: 2.1.10 - semver: 7.6.2 + semver: 7.6.3 superstruct: 1.0.4 uuid: 9.0.1 transitivePeerDependencies: @@ -5981,7 +6178,7 @@ packages: - utf-8-validate dev: false - /@privy-io/react-auth@1.73.1(@babel/core@7.23.9)(@types/react@18.3.3)(react-dom@18.2.0)(react-is@18.3.1)(react@18.2.0)(typescript@5.6.3): + /@privy-io/react-auth@1.73.1(@babel/core@7.23.9)(@types/react@18.3.3)(react-dom@18.2.0)(react-is@18.3.1)(react@18.2.0)(typescript@5.7.2): resolution: {integrity: sha512-sZq1T8R0nsWvd2bL+J5JX77tLM01xBKkVYlrBWU98cFqVm3A2QP1LMeJ53zO6GAjLrBEYT4ToWIiJNoeFk/Bcg==} peerDependencies: react: ^18 @@ -6016,7 +6213,7 @@ packages: libphonenumber-js: 1.10.59 lokijs: 1.5.12 md5: 2.3.0 - mipd: 0.0.7(typescript@5.6.3) + mipd: 0.0.7(typescript@5.7.2) ofetch: 1.3.4 pino-pretty: 10.3.1 qrcode: 1.5.3 @@ -6051,7 +6248,7 @@ packages: - utf-8-validate dev: false - /@privy-io/wagmi@0.2.10(@privy-io/react-auth@1.73.1)(react-dom@18.2.0)(react@18.2.0)(viem@2.16.2)(wagmi@2.10.9): + /@privy-io/wagmi@0.2.10(@privy-io/react-auth@1.73.1)(react-dom@18.2.0)(react@18.2.0)(viem@2.17.0)(wagmi@2.10.9): resolution: {integrity: sha512-tU8ZMuLaGasvct8KmYpL/oPyvwiLh5n3FA2Se39BhGxKCK/OcFDGu1VxHdkc1WCx0DB0DCNNZJeJTimCke5Xpw==} peerDependencies: '@privy-io/react-auth': ^1.64.1 @@ -6060,11 +6257,11 @@ packages: viem: ^2 wagmi: ^2 dependencies: - '@privy-io/react-auth': 1.73.1(@babel/core@7.23.9)(@types/react@18.3.3)(react-dom@18.2.0)(react-is@18.3.1)(react@18.2.0)(typescript@5.6.3) + '@privy-io/react-auth': 1.73.1(@babel/core@7.23.9)(@types/react@18.3.3)(react-dom@18.2.0)(react-is@18.3.1)(react@18.2.0)(typescript@5.7.2) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - viem: 2.16.2(typescript@5.6.3) - wagmi: 2.10.9(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1)(typescript@5.6.3)(viem@2.16.2) + viem: 2.17.0(typescript@5.7.2) + wagmi: 2.10.9(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1)(typescript@5.7.2)(viem@2.17.0) dev: false /@promptbook/utils@0.50.0-10: @@ -6108,7 +6305,7 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - /@puppeteer/browsers@1.4.6(typescript@5.6.3): + /@puppeteer/browsers@1.4.6(typescript@5.7.2): resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==} engines: {node: '>=16.3.0'} hasBin: true @@ -6124,7 +6321,7 @@ packages: progress: 2.0.3 proxy-agent: 6.3.0 tar-fs: 3.0.4 - typescript: 5.6.3 + typescript: 5.7.2 unbzip2-stream: 1.4.3 yargs: 17.7.1 transitivePeerDependencies: @@ -8168,7 +8365,7 @@ packages: hermes-profile-transformer: 0.0.6 node-stream-zip: 1.15.0 ora: 5.4.1 - semver: 7.6.2 + semver: 7.6.3 strip-ansi: 5.2.0 wcwidth: 1.0.1 yaml: 2.4.5 @@ -8251,7 +8448,7 @@ packages: node-fetch: 2.7.0(encoding@0.1.13) open: 6.4.0 ora: 5.4.1 - semver: 7.6.2 + semver: 7.6.3 shell-quote: 1.8.1 sudo-prompt: 9.2.1 transitivePeerDependencies: @@ -8285,7 +8482,7 @@ packages: fs-extra: 8.1.0 graceful-fs: 4.2.11 prompts: 2.4.2 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - bufferutil - encoding @@ -9148,9 +9345,9 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.3(rollup@2.79.1) + '@rollup/pluginutils': 5.1.3(rollup@2.79.1) estree-walker: 2.0.2 - magic-string: 0.30.8 + magic-string: 0.30.14 rollup: 2.79.1 dev: true @@ -9166,129 +9363,177 @@ packages: rollup: 2.79.1 dev: true - /@rollup/pluginutils@5.0.3(rollup@2.79.1): - resolution: {integrity: sha512-hfllNN4a80rwNQ9QCxhxuHCGHMAvabXqxNdaChUSSadMre7t4iEUI6fFAhBOn/eIYTgYVhBv7vCLsAJ4u3lf3g==} + /@rollup/pluginutils@5.1.3(rollup@2.79.1): + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-walker: 2.0.2 - picomatch: 2.3.1 + picomatch: 4.0.2 rollup: 2.79.1 dev: true - /@rollup/rollup-android-arm-eabi@4.9.6: - resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} + /@rollup/rollup-android-arm-eabi@4.28.1: + resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.9.6: - resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} + /@rollup/rollup-android-arm64@4.28.1: + resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.9.6: - resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} + /@rollup/rollup-darwin-arm64@4.28.1: + resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.28.1: + resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-freebsd-arm64@4.28.1: + resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-freebsd-x64@4.28.1: + resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.28.1: + resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.28.1: + resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.28.1: + resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} cpu: [arm64] - os: [darwin] + os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.9.6: - resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} - cpu: [x64] - os: [darwin] + /@rollup/rollup-linux-arm64-musl@4.28.1: + resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} + cpu: [arm64] + os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.9.6: - resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} - cpu: [arm] + /@rollup/rollup-linux-loongarch64-gnu@4.28.1: + resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} + cpu: [loong64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.9.6: - resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} - cpu: [arm64] + /@rollup/rollup-linux-powerpc64le-gnu@4.28.1: + resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} + cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.9.6: - resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} - cpu: [arm64] + /@rollup/rollup-linux-riscv64-gnu@4.28.1: + resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} + cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.9.6: - resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} - cpu: [riscv64] + /@rollup/rollup-linux-s390x-gnu@4.28.1: + resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} + cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.9.6: - resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} + /@rollup/rollup-linux-x64-gnu@4.28.1: + resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.9.6: - resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} + /@rollup/rollup-linux-x64-musl@4.28.1: + resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.9.6: - resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} + /@rollup/rollup-win32-arm64-msvc@4.28.1: + resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.9.6: - resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} + /@rollup/rollup-win32-ia32-msvc@4.28.1: + resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.9.6: - resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} + /@rollup/rollup-win32-x64-msvc@4.28.1: + resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /@safe-global/safe-apps-provider@0.18.1(typescript@5.6.3): + /@safe-global/safe-apps-provider@0.18.1(typescript@5.7.2): resolution: {integrity: sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==} dependencies: - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.6.3) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.7.2) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -9298,11 +9543,11 @@ packages: - zod dev: false - /@safe-global/safe-apps-sdk@8.1.0(typescript@5.6.3): + /@safe-global/safe-apps-sdk@8.1.0(typescript@5.7.2): resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.9.0 - viem: 1.20.0(typescript@5.6.3) + viem: 1.20.0(typescript@5.7.2) transitivePeerDependencies: - bufferutil - encoding @@ -9319,6 +9564,9 @@ packages: - encoding dev: false + /@samchon/openapi@2.2.1: + resolution: {integrity: sha512-4UExzjnJvrtgrTikD9CJ+vI5bTVCZhFUrzpnZYgF/mUPREK4fJ8m+E0xtM8TC8B/CNWyo/8XvghXHSwRcbBDLw==} + /@scure/base@1.1.9: resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} dev: false @@ -9502,7 +9750,7 @@ packages: '@sinonjs/commons': 3.0.1 dev: false - /@skip-go/client@0.15.5(@solana/web3.js@1.93.2)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(starknet@6.11.0)(viem@2.16.2): + /@skip-go/client@0.15.5(@solana/web3.js@1.93.2)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(starknet@6.11.0)(viem@2.17.0): resolution: {integrity: sha512-BYTCO/SSYhXJjzChVwPge/U2TctxGd8g3JSN0HNbLVkUnj3g5bXvsOL+WB/bQQ0D/4K+1tVQVJs3r98HDxzCxw==} peerDependencies: '@solana/web3.js': ^1.95.8 @@ -9524,7 +9772,7 @@ packages: cosmjs-types: 0.9.0 create-hash: 1.2.0 keccak: 3.0.4 - viem: 2.16.2(typescript@5.6.3) + viem: 2.17.0(typescript@5.7.2) transitivePeerDependencies: - '@types/react' - bufferutil @@ -10210,14 +10458,14 @@ packages: '@svgr/babel-plugin-transform-svg-component': 7.0.0(@babel/core@7.23.9) dev: true - /@svgr/core@7.0.0(typescript@5.6.3): + /@svgr/core@7.0.0(typescript@5.7.2): resolution: {integrity: sha512-ztAoxkaKhRVloa3XydohgQQCb0/8x9T63yXovpmHzKMkHO6pkjdsIAWKOS4bE95P/2quVh1NtjSKlMRNzSBffw==} engines: {node: '>=14'} dependencies: '@babel/core': 7.23.9 '@svgr/babel-preset': 7.0.0(@babel/core@7.23.9) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.6.3) + cosmiconfig: 8.3.6(typescript@5.7.2) transitivePeerDependencies: - supports-color - typescript @@ -10443,15 +10691,15 @@ packages: resolution: {integrity: sha512-P5XgYoAw/vfW65byBbJQCw+cagdXDT/qH6wmABiLt4v4YBT2q2vqCOhihe+D1Nt325F/S/0Tkv6C5z0Lv+VBQQ==} dev: false - /@terra-money/station-connector@1.1.4(@cosmjs/amino@0.32.3)(axios@1.6.7): + /@terra-money/station-connector@1.1.4(@cosmjs/amino@0.32.4)(axios@1.7.7): resolution: {integrity: sha512-0xQ1haSJnY6ltjhptFoVa1yhNUIBsbCAEQCUukSY93GSo6tt+DN4RAku9i1ulfY/UizXnxH/mn+6aJyTCZGGcg==} engines: {node: '>=16'} peerDependencies: '@cosmjs/amino': ^0.31.0 axios: ^0.27.2 dependencies: - '@cosmjs/amino': 0.32.3 - axios: 1.6.7 + '@cosmjs/amino': 0.32.4 + axios: 1.7.7 bech32: 2.0.0 dev: false @@ -10477,7 +10725,7 @@ packages: '@babel/runtime': 7.24.7 '@testing-library/dom': 8.20.1 simmerjs: 0.5.6 - webdriverio: 8.36.1(typescript@5.6.3) + webdriverio: 8.36.1(typescript@5.7.2) dev: true /@tootallnate/quickjs-emscripten@0.23.0: @@ -10505,6 +10753,14 @@ packages: - supports-color dev: true + /@ts-morph/common@0.25.0: + resolution: {integrity: sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==} + dependencies: + minimatch: 9.0.4 + path-browserify: 1.0.1 + tinyglobby: 0.2.10 + dev: true + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} @@ -10520,7 +10776,7 @@ packages: /@types/acorn@4.0.6: resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 dev: true /@types/aria-query@5.0.4: @@ -10657,28 +10913,28 @@ packages: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: '@types/eslint': 8.56.10 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 dev: true /@types/eslint@8.56.10: resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 dev: true /@types/estree-jsx@1.0.0: resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 dev: true /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + /@types/estree@1.0.6: + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} dev: true /@types/ethereumjs-util@5.2.0: @@ -10923,7 +11179,7 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.6.3): + /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.7.2): resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -10935,24 +11191,24 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.7.2) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.7.2) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.6.3) - typescript: 5.6.3 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.3): + /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.7.2): resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -10964,11 +11220,11 @@ packages: dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.2) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 - typescript: 5.6.3 + typescript: 5.7.2 transitivePeerDependencies: - supports-color dev: true @@ -10981,7 +11237,7 @@ packages: '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.6.3): + /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.7.2): resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -10991,12 +11247,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.7.2) debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.6.3) - typescript: 5.6.3 + ts-api-utils: 1.3.0(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color dev: true @@ -11006,7 +11262,7 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.6.3): + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.7.2): resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -11021,14 +11277,14 @@ packages: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.6.3) - typescript: 5.6.3 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.6.3): + /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.7.2): resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -11039,9 +11295,9 @@ packages: '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.2) eslint: 8.57.0 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -11195,7 +11451,7 @@ packages: - fp-ts dev: false - /@usecapsule/cosmjs-v0-integration@1.10.0(@cosmjs/amino@0.31.3)(@cosmjs/encoding@0.32.3)(@cosmjs/proto-signing@0.32.3)(fp-ts@2.16.8): + /@usecapsule/cosmjs-v0-integration@1.10.0(@cosmjs/amino@0.31.3)(@cosmjs/encoding@0.32.4)(@cosmjs/proto-signing@0.32.4)(fp-ts@2.16.8): resolution: {integrity: sha512-T/BXzJ61oAjDu5rs16FxdepUvTZ8e+Af3risRJR2kbdRzSqVAUPXRhfCS4DqdrVAP3bN8UtVzFopQFkHm1kVwQ==} peerDependencies: '@cosmjs/amino': '>= 0.31.3 < 1' @@ -11203,8 +11459,8 @@ packages: '@cosmjs/proto-signing': '>= 0.31.3 < 1' dependencies: '@cosmjs/amino': 0.31.3 - '@cosmjs/encoding': 0.32.3 - '@cosmjs/proto-signing': 0.32.3 + '@cosmjs/encoding': 0.32.4 + '@cosmjs/proto-signing': 0.32.4 '@usecapsule/core-sdk': 1.10.0(fp-ts@2.16.8) transitivePeerDependencies: - debug @@ -11248,7 +11504,7 @@ packages: deepmerge: 4.3.1 media-query-parser: 2.0.2 modern-ahocorasick: 1.0.1 - picocolors: 1.0.1 + picocolors: 1.1.1 transitivePeerDependencies: - babel-plugin-macros dev: false @@ -11616,14 +11872,14 @@ packages: dependencies: '@vitest/utils': 1.4.0 p-limit: 5.0.0 - pathe: 1.1.1 + pathe: 1.1.2 dev: true /@vitest/snapshot@1.4.0: resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} dependencies: - magic-string: 0.30.8 - pathe: 1.1.1 + magic-string: 0.30.14 + pathe: 1.1.2 pretty-format: 29.7.0 dev: true @@ -11642,7 +11898,7 @@ packages: pretty-format: 29.7.0 dev: true - /@wagmi/connectors@5.0.21(@types/react@18.3.3)(@wagmi/core@2.11.6)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1)(typescript@5.6.3)(viem@2.16.2): + /@wagmi/connectors@5.0.21(@types/react@18.3.3)(@wagmi/core@2.11.6)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1)(typescript@5.7.2)(viem@2.17.0): resolution: {integrity: sha512-lbjXEv6HhOa9nXZ5r6NGFJdaadCt2Yj9hSWHjKuiTobrE6dEGQqG16mCQS17yXcvXpI62Q/sW6SL347JrBju/Q==} peerDependencies: '@wagmi/core': 2.11.6 @@ -11654,14 +11910,14 @@ packages: dependencies: '@coinbase/wallet-sdk': 4.0.4 '@metamask/sdk': 0.26.4(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1) - '@safe-global/safe-apps-provider': 0.18.1(typescript@5.6.3) - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.6.3) - '@wagmi/core': 2.11.6(@types/react@18.3.3)(react@18.2.0)(typescript@5.6.3)(viem@2.16.2) + '@safe-global/safe-apps-provider': 0.18.1(typescript@5.7.2) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.7.2) + '@wagmi/core': 2.11.6(@types/react@18.3.3)(immer@10.1.1)(react@18.2.0)(typescript@5.7.2)(viem@2.17.0) '@walletconnect/ethereum-provider': 2.13.0(@types/react@18.3.3)(react@18.2.0) '@walletconnect/modal': 2.6.2(@types/react@18.3.3)(react@18.2.0) cbw-sdk: /@coinbase/wallet-sdk@3.9.3 - typescript: 5.6.3 - viem: 2.16.2(typescript@5.6.3) + typescript: 5.7.2 + viem: 2.17.0(typescript@5.7.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11687,7 +11943,7 @@ packages: - zod dev: false - /@wagmi/core@2.11.6(@types/react@18.3.3)(react@18.2.0)(typescript@5.6.3)(viem@2.16.2): + /@wagmi/core@2.11.6(@types/react@18.3.3)(immer@10.1.1)(react@18.2.0)(typescript@5.7.2)(viem@2.17.0): resolution: {integrity: sha512-Ohk7Bh+Q8kjzxEHImIq98CnPduz8n1a5bdwJi6F7zU3h62crhlVq7fZBYoBhoDgmX0ROVOMr8WW3XU3XhRwUOw==} peerDependencies: '@tanstack/query-core': '>=5.0.0' @@ -11700,10 +11956,10 @@ packages: optional: true dependencies: eventemitter3: 5.0.1 - mipd: 0.0.5(typescript@5.6.3) - typescript: 5.6.3 - viem: 2.16.2(typescript@5.6.3) - zustand: 4.4.1(@types/react@18.3.3)(react@18.2.0) + mipd: 0.0.5(typescript@5.7.2) + typescript: 5.7.2 + viem: 2.17.0(typescript@5.7.2) + zustand: 4.4.1(@types/react@18.3.3)(immer@10.1.1)(react@18.2.0) transitivePeerDependencies: - '@types/react' - bufferutil @@ -11713,7 +11969,7 @@ packages: - zod dev: false - /@wagmi/core@2.13.8(@types/react@18.3.3)(react@18.2.0)(typescript@5.6.3)(viem@2.16.2): + /@wagmi/core@2.13.8(@types/react@18.3.3)(immer@10.1.1)(react@18.2.0)(typescript@5.7.2)(viem@2.17.0): resolution: {integrity: sha512-bX84cpLq3WWQgGthJlSgcWPAOdLzrP/W0jnbz5XowkCUn6j/T77WyxN5pBb+HmLoJf3ei9tkX9zWhMpczTc3cA==} peerDependencies: '@tanstack/query-core': '>=5.0.0' @@ -11726,33 +11982,10 @@ packages: optional: true dependencies: eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.6.3) - typescript: 5.6.3 - viem: 2.16.2(typescript@5.6.3) - zustand: 4.4.1(@types/react@18.3.3)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - - react - dev: false - - /@wagmi/core@2.13.8(@types/react@18.3.3)(react@18.2.0)(typescript@5.6.3)(viem@2.17.0): - resolution: {integrity: sha512-bX84cpLq3WWQgGthJlSgcWPAOdLzrP/W0jnbz5XowkCUn6j/T77WyxN5pBb+HmLoJf3ei9tkX9zWhMpczTc3cA==} - peerDependencies: - '@tanstack/query-core': '>=5.0.0' - typescript: '>=5.0.4' - viem: 2.x - peerDependenciesMeta: - '@tanstack/query-core': - optional: true - typescript: - optional: true - dependencies: - eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.6.3) - typescript: 5.6.3 - viem: 2.17.0(typescript@5.6.3) - zustand: 4.4.1(@types/react@18.3.3)(react@18.2.0) + mipd: 0.0.7(typescript@5.7.2) + typescript: 5.7.2 + viem: 2.17.0(typescript@5.7.2) + zustand: 4.4.1(@types/react@18.3.3)(immer@10.1.1)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer @@ -12330,7 +12563,7 @@ packages: tslib: 1.14.1 dev: false - /@wdio/browserstack-service@8.33.1(@wdio/cli@8.33.1)(typescript@5.6.3): + /@wdio/browserstack-service@8.33.1(@wdio/cli@8.33.1)(typescript@5.7.2): resolution: {integrity: sha512-CcGZSp0xJXo0eHWM/LQBtTmV0Y9NsvJuVsj4tmAf5d/92GNHcF6fW22Udsp7or9g2tJyj6LmJI0lcaCOprliiw==} engines: {node: ^16.13 || >=18} peerDependencies: @@ -12339,7 +12572,7 @@ packages: '@percy/appium-app': 2.0.4 '@percy/selenium-webdriver': 2.0.5 '@types/gitconfiglocal': 2.0.3 - '@wdio/cli': 8.33.1(typescript@5.6.3) + '@wdio/cli': 8.33.1(typescript@5.7.2) '@wdio/logger': 8.28.0 '@wdio/reporter': 8.32.4 '@wdio/types': 8.32.4 @@ -12351,7 +12584,7 @@ packages: gitconfiglocal: 2.1.0 got: 12.6.1 uuid: 9.0.1 - webdriverio: 8.33.1(typescript@5.6.3) + webdriverio: 8.33.1(typescript@5.7.2) winston-transport: 4.7.0 yauzl: 3.1.2 transitivePeerDependencies: @@ -12363,7 +12596,7 @@ packages: - utf-8-validate dev: true - /@wdio/cli@8.33.1(typescript@5.6.3): + /@wdio/cli@8.33.1(typescript@5.7.2): resolution: {integrity: sha512-Ngt5R6YAmErkSKnWLWt1JilLIKDPIB0P93bzQhb9bQhmg1arFBcl75uiwe6kf6T355vzcNslMaEJyeuqGChmCg==} engines: {node: ^16.13 || >=18} hasBin: true @@ -12371,7 +12604,7 @@ packages: '@types/node': 20.12.13 '@vitest/snapshot': 1.4.0 '@wdio/config': 8.33.1 - '@wdio/globals': 8.33.1(typescript@5.6.3) + '@wdio/globals': 8.33.1(typescript@5.7.2) '@wdio/logger': 8.28.0 '@wdio/protocols': 8.32.0 '@wdio/types': 8.32.4 @@ -12390,7 +12623,7 @@ packages: lodash.union: 4.6.0 read-pkg-up: 10.0.0 recursive-readdir: 2.2.3 - webdriverio: 8.33.1(typescript@5.6.3) + webdriverio: 8.33.1(typescript@5.7.2) yargs: 17.7.2 transitivePeerDependencies: - bufferutil @@ -12432,12 +12665,12 @@ packages: - supports-color dev: true - /@wdio/globals@8.33.1(typescript@5.6.3): + /@wdio/globals@8.33.1(typescript@5.7.2): resolution: {integrity: sha512-1ud9oq7n9MMNywS/FoMRRWqW6uhcoxgnpXoGeLE2Tr+4f937ABOl+sfZgjycXujyvR7yTL8AROOYajp1Yuv1Xg==} engines: {node: ^16.13 || >=18} optionalDependencies: - expect-webdriverio: 4.13.0(typescript@5.6.3) - webdriverio: 8.33.1(typescript@5.6.3) + expect-webdriverio: 4.13.0(typescript@5.7.2) + webdriverio: 8.33.1(typescript@5.7.2) transitivePeerDependencies: - bufferutil - devtools @@ -12447,14 +12680,14 @@ packages: - utf-8-validate dev: true - /@wdio/local-runner@8.33.1(typescript@5.6.3): + /@wdio/local-runner@8.33.1(typescript@5.7.2): resolution: {integrity: sha512-eQp12wHIkyh5zl9fun1qjv5Qvf4mCHPgLs5sKbfo3OK4LadzmD4/QNvDG8DYq/9cyuhVvnHgbLQ3XAnkoPde3w==} engines: {node: ^16.13 || >=18} dependencies: '@types/node': 20.12.13 '@wdio/logger': 8.28.0 '@wdio/repl': 8.24.12 - '@wdio/runner': 8.33.1(typescript@5.6.3) + '@wdio/runner': 8.33.1(typescript@5.7.2) '@wdio/types': 8.32.4 async-exit-hook: 2.0.1 split2: 4.2.0 @@ -12514,21 +12747,21 @@ packages: object-inspect: 1.13.1 dev: true - /@wdio/runner@8.33.1(typescript@5.6.3): + /@wdio/runner@8.33.1(typescript@5.7.2): resolution: {integrity: sha512-i0eRwMCePKkQocWsdkPQpBb1jELyNR5JCwnmOgM3g9fQI6KAf5D4oEUkNDFL/vD4UtgbSRmux7b7j5G01VvuqQ==} engines: {node: ^16.13 || >=18} dependencies: '@types/node': 20.12.13 '@wdio/config': 8.33.1 - '@wdio/globals': 8.33.1(typescript@5.6.3) + '@wdio/globals': 8.33.1(typescript@5.7.2) '@wdio/logger': 8.28.0 '@wdio/types': 8.32.4 '@wdio/utils': 8.33.1 deepmerge-ts: 5.1.0 - expect-webdriverio: 4.13.0(typescript@5.6.3) + expect-webdriverio: 4.13.0(typescript@5.7.2) gaze: 1.1.3 webdriver: 8.33.1 - webdriverio: 8.33.1(typescript@5.6.3) + webdriverio: 8.33.1(typescript@5.7.2) transitivePeerDependencies: - bufferutil - devtools @@ -12870,7 +13103,7 @@ packages: yargs: 17.7.2 dev: false - /abitype@0.10.3(typescript@5.6.3): + /abitype@0.10.3(typescript@5.7.2): resolution: {integrity: sha512-tRN+7XIa7J9xugdbRzFv/95ka5ivR/sRe01eiWvM0HWWjHuigSZEACgKa0sj4wGuekTDtghCx+5Izk/cOi78pQ==} peerDependencies: typescript: '>=5.0.4' @@ -12881,10 +13114,10 @@ packages: zod: optional: true dependencies: - typescript: 5.6.3 + typescript: 5.7.2 dev: false - /abitype@0.9.8(typescript@5.6.3): + /abitype@0.9.8(typescript@5.7.2): resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} peerDependencies: typescript: '>=5.0.4' @@ -12895,24 +13128,10 @@ packages: zod: optional: true dependencies: - typescript: 5.6.3 - dev: false - - /abitype@1.0.4(typescript@5.6.3): - resolution: {integrity: sha512-UivtYZOGJGE8rsrM/N5vdRkUpqEZVmuTumfTuolm7m/6O09wprd958rx8kUBwVAAAhQDveGAgD0GJdBuR8s6tw==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - dependencies: - typescript: 5.6.3 + typescript: 5.7.2 dev: false - /abitype@1.0.5(typescript@5.6.3): + /abitype@1.0.5(typescript@5.7.2): resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} peerDependencies: typescript: '>=5.0.4' @@ -12923,7 +13142,7 @@ packages: zod: optional: true dependencies: - typescript: 5.6.3 + typescript: 5.7.2 dev: false /abort-controller@3.0.0: @@ -12943,31 +13162,31 @@ packages: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-import-assertions@1.9.0(acorn@8.11.3): + /acorn-import-assertions@1.9.0(acorn@8.14.0): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} deprecated: package has been renamed to acorn-import-attributes peerDependencies: acorn: ^8 dependencies: - acorn: 8.11.3 + acorn: 8.14.0 dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): + /acorn-jsx@5.3.2(acorn@8.14.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.3 + acorn: 8.14.0 dev: true /acorn-walk@8.3.3: resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} dependencies: - acorn: 8.11.3 + acorn: 8.14.0 - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + /acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -13240,6 +13459,9 @@ packages: is-string: 1.0.7 dev: true + /array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -13457,15 +13679,6 @@ packages: - debug dev: false - /axios@1.6.7: - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} - dependencies: - follow-redirects: 1.15.3(debug@4.3.4) - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - /axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} dependencies: @@ -13474,7 +13687,6 @@ packages: proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: false /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} @@ -14025,7 +14237,7 @@ packages: /builtins@5.1.0: resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} dependencies: - semver: 7.6.2 + semver: 7.6.3 dev: true /bundle-name@3.0.0: @@ -14223,7 +14435,6 @@ packages: /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true /charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} @@ -14340,7 +14551,6 @@ packages: /cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} - dev: true /cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} @@ -14430,6 +14640,10 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true + /code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + dev: true + /collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} dev: true @@ -14492,6 +14706,10 @@ packages: resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==} dev: false + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + /commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -14513,6 +14731,20 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + /comment-json@4.2.5: + resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} + engines: {node: '>= 6'} + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 + has-own-prop: 2.0.0 + repeat-string: 1.6.1 + + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -14560,6 +14792,9 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + /confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} dev: true @@ -14579,7 +14814,6 @@ packages: /consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} - dev: false /console-browserify@1.2.0: resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} @@ -14674,7 +14908,7 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} requiresBuild: true - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.12.13)(cosmiconfig@8.3.6)(typescript@5.6.3): + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.12.13)(cosmiconfig@8.3.6)(typescript@5.7.2): resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} peerDependencies: @@ -14683,9 +14917,9 @@ packages: typescript: '>=4' dependencies: '@types/node': 20.12.13 - cosmiconfig: 8.3.6(typescript@5.6.3) + cosmiconfig: 8.3.6(typescript@5.7.2) jiti: 1.21.0 - typescript: 5.6.3 + typescript: 5.7.2 dev: true /cosmiconfig@5.2.1: @@ -14708,7 +14942,7 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /cosmiconfig@8.3.6(typescript@5.6.3): + /cosmiconfig@8.3.6(typescript@5.7.2): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} peerDependencies: @@ -14721,7 +14955,7 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.6.3 + typescript: 5.7.2 dev: true /cosmjs-types@0.7.2: @@ -15282,9 +15516,8 @@ packages: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - /defu@6.1.3: - resolution: {integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==} - dev: false + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} /degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} @@ -15390,6 +15623,10 @@ packages: /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + /diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + dev: true + /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -15497,6 +15734,10 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} + /drange@1.1.1: + resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==} + engines: {node: '>=4'} + /duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: @@ -15927,6 +16168,38 @@ packages: '@esbuild/win32-x64': 0.19.12 dev: true + /esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 + dev: true + /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -15972,7 +16245,7 @@ packages: eslint: '>=6.0.0' dependencies: eslint: 8.57.0 - semver: 7.6.2 + semver: 7.6.3 dev: true /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0): @@ -15998,8 +16271,8 @@ packages: eslint: ^7.32.0 || ^8.2.0 eslint-plugin-import: ^2.25.3 dependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) @@ -16034,7 +16307,7 @@ packages: eslint: 8.57.0 dev: true - /eslint-config-standard-with-typescript@43.0.1(@typescript-eslint/eslint-plugin@6.21.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.2.0)(eslint@8.57.0)(typescript@5.6.3): + /eslint-config-standard-with-typescript@43.0.1(@typescript-eslint/eslint-plugin@6.21.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.2.0)(eslint@8.57.0)(typescript@5.7.2): resolution: {integrity: sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==} deprecated: Please use eslint-config-love, instead. peerDependencies: @@ -16045,14 +16318,14 @@ packages: eslint-plugin-promise: ^6.0.0 typescript: '*' dependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.2.0)(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-n: 16.6.2(eslint@8.57.0) eslint-plugin-promise: 6.2.0(eslint@8.57.0) - typescript: 5.6.3 + typescript: 5.7.2 transitivePeerDependencies: - supports-color dev: true @@ -16126,7 +16399,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.7.2) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -16157,7 +16430,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.7.2) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -16224,7 +16497,7 @@ packages: is-core-module: 2.13.1 minimatch: 3.1.2 resolve: 1.22.8 - semver: 7.6.2 + semver: 7.6.3 dev: true /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): @@ -16317,6 +16590,7 @@ packages: /eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -16375,8 +16649,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 dev: true @@ -16413,7 +16687,7 @@ packages: /estree-util-attach-comments@3.0.0: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 dev: true /estree-util-build-jsx@3.0.1: @@ -16455,7 +16729,7 @@ packages: /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 dev: true /esutils@2.0.3: @@ -16762,7 +17036,7 @@ packages: strip-final-newline: 3.0.0 dev: true - /expect-webdriverio@4.13.0(typescript@5.6.3): + /expect-webdriverio@4.13.0(typescript@5.7.2): resolution: {integrity: sha512-y2LF6vECifTOiOk0i0FMPWJGyntiW+eqzQWFZimu9Cae8XMUH5q4F5SzpfGCxsvmOdf3uFjlr+u9IXrQBN5o0Q==} engines: {node: '>=16 || >=18 || >=20'} dependencies: @@ -16771,9 +17045,9 @@ packages: jest-matcher-utils: 29.7.0 lodash.isequal: 4.5.0 optionalDependencies: - '@wdio/globals': 8.33.1(typescript@5.6.3) + '@wdio/globals': 8.33.1(typescript@5.7.2) '@wdio/logger': 8.28.0 - webdriverio: 8.36.1(typescript@5.6.3) + webdriverio: 8.36.1(typescript@5.7.2) transitivePeerDependencies: - bufferutil - devtools @@ -16832,7 +17106,6 @@ packages: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true /extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} @@ -16932,6 +17205,17 @@ packages: pend: 1.2.0 dev: true + /fdir@6.4.2(picomatch@4.0.2): + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + dependencies: + picomatch: 4.0.2 + dev: true + /fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} dev: true @@ -16960,7 +17244,6 @@ packages: engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 - dev: true /figures@5.0.0: resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} @@ -17044,6 +17327,14 @@ packages: pkg-dir: 4.2.0 dev: true + /find-cache-dir@5.0.0: + resolution: {integrity: sha512-OuWNfjfP05JcpAP3JPgAKUhWefjMRfI5iAoSsvE24ANYWJaepAtlSgWECSVEuRgSXpyNEc9DJwG/TZpgcOqyig==} + engines: {node: '>=16'} + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + dev: true + /find-up@2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} @@ -17483,6 +17774,15 @@ packages: ini: 4.1.1 dev: true + /global-prefix@4.0.0: + resolution: {integrity: sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==} + engines: {node: '>=16'} + dependencies: + ini: 4.1.3 + kind-of: 6.0.3 + which: 4.0.0 + dev: true + /global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} dependencies: @@ -17597,7 +17897,7 @@ packages: resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - /graz@0.1.19(@cosmjs/amino@0.32.3)(@cosmjs/cosmwasm-stargate@0.32.4)(@cosmjs/launchpad@0.27.1)(@cosmjs/proto-signing@0.32.3)(@cosmjs/stargate@0.32.3)(@cosmjs/tendermint-rpc@0.32.3)(@leapwallet/cosmos-social-login-capsule-provider@0.0.39)(@types/react@18.3.3)(axios@1.6.7)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(starknet@6.11.0): + /graz@0.1.19(@cosmjs/amino@0.32.4)(@cosmjs/cosmwasm-stargate@0.32.4)(@cosmjs/launchpad@0.27.1)(@cosmjs/proto-signing@0.32.4)(@cosmjs/stargate@0.32.4)(@cosmjs/tendermint-rpc@0.32.4)(@leapwallet/cosmos-social-login-capsule-provider@0.0.39)(@types/react@18.3.3)(axios@1.7.7)(immer@10.1.1)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(starknet@6.11.0): resolution: {integrity: sha512-KaRQJ7HTQp3vbX/bG2Oc9T3t/KyaIuU5dLoGU2QNFirNjIpRbhkBtCll9Li5A6+zw3O9bHkbZ1aUaKfuVyBS8w==} hasBin: true peerDependencies: @@ -17610,20 +17910,20 @@ packages: '@leapwallet/cosmos-social-login-capsule-provider': ^0.0.39 react: '>=17' dependencies: - '@cosmjs/amino': 0.32.3 + '@cosmjs/amino': 0.32.4 '@cosmjs/cosmwasm-stargate': 0.32.4 '@cosmjs/launchpad': 0.27.1 - '@cosmjs/proto-signing': 0.32.3 - '@cosmjs/stargate': 0.32.3 - '@cosmjs/tendermint-rpc': 0.32.3 + '@cosmjs/proto-signing': 0.32.4 + '@cosmjs/stargate': 0.32.4 + '@cosmjs/tendermint-rpc': 0.32.4 '@cosmsnap/snapper': 0.1.31 - '@dao-dao/cosmiframe': 0.1.0(@cosmjs/amino@0.32.3)(@cosmjs/proto-signing@0.32.3) + '@dao-dao/cosmiframe': 0.1.0(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4) '@keplr-wallet/cosmos': 0.12.121 '@keplr-wallet/types': 0.12.162(starknet@6.11.0) - '@leapwallet/cosmos-social-login-capsule-provider': 0.0.39(@cosmjs/encoding@0.32.3)(@cosmjs/proto-signing@0.32.3)(fp-ts@2.16.8) + '@leapwallet/cosmos-social-login-capsule-provider': 0.0.39(@cosmjs/encoding@0.32.4)(@cosmjs/proto-signing@0.32.4)(fp-ts@2.16.8) '@metamask/providers': 12.0.0 '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0) - '@terra-money/station-connector': 1.1.4(@cosmjs/amino@0.32.3)(axios@1.6.7) + '@terra-money/station-connector': 1.1.4(@cosmjs/amino@0.32.4)(axios@1.7.7) '@vectis/extension-client': 0.7.2 '@walletconnect/sign-client': 2.13.3(encoding@0.1.13) '@walletconnect/types': 2.13.3 @@ -17632,7 +17932,7 @@ packages: cosmos-directory-client: 0.0.6 long: 4.0.0 react: 18.2.0 - zustand: 4.5.4(@types/react@18.3.3)(react@18.2.0) + zustand: 4.5.4(@types/react@18.3.3)(immer@10.1.1)(react@18.2.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17662,11 +17962,11 @@ packages: resolution: {integrity: sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA==} dependencies: cookie-es: 1.0.0 - defu: 6.1.3 + defu: 6.1.4 destr: 2.0.3 iron-webcrypto: 1.0.0 radix3: 1.1.0 - ufo: 1.5.3 + ufo: 1.5.4 uncrypto: 0.1.3 unenv: 1.8.0 dev: false @@ -17690,10 +17990,10 @@ packages: hardhat: ^2.0.0 dependencies: chokidar: 3.5.3 - hardhat: 2.22.13(ts-node@10.9.2)(typescript@5.6.3) + hardhat: 2.22.13(ts-node@10.9.2)(typescript@5.7.2) dev: false - /hardhat@2.22.13(ts-node@10.9.2)(typescript@5.6.3): + /hardhat@2.22.13(ts-node@10.9.2)(typescript@5.7.2): resolution: {integrity: sha512-psVJX4FSXDpSXwsU8OcKTJN04pQEj9cFBMX5OPko+OFwbIoiOpvRmafa954/UaA1934npTj8sV3gaTSdx9bPbA==} hasBin: true peerDependencies: @@ -17745,9 +18045,9 @@ packages: solc: 0.8.26(debug@4.3.4) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.2(@types/node@20.12.13)(typescript@5.6.3) + ts-node: 10.9.2(@types/node@20.12.13)(typescript@5.7.2) tsort: 0.0.1 - typescript: 5.6.3 + typescript: 5.7.2 undici: 5.28.4 uuid: 8.3.2 ws: 7.5.9 @@ -17770,6 +18070,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + /has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + /has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: @@ -17891,7 +18195,7 @@ packages: /hast-util-to-estree@3.1.0: resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.0 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -17914,7 +18218,7 @@ packages: /hast-util-to-jsx-runtime@2.3.0: resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/hast': 3.0.4 '@types/unist': 3.0.2 comma-separated-tokens: 2.0.3 @@ -18274,6 +18578,11 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true + /ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: true @@ -18301,7 +18610,6 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0 - dev: true /inquirer@9.2.12: resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} @@ -18848,7 +19156,7 @@ packages: /is-reference@3.0.1: resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 dev: true /is-regex@1.1.4: @@ -19491,9 +19799,6 @@ packages: engines: {node: '>=6'} hasBin: true - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: @@ -19735,16 +20040,16 @@ packages: citty: 0.1.5 clipboardy: 3.0.0 consola: 3.2.3 - defu: 6.1.3 + defu: 6.1.4 get-port-please: 3.1.1 h3: 1.9.0 http-shutdown: 1.2.2 jiti: 1.21.0 - mlly: 1.4.2 + mlly: 1.7.3 node-forge: 1.3.1 - pathe: 1.1.1 + pathe: 1.1.2 std-env: 3.6.0 - ufo: 1.5.3 + ufo: 1.5.4 untun: 0.1.3 uqr: 0.1.2 dev: false @@ -19788,8 +20093,8 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} dependencies: - mlly: 1.4.2 - pkg-types: 1.0.3 + mlly: 1.7.3 + pkg-types: 1.2.1 dev: true /locate-app@2.4.15: @@ -20056,11 +20361,10 @@ packages: hasBin: true dev: true - /magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} + /magic-string@0.30.14: + resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 dev: true /make-dir@2.1.0: @@ -20695,7 +20999,7 @@ packages: /micromark-extension-mdx-expression@3.0.0: resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.1 micromark-factory-space: 2.0.0 @@ -20709,7 +21013,7 @@ packages: resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.1 @@ -20729,7 +21033,7 @@ packages: /micromark-extension-mdxjs-esm@3.0.0: resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 devlop: 1.1.0 micromark-core-commonmark: 2.0.0 micromark-util-character: 2.1.0 @@ -20743,8 +21047,8 @@ packages: /micromark-extension-mdxjs@3.0.0: resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) micromark-extension-mdx-expression: 3.0.0 micromark-extension-mdx-jsx: 3.0.0 micromark-extension-mdx-md: 2.0.0 @@ -20773,7 +21077,7 @@ packages: /micromark-factory-mdx-expression@2.0.1: resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 devlop: 1.1.0 micromark-util-character: 2.1.0 micromark-util-events-to-acorn: 2.0.2 @@ -20859,7 +21163,7 @@ packages: resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/unist': 3.0.2 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -21069,7 +21373,7 @@ packages: resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} engines: {node: '>=16 || 14 >=14.17'} - /mipd@0.0.5(typescript@5.6.3): + /mipd@0.0.5(typescript@5.7.2): resolution: {integrity: sha512-gbKA784D2WKb5H/GtqEv+Ofd1S9Zj+Z/PGDIl1u1QAbswkxD28BQ5bSXQxkeBzPBABg1iDSbiwGG1XqlOxRspA==} peerDependencies: typescript: '>=5.0.4' @@ -21077,15 +21381,15 @@ packages: typescript: optional: true dependencies: - typescript: 5.6.3 - viem: 1.20.0(typescript@5.6.3) + typescript: 5.7.2 + viem: 1.20.0(typescript@5.7.2) transitivePeerDependencies: - bufferutil - utf-8-validate - zod dev: false - /mipd@0.0.7(typescript@5.6.3): + /mipd@0.0.7(typescript@5.7.2): resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} peerDependencies: typescript: '>=5.0.4' @@ -21093,7 +21397,7 @@ packages: typescript: optional: true dependencies: - typescript: 5.6.3 + typescript: 5.7.2 dev: false /mitt@2.1.0: @@ -21122,13 +21426,13 @@ packages: hasBin: true dev: false - /mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + /mlly@1.7.3: + resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} dependencies: - acorn: 8.11.3 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.5.3 + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 /mnemonist@0.38.5: resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} @@ -21208,7 +21512,7 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /msw@2.1.7(typescript@5.6.3): + /msw@2.1.7(typescript@5.7.2): resolution: {integrity: sha512-yTIYqEMqDSrdbVMrfmqP6rTKQsnIbglTvVmAHDWwNegyXPXRcV+RjsaFEqubRS266gwWCDLm9YdOkWSKLdDvJQ==} engines: {node: '>=18'} hasBin: true @@ -21235,8 +21539,8 @@ packages: outvariant: 1.4.2 path-to-regexp: 6.2.1 strict-event-emitter: 0.5.1 - type-fest: 4.10.2 - typescript: 5.6.3 + type-fest: 4.30.0 + typescript: 5.7.2 yargs: 17.7.2 dev: true @@ -21275,7 +21579,6 @@ packages: /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true /mute-stream@1.0.0: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} @@ -21494,7 +21797,7 @@ packages: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 - semver: 7.6.2 + semver: 7.6.3 validate-npm-package-license: 3.0.4 dev: true @@ -21504,7 +21807,7 @@ packages: dependencies: hosted-git-info: 7.0.1 is-core-module: 2.13.1 - semver: 7.6.2 + semver: 7.6.3 validate-npm-package-license: 3.0.4 dev: true @@ -21660,7 +21963,7 @@ packages: dependencies: destr: 2.0.3 node-fetch-native: 1.6.4 - ufo: 1.5.3 + ufo: 1.5.4 dev: false /on-exit-leak-free@0.2.0: @@ -21925,6 +22228,9 @@ packages: netmask: 2.0.2 dev: true + /package-manager-detector@0.2.7: + resolution: {integrity: sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ==} + /pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} dev: true @@ -22068,8 +22374,8 @@ packages: engines: {node: '>=12'} dev: true - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -22109,18 +22415,23 @@ packages: /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-walker: 3.0.3 is-reference: 3.0.1 dev: true - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + dev: true + /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -22220,12 +22531,19 @@ packages: find-up: 5.0.0 dev: true - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + /pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + dependencies: + find-up: 6.3.0 + dev: true + + /pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 + confbox: 0.1.8 + mlly: 1.7.3 + pathe: 1.1.2 /pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} @@ -22247,27 +22565,27 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - /postcss-import@15.1.0(postcss@8.4.39): + /postcss-import@15.1.0(postcss@8.4.49): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.39 + postcss: 8.4.49 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - /postcss-js@4.0.1(postcss@8.4.39): + /postcss-js@4.0.1(postcss@8.4.49): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.39 + postcss: 8.4.49 - /postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2): + /postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: @@ -22280,17 +22598,17 @@ packages: optional: true dependencies: lilconfig: 3.1.2 - postcss: 8.4.39 - ts-node: 10.9.2(@types/node@20.12.13)(typescript@5.6.3) + postcss: 8.4.49 + ts-node: 10.9.2(@types/node@20.12.13)(typescript@5.7.2) yaml: 2.4.5 - /postcss-nested@6.2.0(postcss@8.4.39): + /postcss-nested@6.2.0(postcss@8.4.49): resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.39 + postcss: 8.4.49 postcss-selector-parser: 6.1.1 /postcss-selector-parser@6.1.1: @@ -22308,16 +22626,16 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.1 + source-map-js: 1.2.1 - /postcss@8.4.39: - resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} + /postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.1 + source-map-js: 1.2.1 /preact@10.17.0: resolution: {integrity: sha512-SNsI8cbaCcUS5tbv9nlXuCfIXnJ9ysBMWk0WnB6UWwcVA3qZ2O6FxqDFECMAMttvLQcW/HaNZUe2BLidyvrVYw==} @@ -22612,7 +22930,7 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - /puppeteer-core@20.9.0(typescript@5.6.3): + /puppeteer-core@20.9.0(typescript@5.7.2): resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==} engines: {node: '>=16.3.0'} requiresBuild: true @@ -22622,12 +22940,12 @@ packages: typescript: optional: true dependencies: - '@puppeteer/browsers': 1.4.6(typescript@5.6.3) + '@puppeteer/browsers': 1.4.6(typescript@5.7.2) chromium-bidi: 0.4.16(devtools-protocol@0.0.1147663) cross-fetch: 4.0.0(encoding@0.1.13) debug: 4.3.4(supports-color@5.5.0) devtools-protocol: 0.0.1147663 - typescript: 5.6.3 + typescript: 5.7.2 ws: 8.13.0 transitivePeerDependencies: - bufferutil @@ -22761,6 +23079,13 @@ packages: resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} dev: false + /randexp@0.5.3: + resolution: {integrity: sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==} + engines: {node: '>=4'} + dependencies: + drange: 1.1.1 + ret: 0.2.2 + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -23223,7 +23548,7 @@ packages: '@types/normalize-package-data': 2.4.1 normalize-package-data: 6.0.0 parse-json: 7.1.1 - type-fest: 4.10.2 + type-fest: 4.30.0 dev: true /readable-stream@1.0.34: @@ -23545,6 +23870,10 @@ packages: unified: 11.0.4 dev: true + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -23636,6 +23965,10 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 + /ret@0.2.2: + resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} + engines: {node: '>=4'} + /retimer@2.0.0: resolution: {integrity: sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg==} dev: true @@ -23746,26 +24079,32 @@ packages: fsevents: 2.3.3 dev: true - /rollup@4.9.6: - resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} + /rollup@4.28.1: + resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.9.6 - '@rollup/rollup-android-arm64': 4.9.6 - '@rollup/rollup-darwin-arm64': 4.9.6 - '@rollup/rollup-darwin-x64': 4.9.6 - '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 - '@rollup/rollup-linux-arm64-gnu': 4.9.6 - '@rollup/rollup-linux-arm64-musl': 4.9.6 - '@rollup/rollup-linux-riscv64-gnu': 4.9.6 - '@rollup/rollup-linux-x64-gnu': 4.9.6 - '@rollup/rollup-linux-x64-musl': 4.9.6 - '@rollup/rollup-win32-arm64-msvc': 4.9.6 - '@rollup/rollup-win32-ia32-msvc': 4.9.6 - '@rollup/rollup-win32-x64-msvc': 4.9.6 + '@rollup/rollup-android-arm-eabi': 4.28.1 + '@rollup/rollup-android-arm64': 4.28.1 + '@rollup/rollup-darwin-arm64': 4.28.1 + '@rollup/rollup-darwin-x64': 4.28.1 + '@rollup/rollup-freebsd-arm64': 4.28.1 + '@rollup/rollup-freebsd-x64': 4.28.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 + '@rollup/rollup-linux-arm-musleabihf': 4.28.1 + '@rollup/rollup-linux-arm64-gnu': 4.28.1 + '@rollup/rollup-linux-arm64-musl': 4.28.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 + '@rollup/rollup-linux-riscv64-gnu': 4.28.1 + '@rollup/rollup-linux-s390x-gnu': 4.28.1 + '@rollup/rollup-linux-x64-gnu': 4.28.1 + '@rollup/rollup-linux-x64-musl': 4.28.1 + '@rollup/rollup-win32-arm64-msvc': 4.28.1 + '@rollup/rollup-win32-ia32-msvc': 4.28.1 + '@rollup/rollup-win32-x64-msvc': 4.28.1 fsevents: 2.3.3 dev: true @@ -23800,7 +24139,6 @@ packages: /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} - dev: true /run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} @@ -23938,8 +24276,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - /semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true @@ -24253,8 +24591,8 @@ packages: atomic-sleep: 1.0.0 dev: false - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} /source-map-resolve@0.6.0: @@ -24774,12 +25112,12 @@ packages: micromatch: 4.0.5 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.1 - postcss: 8.4.39 - postcss-import: 15.1.0(postcss@8.4.39) - postcss-js: 4.0.1(postcss@8.4.39) - postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2) - postcss-nested: 6.2.0(postcss@8.4.39) + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-import: 15.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2) + postcss-nested: 6.2.0(postcss@8.4.49) postcss-selector-parser: 6.1.1 resolve: 1.22.8 sucrase: 3.35.0 @@ -24866,7 +25204,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -24970,6 +25308,14 @@ packages: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} dev: false + /tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.4.2(picomatch@4.0.2) + picomatch: 4.0.2 + dev: true + /tinypool@0.8.4: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} @@ -25055,13 +25401,13 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: true - /ts-api-utils@1.3.0(typescript@5.6.3): + /ts-api-utils@1.3.0(typescript@5.7.2): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.6.3 + typescript: 5.7.2 dev: true /ts-interface-checker@0.1.13: @@ -25078,7 +25424,14 @@ packages: resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} dev: false - /ts-node@10.9.2(@types/node@20.12.13)(typescript@5.6.3): + /ts-morph@24.0.0: + resolution: {integrity: sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==} + dependencies: + '@ts-morph/common': 0.25.0 + code-block-writer: 13.0.3 + dev: true + + /ts-node@10.9.2(@types/node@20.12.13)(typescript@5.7.2): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -25098,17 +25451,29 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.12.13 - acorn: 8.11.3 + acorn: 8.14.0 acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.3 + typescript: 5.7.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /tsconfck@3.0.1(typescript@5.6.3): + /ts-patch@3.3.0: + resolution: {integrity: sha512-zAOzDnd5qsfEnjd9IGy1IRuvA7ygyyxxdxesbhMdutt8AHFjD8Vw8hU2rMF89HX1BKRWFYqKHrO8Q6lw0NeUZg==} + hasBin: true + dependencies: + chalk: 4.1.2 + global-prefix: 4.0.0 + minimist: 1.2.8 + resolve: 1.22.8 + semver: 7.6.3 + strip-ansi: 6.0.1 + dev: true + + /tsconfck@3.0.1(typescript@5.7.2): resolution: {integrity: sha512-7ppiBlF3UEddCLeI1JRx5m2Ryq+xk4JrZuq4EuYXykipebaq1dV0Fhgr1hb7CkmHt32QSgOZlcqVLEtHBG4/mg==} engines: {node: ^18 || >=20} hasBin: true @@ -25118,7 +25483,7 @@ packages: typescript: optional: true dependencies: - typescript: 5.6.3 + typescript: 5.7.2 dev: true /tsconfig-paths@3.15.0: @@ -25247,8 +25612,8 @@ packages: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} - /type-fest@4.10.2: - resolution: {integrity: sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw==} + /type-fest@4.30.0: + resolution: {integrity: sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA==} engines: {node: '>=16'} dev: true @@ -25322,13 +25687,51 @@ packages: resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true + dev: true + + /typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + + /typia@7.1.0(@samchon/openapi@2.2.1)(typescript@5.6.3): + resolution: {integrity: sha512-pG3H1KNIo3/Cd0VssdE+badLYnLnAQ7QtdYldqzqzXIDWG+Ve5fl0H4vQ/j+d1+rOAuurxfZ5bsCcw83SiYDVw==} + hasBin: true + peerDependencies: + '@samchon/openapi': '>=2.0.1 <3.0.0' + typescript: '>=4.8.0 <5.8.0' + dependencies: + '@samchon/openapi': 2.2.1 + commander: 10.0.1 + comment-json: 4.2.5 + inquirer: 8.2.6 + package-manager-detector: 0.2.7 + randexp: 0.5.3 + typescript: 5.6.3 + dev: true + + /typia@7.1.0(@samchon/openapi@2.2.1)(typescript@5.7.2): + resolution: {integrity: sha512-pG3H1KNIo3/Cd0VssdE+badLYnLnAQ7QtdYldqzqzXIDWG+Ve5fl0H4vQ/j+d1+rOAuurxfZ5bsCcw83SiYDVw==} + hasBin: true + peerDependencies: + '@samchon/openapi': '>=2.0.1 <3.0.0' + typescript: '>=4.8.0 <5.8.0' + dependencies: + '@samchon/openapi': 2.2.1 + commander: 10.0.1 + comment-json: 4.2.5 + inquirer: 8.2.6 + package-manager-detector: 0.2.7 + randexp: 0.5.3 + typescript: 5.7.2 + dev: false /ua-parser-js@1.0.37: resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} dev: false - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + /ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} /uint8arrays@3.1.0: resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} @@ -25379,10 +25782,10 @@ packages: resolution: {integrity: sha512-uIGbdCWZfhRRmyKj1UioCepQ0jpq638j/Cf0xFTn4zD1nGJ2lSdzYHLzfdXN791oo/0juUiSWW1fBklXMTsuqg==} dependencies: consola: 3.2.3 - defu: 6.1.3 + defu: 6.1.4 mime: 3.0.0 node-fetch-native: 1.6.4 - pathe: 1.1.1 + pathe: 1.1.2 dev: false /unfetch@4.2.0: @@ -25516,6 +25919,14 @@ packages: engines: {node: '>= 0.8'} dev: false + /unplugin@1.16.0: + resolution: {integrity: sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==} + engines: {node: '>=14.0.0'} + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + dev: true + /unstorage@1.10.1(idb-keyval@6.2.1): resolution: {integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==} peerDependencies: @@ -25568,7 +25979,7 @@ packages: mri: 1.2.0 node-fetch-native: 1.6.4 ofetch: 1.3.4 - ufo: 1.5.3 + ufo: 1.5.4 transitivePeerDependencies: - supports-color dev: false @@ -25583,7 +25994,7 @@ packages: dependencies: citty: 0.1.5 consola: 3.2.3 - pathe: 1.1.1 + pathe: 1.1.2 dev: false /unzipper@0.11.6: @@ -25604,7 +26015,7 @@ packages: dependencies: browserslist: 4.23.0 escalade: 3.1.2 - picocolors: 1.0.1 + picocolors: 1.1.1 /uqr@0.1.2: resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} @@ -25842,7 +26253,7 @@ packages: vfile-message: 4.0.2 dev: true - /viem@1.20.0(typescript@5.6.3): + /viem@1.20.0(typescript@5.7.2): resolution: {integrity: sha512-yPjV9pJr10xi28C/9LEvs5zdZNEMiru3Kz7nufghVYABJAfeSkoZQXb6b23n7MscS7c55JO5nmUI3xKkd9g6Yg==} peerDependencies: typescript: '>=5.0.4' @@ -25855,9 +26266,9 @@ packages: '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 0.9.8(typescript@5.6.3) + abitype: 0.9.8(typescript@5.7.2) isows: 1.0.3(ws@8.13.0) - typescript: 5.6.3 + typescript: 5.7.2 ws: 8.13.0 transitivePeerDependencies: - bufferutil @@ -25865,30 +26276,7 @@ packages: - zod dev: false - /viem@2.16.2(typescript@5.6.3): - resolution: {integrity: sha512-qor3v1cJFR3jcPtcJxPbKfKURAH2agNf2IWZIaSReV6teNLERiu4Sr7kbqpkIeTAEpiDCVQwg336M+mub1m+pg==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 1.0.4(typescript@5.6.3) - isows: 1.0.4(ws@8.17.1) - typescript: 5.6.3 - ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - dev: false - - /viem@2.17.0(typescript@5.6.3): + /viem@2.17.0(typescript@5.7.2): resolution: {integrity: sha512-+gaVlsfDsHL1oYdjpatdRxW1WK/slLYVvpOws3fEdLfQFUToezKI6YLC9l1g2uKm4Hg3OdGX1KQy/G7/58tTKQ==} peerDependencies: typescript: '>=5.0.4' @@ -25901,9 +26289,9 @@ packages: '@noble/hashes': 1.4.0 '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 - abitype: 1.0.5(typescript@5.6.3) + abitype: 1.0.5(typescript@5.7.2) isows: 1.0.4(ws@8.17.1) - typescript: 5.6.3 + typescript: 5.7.2 ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -25918,8 +26306,8 @@ packages: dependencies: cac: 6.7.14 debug: 4.3.4(supports-color@5.5.0) - pathe: 1.1.1 - picocolors: 1.0.1 + pathe: 1.1.2 + picocolors: 1.1.1 vite: 5.0.12(@types/node@20.12.13) transitivePeerDependencies: - '@types/node' @@ -25954,13 +26342,13 @@ packages: vite: 4.3.9(@types/node@20.12.13) dev: true - /vite-plugin-svgr@3.2.0(rollup@2.79.1)(typescript@5.6.3)(vite@4.3.9): + /vite-plugin-svgr@3.2.0(rollup@2.79.1)(typescript@5.7.2)(vite@4.3.9): resolution: {integrity: sha512-Uvq6niTvhqJU6ga78qLKBFJSDvxWhOnyfQSoKpDPMAGxJPo5S3+9hyjExE5YDj6Lpa4uaLkGc1cBgxXov+LjSw==} peerDependencies: vite: ^2.6.0 || 3 || 4 dependencies: - '@rollup/pluginutils': 5.0.3(rollup@2.79.1) - '@svgr/core': 7.0.0(typescript@5.6.3) + '@rollup/pluginutils': 5.1.3(rollup@2.79.1) + '@svgr/core': 7.0.0(typescript@5.7.2) '@svgr/plugin-jsx': 7.0.0 vite: 4.3.9(@types/node@20.12.13) transitivePeerDependencies: @@ -25969,7 +26357,7 @@ packages: - typescript dev: true - /vite-tsconfig-paths@4.3.1(typescript@5.6.3)(vite@5.0.12): + /vite-tsconfig-paths@4.3.1(typescript@5.7.2)(vite@5.0.12): resolution: {integrity: sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==} peerDependencies: vite: '*' @@ -25979,7 +26367,7 @@ packages: dependencies: debug: 4.3.4(supports-color@5.5.0) globrex: 0.1.2 - tsconfck: 3.0.1(typescript@5.6.3) + tsconfck: 3.0.1(typescript@5.7.2) vite: 5.0.12(@types/node@20.12.13) transitivePeerDependencies: - supports-color @@ -26013,7 +26401,7 @@ packages: dependencies: '@types/node': 20.12.13 esbuild: 0.17.19 - postcss: 8.4.39 + postcss: 8.4.49 rollup: 3.28.0 optionalDependencies: fsevents: 2.3.3 @@ -26049,8 +26437,57 @@ packages: dependencies: '@types/node': 20.12.13 esbuild: 0.19.12 - postcss: 8.4.39 - rollup: 4.9.6 + postcss: 8.4.49 + rollup: 4.28.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vite@6.0.3(@types/node@20.12.13)(tsx@4.7.1): + resolution: {integrity: sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + '@types/node': 20.12.13 + esbuild: 0.24.0 + postcss: 8.4.49 + rollup: 4.28.1 + tsx: 4.7.1 optionalDependencies: fsevents: 2.3.3 dev: true @@ -26092,9 +26529,9 @@ packages: execa: 8.0.1 jsdom: 24.1.0 local-pkg: 0.5.0 - magic-string: 0.30.8 - pathe: 1.1.1 - picocolors: 1.0.1 + magic-string: 0.30.14 + pathe: 1.1.2 + picocolors: 1.1.1 std-env: 3.6.0 strip-literal: 2.1.0 tinybench: 2.9.0 @@ -26140,7 +26577,7 @@ packages: - supports-color dev: true - /wagmi@2.10.9(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1)(typescript@5.6.3)(viem@2.16.2): + /wagmi@2.10.9(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1)(typescript@5.7.2)(viem@2.17.0): resolution: {integrity: sha512-pYGTLmVIAC4q/a90i+vlrkJL86n5Kf/gwhhi65XtQklpsUQWrKDmn4dsY1/yFeAmZ/1yx1mpxYpX3LI97eTuWA==} peerDependencies: '@tanstack/react-query': '>=5.0.0' @@ -26152,12 +26589,12 @@ packages: optional: true dependencies: '@tanstack/react-query': 5.37.1(react@18.2.0) - '@wagmi/connectors': 5.0.21(@types/react@18.3.3)(@wagmi/core@2.11.6)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1)(typescript@5.6.3)(viem@2.16.2) - '@wagmi/core': 2.11.6(@types/react@18.3.3)(react@18.2.0)(typescript@5.6.3)(viem@2.16.2) + '@wagmi/connectors': 5.0.21(@types/react@18.3.3)(@wagmi/core@2.11.6)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(rollup@2.79.1)(typescript@5.7.2)(viem@2.17.0) + '@wagmi/core': 2.11.6(@types/react@18.3.3)(immer@10.1.1)(react@18.2.0)(typescript@5.7.2)(viem@2.17.0) react: 18.2.0 - typescript: 5.6.3 + typescript: 5.7.2 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 2.16.2(typescript@5.6.3) + viem: 2.17.0(typescript@5.7.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -26481,7 +26918,7 @@ packages: - utf-8-validate dev: true - /webdriverio@8.33.1(typescript@5.6.3): + /webdriverio@8.33.1(typescript@5.7.2): resolution: {integrity: sha512-1DsF8sx1a46AoVYCUpEwJYU74iBAW/U2H5r6p+60ct7dIiFmxmc4uCbOqtf7NLOTgrIzAOaRnT0EsrRICpg5Qw==} engines: {node: ^16.13 || >=18} peerDependencies: @@ -26508,7 +26945,7 @@ packages: lodash.clonedeep: 4.5.0 lodash.zip: 4.2.0 minimatch: 9.0.4 - puppeteer-core: 20.9.0(typescript@5.6.3) + puppeteer-core: 20.9.0(typescript@5.7.2) query-selector-shadow-dom: 1.0.1 resq: 1.11.0 rgb2hex: 0.2.5 @@ -26522,7 +26959,7 @@ packages: - utf-8-validate dev: true - /webdriverio@8.36.1(typescript@5.6.3): + /webdriverio@8.36.1(typescript@5.7.2): resolution: {integrity: sha512-vzE09oFQeMbOYJ/75jZ13sDIljzC3HH7uoUJKAMAEtyrn/bu1F9Sg/4IDEsvQaRD3pz3ae6SkRld33lcQk6HJA==} engines: {node: ^16.13 || >=18} peerDependencies: @@ -26549,7 +26986,7 @@ packages: lodash.clonedeep: 4.5.0 lodash.zip: 4.2.0 minimatch: 9.0.4 - puppeteer-core: 20.9.0(typescript@5.6.3) + puppeteer-core: 20.9.0(typescript@5.7.2) query-selector-shadow-dom: 1.0.1 resq: 1.11.0 rgb2hex: 0.2.5 @@ -26580,6 +27017,10 @@ packages: engines: {node: '>=10.13.0'} dev: true + /webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + dev: true + /webpack@5.91.0: resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} engines: {node: '>=10.13.0'} @@ -26591,12 +27032,12 @@ packages: optional: true dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) + acorn: 8.14.0 + acorn-import-assertions: 1.9.0(acorn@8.14.0) browserslist: 4.23.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.16.1 @@ -27111,7 +27552,7 @@ packages: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} dev: false - /zustand@4.4.1(@types/react@18.3.3)(react@18.2.0): + /zustand@4.4.1(@types/react@18.3.3)(immer@10.1.1)(react@18.2.0): resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} engines: {node: '>=12.7.0'} peerDependencies: @@ -27127,11 +27568,12 @@ packages: optional: true dependencies: '@types/react': 18.3.3 + immer: 10.1.1 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /zustand@4.5.4(@types/react@18.3.3)(react@18.2.0): + /zustand@4.5.4(@types/react@18.3.3)(immer@10.1.1)(react@18.2.0): resolution: {integrity: sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==} engines: {node: '>=12.7.0'} peerDependencies: @@ -27147,6 +27589,7 @@ packages: optional: true dependencies: '@types/react': 18.3.3 + immer: 10.1.1 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false diff --git a/scripts/indexer-renames.ts b/scripts/indexer-renames.ts new file mode 100644 index 000000000..63079f5e3 --- /dev/null +++ b/scripts/indexer-renames.ts @@ -0,0 +1,66 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { + EnumDeclaration, + InterfaceDeclaration, + Project, + SyntaxKind, + TypeAliasDeclaration, +} from 'ts-morph'; + +// Initialize a new project +const project = new Project({ + // You can specify your tsconfig path here + tsConfigFilePath: 'tsconfig.json', +}); + +// Add source files - replace with your file path +const sourceFile = project.addSourceFileAtPath('./src/types/indexer/indexerApiGen.ts'); + +// Find all interfaces in the file +const interfaces = sourceFile.getDescendantsOfKind(SyntaxKind.InterfaceDeclaration); + +// Find all enums in the file +const enums = sourceFile.getDescendantsOfKind(SyntaxKind.EnumDeclaration); + +// Find all type aliases in the file +const types = sourceFile.getDescendantsOfKind(SyntaxKind.TypeAliasDeclaration); + +// Rename each interface +interfaces.forEach((interfaceDecl: InterfaceDeclaration) => { + const currentName = interfaceDecl.getName(); + const newName = `Indexer${currentName}`; + + // Rename the interface + interfaceDecl.rename(newName); +}); + +// Rename each enum +enums.forEach((enumDecl: EnumDeclaration) => { + const currentName = enumDecl.getName(); + const newName = `Indexer${currentName}`; + + // Rename the enum + enumDecl.rename(newName); +}); + +// Rename each type alias +types.forEach((typeDecl: TypeAliasDeclaration) => { + const currentName = typeDecl.getName(); + const newName = `Indexer${currentName}`; + // Rename the type alias + typeDecl.rename(newName); +}); + +interfaces.forEach((interfaceDeclaration) => { + interfaceDeclaration.getProperties().forEach((property) => { + if (property.hasQuestionToken()) { + const typeNode = property.getTypeNode(); + if (typeNode && !typeNode.getText().includes('null')) { + property.setType(`${typeNode.getText()} | null`); + } + } + }); +}); + +// Save the changes +sourceFile.saveSync(); diff --git a/scripts/swagger_codegen.sh b/scripts/swagger_codegen.sh new file mode 100755 index 000000000..0f8d1ee50 --- /dev/null +++ b/scripts/swagger_codegen.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +CURRENT_DIR=$(pwd) + +# Defining a temporary directory for cloning +TMP_DIR=$(mktemp -d) + +# Function to clean up the temporary directory +cleanup() { + echo "Cleaning up..." + rm -rf "$TMP_DIR" +} + +# Trap to clean up in case of script exit or interruption +trap cleanup EXIT + +curl -o $TMP_DIR/swagger.json https://raw.githubusercontent.com/dydxprotocol/v4-chain/main/indexer/services/comlink/public/swagger.json + +cd "$TMP_DIR" + +swagger-codegen generate -i swagger.json -o generated -l typescript-fetch + +# a bunch of one off fixes to massage this thing into a reasonable state, probably very fragile +sed -i '' '1,79d; /export const DefaultApiFetchParamCreator/,$d' generated/api.ts +sed -i '' -e ':a' -e '$d;N;2,4ba' -e 'P;D' generated/api.ts +line_num=$(grep -n "export interface SparklineResponseObject" generated/api.ts | cut -d: -f1) && sed -i '' "$((line_num-5)),$((line_num+3))d" generated/api.ts +line_num=$(grep -n "export interface PerpetualPositionsMap" generated/api.ts | cut -d: -f1) && sed -i '' "$((line_num-5)),$((line_num+3))d" generated/api.ts +line_num=$(grep -n "export interface AssetPositionsMap" generated/api.ts | cut -d: -f1) && sed -i '' "$((line_num-5)),$((line_num+3))d" generated/api.ts +sed -i '' '/markets: { \[key: string\]: PerpetualMarketResponseObject; };/s/;$//' generated/api.ts +sed -i '' 's/openPerpetualPositions: PerpetualPositionsMap;/openPerpetualPositions: { [market: string]: PerpetualPositionResponseObject };/' generated/api.ts +sed -i '' 's/assetPositions: AssetPositionsMap;/assetPositions: { [symbol: string]: AssetPositionResponseObject };/' generated/api.ts +sed -i '' 's/= /=/' generated/api.ts + +rm -f $CURRENT_DIR/src/types/indexer/indexerApiGen.ts +mv generated/api.ts $CURRENT_DIR/src/types/indexer/indexerApiGen.ts + +cd $CURRENT_DIR + +npx tsx scripts/indexer-renames.ts +pnpm prettier ./src/types/indexer/indexerApiGen.ts --write +sed -i '' 's/export interface IndexerAPIOrderStatus {}/export type IndexerAPIOrderStatus = IndexerOrderStatus | IndexerBestEffortOpenedStatus;/' ./src/types/indexer/indexerApiGen.ts diff --git a/src/abacus-ts/accountRefreshSignal.ts b/src/abacus-ts/accountRefreshSignal.ts new file mode 100644 index 000000000..f7497f1e1 --- /dev/null +++ b/src/abacus-ts/accountRefreshSignal.ts @@ -0,0 +1,28 @@ +import { min } from 'lodash'; + +import { timeUnits } from '@/constants/time'; + +import { appQueryClient } from '@/state/appQueryClient'; + +import { Signal } from './lib/signal'; + +// triggers when we got fresh parent subaccount data from the websocket for any reason +// mostly network reconnects, refreshes, page visibility changes, etc +export const accountRefreshSignal = new Signal(); + +const BUFFER_REFRESH_TIME = timeUnits.second * 5; + +export function refreshIndexerQueryOnAccountSocketRefresh(key: any[]) { + return accountRefreshSignal.onTrigger(() => { + // we don't refresh if all data was updated within the last few seconds + const minTime = min( + appQueryClient + .getQueryCache() + .findAll({ queryKey: ['indexer', ...key], exact: false }) + .map((q) => q.state.dataUpdatedAt) + ); + if ((minTime ?? 0) < new Date().valueOf() - BUFFER_REFRESH_TIME) { + appQueryClient.invalidateQueries({ queryKey: ['indexer', ...key], exact: false }); + } + }); +} diff --git a/src/abacus-ts/lib/createStoreEffect.ts b/src/abacus-ts/lib/createStoreEffect.ts new file mode 100644 index 000000000..11e2bd318 --- /dev/null +++ b/src/abacus-ts/lib/createStoreEffect.ts @@ -0,0 +1,26 @@ +import { type RootState, type RootStore } from '@/state/_store'; + +type CleanupFn = () => void; + +export function createStoreEffect( + store: RootStore, + selector: (state: RootState) => T, + handleChange: (val: NoInfer) => CleanupFn | undefined +): CleanupFn { + let lastValue = selector(store.getState()); + let lastCleanup = handleChange(lastValue); + + const removeStoreListener = store.subscribe(() => { + const thisValue = selector(store.getState()); + if (thisValue !== lastValue) { + lastCleanup?.(); + lastValue = thisValue; + lastCleanup = handleChange(thisValue); + } + }); + + return () => { + lastCleanup?.(); + removeStoreListener(); + }; +} diff --git a/src/abacus-ts/lib/loadable.ts b/src/abacus-ts/lib/loadable.ts new file mode 100644 index 000000000..59528c3fe --- /dev/null +++ b/src/abacus-ts/lib/loadable.ts @@ -0,0 +1,17 @@ +export type Loadable = + | { status: 'idle'; data: undefined } + | { status: 'success'; data: T } + | { status: 'pending'; data?: T } + | { status: 'error'; data?: T; error: any }; + +export function loadablePending() { + return { status: 'pending' } as { status: 'pending'; data?: T }; +} + +export function loadableIdle() { + return { status: 'idle', data: undefined } as const; +} + +export function loadableLoaded(value: T) { + return { status: 'success', data: value } as const; +} diff --git a/src/abacus-ts/lib/mapLoadable.ts b/src/abacus-ts/lib/mapLoadable.ts new file mode 100644 index 000000000..b41c2e3ec --- /dev/null +++ b/src/abacus-ts/lib/mapLoadable.ts @@ -0,0 +1,8 @@ +import { Loadable } from './loadable'; + +export function mapLoadableData(load: Loadable, map: (obj: T) => R): Loadable { + return { + ...load, + data: load.data != null ? map(load.data) : undefined, + } as Loadable; +} diff --git a/src/abacus-ts/lib/resourceCacheManager.ts b/src/abacus-ts/lib/resourceCacheManager.ts new file mode 100644 index 000000000..daafd5d2a --- /dev/null +++ b/src/abacus-ts/lib/resourceCacheManager.ts @@ -0,0 +1,65 @@ +type CacheEntry = { + resource: T; + count: number; + destroyTimeout?: NodeJS.Timeout; +}; + +type Cache = { + [key: string]: CacheEntry; +}; + +export class ResourceCacheManager { + private cache: Cache = {}; + + constructor( + private options: { + constructor: (key: U) => T; + destroyer: (resource: NoInfer) => void; + keySerializer: (key: NoInfer) => string; + destroyDelayMs?: number; + } + ) {} + + use(key: U): T { + const serializedKey = this.options.keySerializer(key); + + this.cache[serializedKey] ??= { + resource: this.options.constructor(key), + count: 0, + }; + + const entry = this.cache[serializedKey]; + entry.count += 1; + + if (entry.destroyTimeout) { + clearTimeout(entry.destroyTimeout); + entry.destroyTimeout = undefined; + } + + return entry.resource; + } + + markDone(key: U): void { + const serializedKey = this.options.keySerializer(key); + const entry = this.cache[serializedKey]; + if (!entry) return; + + entry.count -= 1; + + if (entry.destroyTimeout) { + clearTimeout(entry.destroyTimeout); + entry.destroyTimeout = undefined; + } + + if (entry.count === 0) { + const delay = this.options.destroyDelayMs ?? 1000; + entry.destroyTimeout = setTimeout(() => { + const latestVal = this.cache[serializedKey]; + if (!latestVal) return; + + this.options.destroyer(latestVal.resource); + delete this.cache[serializedKey]; + }, delay); + } + } +} diff --git a/src/abacus-ts/lib/signal.ts b/src/abacus-ts/lib/signal.ts new file mode 100644 index 000000000..208528a74 --- /dev/null +++ b/src/abacus-ts/lib/signal.ts @@ -0,0 +1,16 @@ +export class Signal extends EventTarget { + notify() { + this.dispatchEvent(new Event('trigger')); + } + + onTrigger(callback: () => void) { + // Store the callback reference + const listener = callback.bind(null); + this.addEventListener('trigger', listener); + + // Return an unsubscribe function + return () => { + this.removeEventListener('trigger', listener); + }; + } +} diff --git a/src/abacus-ts/logs.ts b/src/abacus-ts/logs.ts new file mode 100644 index 000000000..7fe963e67 --- /dev/null +++ b/src/abacus-ts/logs.ts @@ -0,0 +1,5 @@ +import { log } from '@/lib/telemetry'; + +export function logAbacusTsError(source: string, message: string, ...args: any[]) { + log(`${source}: ${message}`, undefined, { context: args }); +} diff --git a/src/abacus-ts/rawTypes.ts b/src/abacus-ts/rawTypes.ts new file mode 100644 index 000000000..f4811418e --- /dev/null +++ b/src/abacus-ts/rawTypes.ts @@ -0,0 +1,49 @@ +import { + IndexerAssetPositionResponseObject, + IndexerHistoricalBlockTradingReward, + IndexerPerpetualMarketResponseObject, + IndexerPerpetualPositionResponseObject, + IndexerTransferResponseObject, +} from '@/types/indexer/indexerApiGen'; +import { + IndexerCompositeFillObject, + IndexerCompositeOrderObject, +} from '@/types/indexer/indexerManual'; + +import { MetadataServiceAssetInfo } from '@/constants/assetMetadata'; + +export type MarketsData = { [marketId: string]: IndexerPerpetualMarketResponseObject }; + +export type OrderbookData = { + bids: { [price: string]: string }; + asks: { [price: string]: string }; +}; + +export interface ParentSubaccountData { + address: string; + parentSubaccount: number; + + childSubaccounts: { [subaccountNumber: string]: ChildSubaccountData | undefined }; + + // this data is lost on websocket reconnect, should never be trusted as the ONLY source for this information + // it should be used to trigger a rest call refresh (debounced) and merged with the rest call result until the refresh completes + ephemeral: { + tradingRewards?: IndexerHistoricalBlockTradingReward[]; + fills?: IndexerCompositeFillObject[]; + orders?: { [orderId: string]: IndexerCompositeOrderObject }; + transfers?: IndexerTransferResponseObject[]; + }; +} + +export interface ChildSubaccountData { + address: string; + + subaccountNumber: number; + + openPerpetualPositions: { [market: string]: IndexerPerpetualPositionResponseObject }; + + assetPositions: { [symbol: string]: IndexerAssetPositionResponseObject }; +} + +export type AssetInfo = MetadataServiceAssetInfo & { id: string }; +export type AssetInfos = Record; diff --git a/src/abacus-ts/rest/assets.ts b/src/abacus-ts/rest/assets.ts new file mode 100644 index 000000000..ad4c18d30 --- /dev/null +++ b/src/abacus-ts/rest/assets.ts @@ -0,0 +1,42 @@ +import { QueryObserver } from '@tanstack/react-query'; +import { mapValues } from 'lodash'; + +import { timeUnits } from '@/constants/time'; + +import { type RootStore } from '@/state/_store'; +import { appQueryClient } from '@/state/appQueryClient'; +import { setAllAssetsRaw } from '@/state/raw'; + +import metadataClient from '@/clients/metadataService'; + +import { loadableIdle } from '../lib/loadable'; +import { mapLoadableData } from '../lib/mapLoadable'; +import { logAbacusTsError } from '../logs'; +import { queryResultToLoadable } from './lib/queryResultToLoadable'; + +export function setUpAssetsQuery(store: RootStore) { + const observer = new QueryObserver(appQueryClient, { + queryKey: ['metadata', 'assets'], + queryFn: () => metadataClient.getAssetInfo(), + refetchInterval: timeUnits.minute * 5, + staleTime: timeUnits.minute * 5, + }); + + const unsubscribe = observer.subscribe((result) => { + try { + store.dispatch( + setAllAssetsRaw( + mapLoadableData(queryResultToLoadable(result), (map) => + mapValues(map, (v, id) => ({ ...v, id })) + ) + ) + ); + } catch (e) { + logAbacusTsError('setUpAssetsQuery', 'Error handling result from react query', e, result); + } + }); + return () => { + unsubscribe(); + store.dispatch(setAllAssetsRaw(loadableIdle())); + }; +} diff --git a/src/abacus-ts/rest/blockTradingRewards.ts b/src/abacus-ts/rest/blockTradingRewards.ts new file mode 100644 index 000000000..86b039759 --- /dev/null +++ b/src/abacus-ts/rest/blockTradingRewards.ts @@ -0,0 +1,48 @@ +import { isParentSubaccountBlockRewardResponse } from '@/types/indexer/indexerChecks'; + +import { type RootStore } from '@/state/_store'; +import { setAccountBlockTradingRewardsRaw } from '@/state/raw'; + +import { isTruthy } from '@/lib/isTruthy'; + +import { refreshIndexerQueryOnAccountSocketRefresh } from '../accountRefreshSignal'; +import { loadableIdle } from '../lib/loadable'; +import { selectParentSubaccountInfo } from '../socketSelectors'; +import { createIndexerQueryStoreEffect } from './lib/indexerQueryStoreEffect'; + +export function setUpBlockTradingRewardsQuery(store: RootStore) { + const cleanupListener = refreshIndexerQueryOnAccountSocketRefresh([ + 'account', + 'blockTradingRewards', + ]); + + const cleanupEffect = createIndexerQueryStoreEffect(store, { + selector: selectParentSubaccountInfo, + getQueryKey: (data) => ['account', 'blockTradingRewards', data], + getQueryFn: (indexerClient, data) => { + if (!isTruthy(data.wallet) || data.subaccount == null) { + return null; + } + return () => indexerClient.account.getHistoricalBlockTradingRewards(data.wallet!); + }, + onResult: (blockTradingRewards) => { + store.dispatch( + setAccountBlockTradingRewardsRaw({ + status: blockTradingRewards.status, + data: + blockTradingRewards.data != null + ? isParentSubaccountBlockRewardResponse(blockTradingRewards.data) + : blockTradingRewards.data, + error: blockTradingRewards.error, + }) + ); + }, + onNoQuery: () => store.dispatch(setAccountBlockTradingRewardsRaw(loadableIdle())), + }); + + return () => { + cleanupListener(); + cleanupEffect(); + store.dispatch(setAccountBlockTradingRewardsRaw(loadableIdle())); + }; +} diff --git a/src/abacus-ts/rest/fills.ts b/src/abacus-ts/rest/fills.ts new file mode 100644 index 000000000..93214b8cb --- /dev/null +++ b/src/abacus-ts/rest/fills.ts @@ -0,0 +1,41 @@ +import { isParentSubaccountFillResponse } from '@/types/indexer/indexerChecks'; + +import { type RootStore } from '@/state/_store'; +import { setAccountFillsRaw } from '@/state/raw'; + +import { isTruthy } from '@/lib/isTruthy'; + +import { refreshIndexerQueryOnAccountSocketRefresh } from '../accountRefreshSignal'; +import { loadableIdle } from '../lib/loadable'; +import { selectParentSubaccountInfo } from '../socketSelectors'; +import { createIndexerQueryStoreEffect } from './lib/indexerQueryStoreEffect'; + +export function setUpFillsQuery(store: RootStore) { + const cleanupListener = refreshIndexerQueryOnAccountSocketRefresh(['account', 'fills']); + const cleanupEffect = createIndexerQueryStoreEffect(store, { + selector: selectParentSubaccountInfo, + getQueryKey: (data) => ['account', 'fills', data.wallet, data.subaccount], + getQueryFn: (indexerClient, data) => { + if (!isTruthy(data.wallet) || data.subaccount == null) { + return null; + } + return () => + indexerClient.account.getParentSubaccountNumberFills(data.wallet!, data.subaccount!); + }, + onResult: (fills) => { + store.dispatch( + setAccountFillsRaw({ + status: fills.status, + data: fills.data != null ? isParentSubaccountFillResponse(fills.data) : fills.data, + error: fills.error, + }) + ); + }, + onNoQuery: () => store.dispatch(setAccountFillsRaw(loadableIdle())), + }); + return () => { + cleanupListener(); + cleanupEffect(); + store.dispatch(setAccountFillsRaw(loadableIdle())); + }; +} diff --git a/src/abacus-ts/rest/height.ts b/src/abacus-ts/rest/height.ts new file mode 100644 index 000000000..3e9ea745e --- /dev/null +++ b/src/abacus-ts/rest/height.ts @@ -0,0 +1,59 @@ +import { timeUnits } from '@/constants/time'; + +import { type RootStore } from '@/state/_store'; +import { setIndexerHeightRaw, setValidatorHeightRaw } from '@/state/raw'; + +import { loadableIdle } from '../lib/loadable'; +import { mapLoadableData } from '../lib/mapLoadable'; +import { + createIndexerQueryStoreEffect, + createValidatorQueryStoreEffect, +} from './lib/indexerQueryStoreEffect'; +import { queryResultToLoadable } from './lib/queryResultToLoadable'; + +export function setUpIndexerHeightQuery(store: RootStore) { + const cleanupEffect = createIndexerQueryStoreEffect(store, { + selector: () => true, + getQueryKey: () => ['height'], + getQueryFn: (indexerClient) => { + return () => indexerClient.utility.getHeight(); + }, + onResult: (height) => { + store.dispatch(setIndexerHeightRaw(queryResultToLoadable(height))); + }, + onNoQuery: () => store.dispatch(setIndexerHeightRaw(loadableIdle())), + refetchInterval: timeUnits.second * 10, + staleTime: timeUnits.second * 10, + }); + return () => { + cleanupEffect(); + store.dispatch(setIndexerHeightRaw(loadableIdle())); + }; +} + +export function setUpValidatorHeightQuery(store: RootStore) { + const cleanupEffect = createValidatorQueryStoreEffect(store, { + selector: () => true, + getQueryKey: () => ['height'], + getQueryFn: (compositeClient) => { + return () => compositeClient.validatorClient.get.latestBlock(); + }, + onResult: (height) => { + store.dispatch( + setValidatorHeightRaw( + mapLoadableData(queryResultToLoadable(height), (d) => ({ + height: d.header.height, + time: d.header.time, + })) + ) + ); + }, + onNoQuery: () => store.dispatch(setValidatorHeightRaw(loadableIdle())), + refetchInterval: timeUnits.second * 10, + staleTime: timeUnits.second * 10, + }); + return () => { + cleanupEffect(); + store.dispatch(setValidatorHeightRaw(loadableIdle())); + }; +} diff --git a/src/abacus-ts/rest/lib/compositeClientManager.ts b/src/abacus-ts/rest/lib/compositeClientManager.ts new file mode 100644 index 000000000..e0b60914e --- /dev/null +++ b/src/abacus-ts/rest/lib/compositeClientManager.ts @@ -0,0 +1,149 @@ +import { createStoreEffect } from '@/abacus-ts/lib/createStoreEffect'; +import { ResourceCacheManager } from '@/abacus-ts/lib/resourceCacheManager'; +import { + CompositeClient, + IndexerClient, + IndexerConfig, + Network, + NetworkOptimizer, + ValidatorConfig, +} from '@dydxprotocol/v4-client-js'; + +import { DEFAULT_TRANSACTION_MEMO } from '@/constants/analytics'; +import { + DydxChainId, + DydxNetwork, + ENVIRONMENT_CONFIG_MAP, + TOKEN_CONFIG_MAP, +} from '@/constants/networks'; + +import { type RootStore } from '@/state/_store'; +import { getSelectedNetwork } from '@/state/appSelectors'; +import { setNetworkStateRaw } from '@/state/raw'; + +import { getStatsigConfigAsync } from '@/lib/statsig'; + +type CompositeClientWrapper = { + dead?: boolean; + compositeClient?: CompositeClient; + indexer?: IndexerClient; + tearDown: () => void; +}; + +function makeCompositeClient({ + network, + store, +}: { + network: DydxNetwork; + store: RootStore; +}): CompositeClientWrapper { + const networkConfig = ENVIRONMENT_CONFIG_MAP[network]; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!networkConfig) { + throw new Error(`Unknown network: ${network}`); + } + const chainId = networkConfig.dydxChainId as DydxChainId; + const tokens = TOKEN_CONFIG_MAP[chainId]; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (tokens == null) { + throw new Error(`Unknown chain id: ${chainId}`); + } + + const clientWrapper: CompositeClientWrapper = { + tearDown: () => { + clientWrapper.dead = true; + store.dispatch( + setNetworkStateRaw({ + networkId: network, + stateToMerge: { compositeClientReady: false, indexerClientReady: false }, + }) + ); + }, + }; + + store.dispatch( + setNetworkStateRaw({ + networkId: network, + stateToMerge: { compositeClientReady: false, indexerClientReady: false }, + }) + ); + + (async () => { + const networkOptimizer = new NetworkOptimizer(); + const indexerUrl = networkConfig.endpoints.indexers[0]; + if (indexerUrl == null) { + throw new Error('No indexer urls found'); + } + const validatorUrl = await networkOptimizer.findOptimalNode( + networkConfig.endpoints.validators, + chainId + ); + if (clientWrapper.dead) { + return; + } + const indexerConfig = new IndexerConfig(indexerUrl.api, indexerUrl.socket); + clientWrapper.indexer = new IndexerClient(indexerConfig); + store.dispatch( + setNetworkStateRaw({ + networkId: network, + stateToMerge: { indexerClientReady: true }, + }) + ); + const statsigFlags = await getStatsigConfigAsync(); + const compositeClient = await CompositeClient.connect( + new Network( + chainId, + indexerConfig, + new ValidatorConfig( + validatorUrl, + chainId, + { + USDC_DENOM: tokens.usdc.denom, + USDC_DECIMALS: tokens.usdc.decimals, + USDC_GAS_DENOM: tokens.usdc.gasDenom, + CHAINTOKEN_DENOM: tokens.chain.denom, + CHAINTOKEN_DECIMALS: tokens.chain.decimals, + }, + { + broadcastPollIntervalMs: 3_000, + broadcastTimeoutMs: 60_000, + }, + DEFAULT_TRANSACTION_MEMO, + statsigFlags.ff_enable_timestamp_nonce + ) + ) + ); + // this shouldn't be necessary - can actually be false + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (clientWrapper.dead) { + return; + } + clientWrapper.compositeClient = compositeClient; + store.dispatch( + setNetworkStateRaw({ + networkId: network, + stateToMerge: { compositeClientReady: true }, + }) + ); + })(); + return clientWrapper; +} + +export const CompositeClientManager = new ResourceCacheManager({ + constructor: (config: { network: DydxNetwork; store: RootStore }) => makeCompositeClient(config), + destroyer: (instance) => { + instance.tearDown(); + }, + // store not part of serialization, assumed immutable + keySerializer: ({ network }) => network, +}); + +// this just makes things simpler +export function alwaysUseCurrentNetworkClient(store: RootStore) { + return createStoreEffect(store, getSelectedNetwork, (network) => { + CompositeClientManager.use({ network, store }); + return () => { + CompositeClientManager.markDone({ network, store }); + }; + }); +} diff --git a/src/abacus-ts/rest/lib/indexerQueryStoreEffect.ts b/src/abacus-ts/rest/lib/indexerQueryStoreEffect.ts new file mode 100644 index 000000000..b345a7e2d --- /dev/null +++ b/src/abacus-ts/rest/lib/indexerQueryStoreEffect.ts @@ -0,0 +1,161 @@ +import { logAbacusTsError } from '@/abacus-ts/logs'; +import { selectCompositeClientReady, selectIndexerReady } from '@/abacus-ts/socketSelectors'; +import { CompositeClient, IndexerClient } from '@dydxprotocol/v4-client-js'; +import { QueryObserver, QueryObserverOptions, QueryObserverResult } from '@tanstack/react-query'; + +import { timeUnits } from '@/constants/time'; + +import { type RootState, type RootStore } from '@/state/_store'; +import { appQueryClient } from '@/state/appQueryClient'; +import { getSelectedNetwork } from '@/state/appSelectors'; +import { createAppSelector } from '@/state/appTypes'; + +import { createStoreEffect } from '../../lib/createStoreEffect'; +import { CompositeClientManager } from './compositeClientManager'; + +type PassedQueryOptions = Pick< + QueryObserverOptions, + | 'staleTime' + | 'gcTime' + | 'refetchInterval' + | 'refetchOnWindowFocus' + | 'refetchIntervalInBackground' + | 'refetchOnReconnect' + | 'refetchOnMount' +>; + +type QuerySetupConfig = { + selector: (state: RootState) => T; + getQueryKey: (selectorResult: NoInfer) => any[]; + getQueryFn: (client: ClientType, selectorResult: NoInfer) => (() => Promise) | null; + onResult: (result: NoInfer>) => void; + onNoQuery: () => void; +} & PassedQueryOptions; + +const baseOptions: PassedQueryOptions = { + refetchInterval: timeUnits.minute, + staleTime: timeUnits.second * 30, +}; + +export function createIndexerQueryStoreEffect( + store: RootStore, + config: QuerySetupConfig +) { + const fullSelector = createAppSelector( + [getSelectedNetwork, selectIndexerReady, config.selector], + (network, indexerReady, selectorResult) => ({ + infrastructure: { network, indexerReady }, + queryData: selectorResult, + }) + ); + + return createStoreEffect(store, fullSelector, (fullResult) => { + const { infrastructure, queryData } = fullResult; + + if (!infrastructure.indexerReady) { + config.onNoQuery(); + return undefined; + } + + const clientConfig = { + network: infrastructure.network, + store, + }; + const indexerClient = CompositeClientManager.use(clientConfig).indexer!; + + const queryFn = config.getQueryFn(indexerClient, queryData); + if (!queryFn) { + CompositeClientManager.markDone(clientConfig); + config.onNoQuery(); + return undefined; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { selector, getQueryKey, getQueryFn, onResult, ...otherOpts } = config; + const observer = new QueryObserver(appQueryClient, { + queryKey: ['indexer', ...config.getQueryKey(queryData), clientConfig.network], + queryFn, + ...baseOptions, + ...otherOpts, + }); + + const unsubscribe = observer.subscribe((result) => { + try { + config.onResult(result); + } catch (e) { + logAbacusTsError( + 'IndexerQueryStoreEffect', + 'Error handling result from react query store effect', + e, + result + ); + } + }); + + return () => { + unsubscribe(); + CompositeClientManager.markDone(clientConfig); + }; + }); +} + +export function createValidatorQueryStoreEffect( + store: RootStore, + config: QuerySetupConfig +) { + const fullSelector = createAppSelector( + [getSelectedNetwork, selectCompositeClientReady, config.selector], + (network, compositeClientReady, selectorResult) => ({ + infrastructure: { network, compositeClientReady }, + queryData: selectorResult, + }) + ); + + return createStoreEffect(store, fullSelector, (fullResult) => { + const { infrastructure, queryData } = fullResult; + + if (!infrastructure.compositeClientReady) { + config.onNoQuery(); + return undefined; + } + const clientConfig = { + network: infrastructure.network, + store, + }; + const compositeClient = CompositeClientManager.use(clientConfig).compositeClient!; + + const queryFn = config.getQueryFn(compositeClient, queryData); + if (!queryFn) { + CompositeClientManager.markDone(clientConfig); + config.onNoQuery(); + return undefined; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { selector, getQueryKey, getQueryFn, onResult, ...otherOpts } = config; + const observer = new QueryObserver(appQueryClient, { + queryKey: ['validator', ...config.getQueryKey(queryData), clientConfig.network], + queryFn, + ...baseOptions, + ...otherOpts, + }); + + const unsubscribe = observer.subscribe((result) => { + try { + config.onResult(result); + } catch (e) { + logAbacusTsError( + 'ValidatorQueryStoreEffect', + 'Error handling result from react query store effect', + e, + result + ); + } + }); + + return () => { + unsubscribe(); + CompositeClientManager.markDone(clientConfig); + }; + }); +} diff --git a/src/abacus-ts/rest/lib/queryResultToLoadable.ts b/src/abacus-ts/rest/lib/queryResultToLoadable.ts new file mode 100644 index 000000000..59ace962c --- /dev/null +++ b/src/abacus-ts/rest/lib/queryResultToLoadable.ts @@ -0,0 +1,10 @@ +import { Loadable } from '@/abacus-ts/lib/loadable'; +import { QueryObserverResult } from '@tanstack/react-query'; + +export function queryResultToLoadable(arg: QueryObserverResult): Loadable { + return { + status: arg.status, + data: arg.data, + error: arg.error, + } as Loadable; +} diff --git a/src/abacus-ts/rest/orders.ts b/src/abacus-ts/rest/orders.ts new file mode 100644 index 000000000..1d0082aa0 --- /dev/null +++ b/src/abacus-ts/rest/orders.ts @@ -0,0 +1,56 @@ +import { isParentSubaccountOrders } from '@/types/indexer/indexerChecks'; +import { keyBy } from 'lodash'; + +import { type RootStore } from '@/state/_store'; +import { setAccountOrdersRaw } from '@/state/raw'; + +import { isTruthy } from '@/lib/isTruthy'; + +import { refreshIndexerQueryOnAccountSocketRefresh } from '../accountRefreshSignal'; +import { loadableIdle } from '../lib/loadable'; +import { selectParentSubaccountInfo } from '../socketSelectors'; +import { createIndexerQueryStoreEffect } from './lib/indexerQueryStoreEffect'; + +export function setUpOrdersQuery(store: RootStore) { + const cleanupListener = refreshIndexerQueryOnAccountSocketRefresh(['account', 'orders']); + const cleanupEffect = createIndexerQueryStoreEffect(store, { + selector: selectParentSubaccountInfo, + getQueryKey: (data) => ['account', 'orders', data.wallet, data.subaccount], + getQueryFn: (indexerClient, data) => { + if (!isTruthy(data.wallet) || data.subaccount == null) { + return null; + } + return () => + indexerClient.account.getParentSubaccountNumberOrders( + data.wallet!, + data.subaccount!, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + true + ); + }, + onResult: (orders) => { + store.dispatch( + setAccountOrdersRaw({ + status: orders.status, + data: + orders.data != null + ? keyBy(isParentSubaccountOrders(orders.data), (o) => o.id ?? '') + : orders.data, + error: orders.error, + }) + ); + }, + onNoQuery: () => store.dispatch(setAccountOrdersRaw(loadableIdle())), + }); + return () => { + cleanupListener(); + cleanupEffect(); + store.dispatch(setAccountOrdersRaw(loadableIdle())); + }; +} diff --git a/src/abacus-ts/rest/transfers.ts b/src/abacus-ts/rest/transfers.ts new file mode 100644 index 000000000..ae5847c9a --- /dev/null +++ b/src/abacus-ts/rest/transfers.ts @@ -0,0 +1,46 @@ +import { isParentSubaccountTransferResponse } from '@/types/indexer/indexerChecks'; + +import { type RootStore } from '@/state/_store'; +import { setAccountTransfersRaw } from '@/state/raw'; + +import { isTruthy } from '@/lib/isTruthy'; + +import { refreshIndexerQueryOnAccountSocketRefresh } from '../accountRefreshSignal'; +import { loadableIdle } from '../lib/loadable'; +import { selectParentSubaccountInfo } from '../socketSelectors'; +import { createIndexerQueryStoreEffect } from './lib/indexerQueryStoreEffect'; + +export function setUpTransfersQuery(store: RootStore) { + const cleanupListener = refreshIndexerQueryOnAccountSocketRefresh(['account', 'transfers']); + + const cleanupEffect = createIndexerQueryStoreEffect(store, { + selector: selectParentSubaccountInfo, + getQueryKey: (data) => ['account', 'transfers', data], + getQueryFn: (indexerClient, data) => { + if (!isTruthy(data.wallet) || data.subaccount == null) { + return null; + } + return () => + indexerClient.account.getParentSubaccountNumberTransfers(data.wallet!, data.subaccount!); + }, + onResult: (transfers) => { + store.dispatch( + setAccountTransfersRaw({ + status: transfers.status, + data: + transfers.data != null + ? isParentSubaccountTransferResponse(transfers.data) + : transfers.data, + error: transfers.error, + }) + ); + }, + onNoQuery: () => store.dispatch(setAccountTransfersRaw(loadableIdle())), + }); + + return () => { + cleanupListener(); + cleanupEffect(); + store.dispatch(setAccountTransfersRaw(loadableIdle())); + }; +} diff --git a/src/abacus-ts/socketSelectors.ts b/src/abacus-ts/socketSelectors.ts new file mode 100644 index 000000000..36e72193a --- /dev/null +++ b/src/abacus-ts/socketSelectors.ts @@ -0,0 +1,38 @@ +import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; + +import { EndpointsConfig } from '@/hooks/useEndpointsConfig'; + +import { type RootState } from '@/state/_store'; +import { getUserSubaccountNumber, getUserWalletAddress } from '@/state/accountSelectors'; +import { getSelectedNetwork } from '@/state/appSelectors'; +import { createAppSelector } from '@/state/appTypes'; + +const suffix = '/v4/ws'; +export const selectWebsocketUrl = createAppSelector([getSelectedNetwork], (network) => { + const endpointsConfig: EndpointsConfig = ENVIRONMENT_CONFIG_MAP[network].endpoints; + return `${endpointsConfig.indexers[0]!.socket}${suffix}`; +}); + +export const selectIndexerUrl = createAppSelector([getSelectedNetwork], (network) => { + const endpointsConfig: EndpointsConfig = ENVIRONMENT_CONFIG_MAP[network].endpoints; + return `${endpointsConfig.indexers[0]!.api}`; +}); + +export const selectParentSubaccountInfo = createAppSelector( + [getUserWalletAddress, getUserSubaccountNumber], + (wallet, subaccount) => ({ wallet, subaccount }) +); + +export const selectIndexerReady = createAppSelector( + [getSelectedNetwork, (state: RootState) => state.raw.network], + (network, networks) => { + return !!networks[network]?.indexerClientReady; + } +); + +export const selectCompositeClientReady = createAppSelector( + [getSelectedNetwork, (state: RootState) => state.raw.network], + (network, networks) => { + return !!networks[network]?.compositeClientReady; + } +); diff --git a/src/abacus-ts/storeLifecycles.ts b/src/abacus-ts/storeLifecycles.ts new file mode 100644 index 000000000..42a357abb --- /dev/null +++ b/src/abacus-ts/storeLifecycles.ts @@ -0,0 +1,24 @@ +import { setUpAssetsQuery } from './rest/assets'; +import { setUpBlockTradingRewardsQuery } from './rest/blockTradingRewards'; +import { setUpFillsQuery } from './rest/fills'; +import { setUpIndexerHeightQuery, setUpValidatorHeightQuery } from './rest/height'; +import { alwaysUseCurrentNetworkClient } from './rest/lib/compositeClientManager'; +import { setUpOrdersQuery } from './rest/orders'; +import { setUpTransfersQuery } from './rest/transfers'; +import { setUpMarkets } from './websocket/markets'; +import { setUpOrderbook } from './websocket/orderbook'; +import { setUpParentSubaccount } from './websocket/parentSubaccount'; + +export const storeLifecycles = [ + alwaysUseCurrentNetworkClient, + setUpMarkets, + setUpAssetsQuery, + setUpParentSubaccount, + setUpFillsQuery, + setUpOrdersQuery, + setUpTransfersQuery, + setUpBlockTradingRewardsQuery, + setUpOrderbook, + setUpIndexerHeightQuery, + setUpValidatorHeightQuery, +] as const; diff --git a/src/abacus-ts/websocket/lib/indexerWebsocket.ts b/src/abacus-ts/websocket/lib/indexerWebsocket.ts new file mode 100644 index 000000000..dbce6afb2 --- /dev/null +++ b/src/abacus-ts/websocket/lib/indexerWebsocket.ts @@ -0,0 +1,205 @@ +import { logAbacusTsError } from '@/abacus-ts/logs'; +import typia from 'typia'; + +import { assertNever } from '@/lib/assertNever'; +import { isTruthy } from '@/lib/isTruthy'; + +import { ReconnectingWebSocket } from './reconnectingWebsocket'; + +const NO_ID_SPECIAL_STRING_ID = '______EMPTY_ID______'; + +export class IndexerWebsocket { + private socket: ReconnectingWebSocket | null = null; + + private subscriptions: { + [channel: string]: { + [id: string]: { + channel: string; + id: string | undefined; + batched: boolean; + handleBaseData: (data: any, fullMessage: any) => void; + handleUpdates: (updates: any[], fullMessage: any) => void; + sentSubMessage: boolean; + }; + }; + } = {}; + + constructor(url: string) { + this.socket = new ReconnectingWebSocket({ + url, + handleFreshConnect: this._handleFreshConnect, + handleMessage: this._handleMessage, + }); + } + + teardown(): void { + this.socket?.teardown(); + this.socket = null; + } + + // returns the unsubscribe function + addChannelSubscription({ + channel, + id, + batched = true, + handleUpdates, + handleBaseData, + }: { + channel: string; + id: string | undefined; + batched?: boolean; + handleBaseData: (data: any, fullMessage: any) => void; + handleUpdates: (data: any[], fullMessage: any) => void; + }): () => void { + this.subscriptions[channel] ??= {}; + if (this.subscriptions[channel][id ?? NO_ID_SPECIAL_STRING_ID] != null) { + logAbacusTsError('IndexerWebsocket', 'this subscription already exists', `${channel}/${id}`); + throw new Error(`IndexerWebsocket error: this subscription already exists. ${channel}/${id}`); + } + this.subscriptions[channel][id ?? NO_ID_SPECIAL_STRING_ID] = { + channel, + id, + batched, + handleBaseData, + handleUpdates, + sentSubMessage: false, + }; + if (this.socket != null && this.socket.isActive()) { + this.subscriptions[channel][id ?? NO_ID_SPECIAL_STRING_ID]!.sentSubMessage = true; + this.socket.send({ + batched, + channel, + id, + type: 'subscribe', + }); + } + + return () => { + if (this.subscriptions[channel] == null) { + return; + } + if (this.subscriptions[channel][id ?? NO_ID_SPECIAL_STRING_ID] == null) { + return; + } + if ( + this.socket != null && + this.socket.isActive() && + this.subscriptions[channel][id ?? NO_ID_SPECIAL_STRING_ID]!.sentSubMessage + ) { + this.socket.send({ + channel, + id, + type: 'unsubscribe', + }); + } + delete this.subscriptions[channel][id ?? NO_ID_SPECIAL_STRING_ID]; + }; + } + + private _handleMessage = (messagePre: any) => { + try { + const message = isWsMessage(messagePre); + if (message.type === 'error') { + logAbacusTsError('IndexerWebsocket', 'encountered server side error:', message.message); + } else if (message.type === 'connected') { + // do nothing + } else if ( + message.type === 'subscribed' || + message.type === 'channel_batch_data' || + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + message.type === 'channel_data' + ) { + const channel = message.channel; + const id = message.id; + if (this.subscriptions[channel] == null) { + logAbacusTsError( + 'IndexerWebsocket', + 'encountered message with unknown target', + channel, + id + ); + return; + } + if (this.subscriptions[channel][id ?? NO_ID_SPECIAL_STRING_ID] == null) { + logAbacusTsError( + 'IndexerWebsocket', + 'encountered message with unknown target', + channel, + id + ); + return; + } + if (message.type === 'subscribed') { + this.subscriptions[channel][id ?? NO_ID_SPECIAL_STRING_ID]!.handleBaseData( + message.contents, + message + ); + } else if (message.type === 'channel_data') { + this.subscriptions[channel][id ?? NO_ID_SPECIAL_STRING_ID]!.handleUpdates( + [message.contents], + message + ); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + } else if (message.type === 'channel_batch_data') { + this.subscriptions[channel][id ?? NO_ID_SPECIAL_STRING_ID]!.handleUpdates( + message.contents, + message + ); + } else { + assertNever(message); + } + } else { + assertNever(message); + } + } catch (e) { + logAbacusTsError('IndexerWebsocket', 'Error handling websocket message', messagePre, e); + } + }; + + // when websocket churns, reconnect all known subscribers + private _handleFreshConnect = () => { + if (this.socket != null && this.socket.isActive()) { + Object.values(this.subscriptions) + .filter(isTruthy) + .flatMap((o) => Object.values(o)) + .filter(isTruthy) + .forEach(({ batched, channel, id }) => { + this.subscriptions[channel]![id ?? NO_ID_SPECIAL_STRING_ID]!.sentSubMessage = true; + this.socket!.send({ + batched, + channel, + id, + type: 'subscribe', + }); + }); + } else { + logAbacusTsError( + 'IndexerWebsocket', + "handle fresh connect called when websocket isn't ready." + ); + } + }; +} + +type IndexerWebsocketMessageType = + | { type: 'error'; message: string } + | { type: 'connected' } + | { + type: 'channel_batch_data'; + channel: string; + id: string | undefined; + version: string; + subaccountNumber?: number; + contents: any[]; + } + | { + type: 'channel_data'; + channel: string; + id: string | undefined; + version: string; + subaccountNumber?: number; + contents: any; + } + | { type: 'subscribed'; channel: string; id: string | undefined; contents: any }; + +export const isWsMessage = typia.createAssert(); diff --git a/src/abacus-ts/websocket/lib/indexerWebsocketManager.ts b/src/abacus-ts/websocket/lib/indexerWebsocketManager.ts new file mode 100644 index 000000000..dccf4d7ec --- /dev/null +++ b/src/abacus-ts/websocket/lib/indexerWebsocketManager.ts @@ -0,0 +1,8 @@ +import { ResourceCacheManager } from '../../lib/resourceCacheManager'; +import { IndexerWebsocket } from './indexerWebsocket'; + +export const IndexerWebsocketManager = new ResourceCacheManager({ + constructor: (wsUrl: string) => new IndexerWebsocket(wsUrl), + destroyer: (obj) => obj.teardown(), + keySerializer: (str) => str, +}); diff --git a/src/abacus-ts/websocket/lib/reconnectingWebsocket.ts b/src/abacus-ts/websocket/lib/reconnectingWebsocket.ts new file mode 100644 index 000000000..fc3ece62e --- /dev/null +++ b/src/abacus-ts/websocket/lib/reconnectingWebsocket.ts @@ -0,0 +1,134 @@ +import { logAbacusTsError } from '@/abacus-ts/logs'; + +interface WebSocketConfig { + url: string; + handleMessage: (data: any) => void; + handleFreshConnect: () => void; + initialReconnectInterval?: number; + maxReconnectInterval?: number; + backoffMultiplier?: number; +} + +export class ReconnectingWebSocket { + private ws: WebSocket | null = null; + + private readonly url: string; + + private readonly handleMessage: (data: any) => void; + + private readonly handleFreshConnect: () => void; + + private readonly initialReconnectInterval: number; + + private readonly maxReconnectInterval: number; + + private readonly backoffMultiplier: number; + + private isDead: boolean = false; + + private currentReconnectInterval: number; + + private reconnectTimeout: NodeJS.Timeout | null = null; + + constructor(config: WebSocketConfig) { + this.url = config.url; + this.handleMessage = config.handleMessage; + this.handleFreshConnect = config.handleFreshConnect; + + this.initialReconnectInterval = config.initialReconnectInterval ?? 1_000; + this.maxReconnectInterval = config.maxReconnectInterval ?? 60_000; + this.backoffMultiplier = config.backoffMultiplier ?? 1.5; + this.currentReconnectInterval = this.initialReconnectInterval; + + this.connect(); + } + + private connect(): void { + try { + this.ws = new WebSocket(this.url); + + this.ws.onmessage = (event) => { + try { + const data = JSON.parse(event.data); + this.handleMessage(data); + } catch (e) { + logAbacusTsError('ReconnectingWebSocket', 'error in handler', e); + } + }; + + this.ws.onclose = () => { + this.ws = null; + this.handleReconnect(); + }; + + this.ws.onerror = (error) => { + logAbacusTsError('ReconnectingWebSocket', 'socket error encountered', error); + this.ws?.close(); + }; + + this.ws.onopen = () => { + this.currentReconnectInterval = this.initialReconnectInterval; + // eslint-disable-next-line no-console + console.log('ReconnectingWebsocket: Connected to ', this.url); + this.handleFreshConnect(); + }; + } catch (error) { + logAbacusTsError('ReconnectingWebSocket', 'connection error', error); + this.ws?.close(); + this.ws = null; + this.handleReconnect(); + } + } + + private handleReconnect(): void { + if (this.isDead) { + return; + } + if (this.reconnectTimeout) { + clearTimeout(this.reconnectTimeout); + } + + this.reconnectTimeout = setTimeout(() => { + // eslint-disable-next-line no-console + console.log( + `ReconnectingWebSocket: Attempting to reconnect after ${this.currentReconnectInterval / 1000}s...` + ); + + // Calculate next interval with exponential backoff + this.currentReconnectInterval = Math.min( + this.currentReconnectInterval * this.backoffMultiplier, + this.maxReconnectInterval + ); + + this.connect(); + }, this.currentReconnectInterval); + } + + public isActive(): boolean { + return this.ws?.readyState === WebSocket.OPEN; + } + + public send(data: any): void { + if (!this.ws || this.ws.readyState !== WebSocket.OPEN) { + logAbacusTsError( + 'ReconnectingWebsocket', + 'Someone attempted to send data on socket in invalid state', + this.url + ); + throw new Error('ReconnectingWebSocket: WebSocket is not connected'); + } + + const message = typeof data === 'string' ? data : JSON.stringify(data); + this.ws.send(message); + } + + public teardown(): void { + if (this.reconnectTimeout) { + clearTimeout(this.reconnectTimeout); + this.reconnectTimeout = null; + } + this.isDead = true; + this.ws?.close(); + this.ws = null; + } +} diff --git a/src/abacus-ts/websocket/lib/websocketDerivedValue.ts b/src/abacus-ts/websocket/lib/websocketDerivedValue.ts new file mode 100644 index 000000000..a39ec4352 --- /dev/null +++ b/src/abacus-ts/websocket/lib/websocketDerivedValue.ts @@ -0,0 +1,46 @@ +import { IndexerWebsocket } from './indexerWebsocket'; + +type Unsubscribe = () => void; + +export class WebsocketDerivedValue { + private unsubFromWs: Unsubscribe | undefined; + + constructor( + websocket: IndexerWebsocket, + // subscriptions must be unique, we are trusing whoever is constructing us is ensuring uniqueness + sub: { + channel: string; + id: string | undefined; + handleBaseData: (data: any, value: T, fullMessage: any) => T; + handleUpdates: (updates: any[], value: T, fullMessage: any) => T; + }, + private value: T, + private changeHandler: ((val: T) => void) | undefined + ) { + this.unsubFromWs = websocket.addChannelSubscription({ + channel: sub.channel, + id: sub.id, + handleBaseData: (data, fullMessage) => + this._setValue(sub.handleBaseData(data, this.value, fullMessage)), + handleUpdates: (updates, fullMessage) => + this._setValue(sub.handleUpdates(updates, this.value, fullMessage)), + }); + } + + getValue(): T { + return this.value; + } + + teardown() { + this.changeHandler = undefined; + this.unsubFromWs?.(); + this.unsubFromWs = undefined; + } + + private _setValue = (newValue: T): void => { + if (newValue !== this.value) { + this.value = newValue; + this.changeHandler?.(this.value); + } + }; +} diff --git a/src/abacus-ts/websocket/markets.ts b/src/abacus-ts/websocket/markets.ts new file mode 100644 index 000000000..370d9f093 --- /dev/null +++ b/src/abacus-ts/websocket/markets.ts @@ -0,0 +1,88 @@ +import { + isWsMarketUpdateResponses, + isWsPerpetualMarketResponse, +} from '@/types/indexer/indexerChecks'; +import { throttle } from 'lodash'; + +import { timeUnits } from '@/constants/time'; + +import { type RootStore } from '@/state/_store'; +import { setAllMarketsRaw } from '@/state/raw'; + +import { createStoreEffect } from '../lib/createStoreEffect'; +import { Loadable, loadableLoaded, loadablePending } from '../lib/loadable'; +import { MarketsData } from '../rawTypes'; +import { selectWebsocketUrl } from '../socketSelectors'; +import { IndexerWebsocket } from './lib/indexerWebsocket'; +import { IndexerWebsocketManager } from './lib/indexerWebsocketManager'; +import { WebsocketDerivedValue } from './lib/websocketDerivedValue'; + +function marketsWebsocketValue( + websocket: IndexerWebsocket, + onChange: (val: Loadable) => void +) { + return new WebsocketDerivedValue>( + websocket, + { + channel: 'v4_markets', + id: undefined, + handleBaseData: (baseMessage) => { + const message = isWsPerpetualMarketResponse(baseMessage); + return loadableLoaded(message.markets); + }, + handleUpdates: (baseUpdates, value) => { + const updates = isWsMarketUpdateResponses(baseUpdates); + let startingValue = value.data; + if (startingValue == null) { + // eslint-disable-next-line no-console + console.log('MarketsTracker found unexpectedly null base data in update'); + return value; + } + startingValue = { ...startingValue }; + updates.forEach((update) => { + if (update.oraclePrices != null) { + Object.entries(update.oraclePrices).forEach(([marketId, oraclePriceObj]) => { + if (startingValue[marketId] != null && oraclePriceObj.oraclePrice != null) { + startingValue[marketId] = { + ...startingValue[marketId], + oraclePrice: oraclePriceObj.oraclePrice, + }; + } + }); + } + if (update.trading != null) { + Object.entries(update.trading).forEach(([marketId, updateObj]) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (startingValue[marketId] != null && updateObj != null) { + startingValue[marketId] = { + ...startingValue[marketId], + ...updateObj, + }; + } + }); + } + }); + return loadableLoaded(startingValue); + }, + }, + loadablePending(), + onChange + ); +} + +export function setUpMarkets(store: RootStore) { + const throttledSetMarkets = throttle((val: Loadable) => { + store.dispatch(setAllMarketsRaw(val)); + }, 2 * timeUnits.second); + + return createStoreEffect(store, selectWebsocketUrl, (wsUrl) => { + const thisTracker = marketsWebsocketValue(IndexerWebsocketManager.use(wsUrl), (val) => + throttledSetMarkets(val) + ); + + return () => { + thisTracker.teardown(); + IndexerWebsocketManager.markDone(wsUrl); + }; + }); +} diff --git a/src/abacus-ts/websocket/orderbook.ts b/src/abacus-ts/websocket/orderbook.ts new file mode 100644 index 000000000..0bbef85f1 --- /dev/null +++ b/src/abacus-ts/websocket/orderbook.ts @@ -0,0 +1,95 @@ +import { isWsOrderbookResponse, isWsOrderbookUpdateResponses } from '@/types/indexer/indexerChecks'; +import { keyBy, mapValues, throttle } from 'lodash'; + +import { timeUnits } from '@/constants/time'; + +import { type RootStore } from '@/state/_store'; +import { createAppSelector } from '@/state/appTypes'; +import { setOrderbookRaw } from '@/state/raw'; + +import { isTruthy } from '@/lib/isTruthy'; + +import { createStoreEffect } from '../lib/createStoreEffect'; +import { Loadable, loadableIdle, loadableLoaded, loadablePending } from '../lib/loadable'; +import { OrderbookData } from '../rawTypes'; +import { selectWebsocketUrl } from '../socketSelectors'; +import { IndexerWebsocket } from './lib/indexerWebsocket'; +import { IndexerWebsocketManager } from './lib/indexerWebsocketManager'; +import { WebsocketDerivedValue } from './lib/websocketDerivedValue'; + +function orderbookWebsocketValue( + websocket: IndexerWebsocket, + marketId: string, + onChange: (val: Loadable) => void +) { + return new WebsocketDerivedValue>( + websocket, + { + channel: 'v4_orderbook', + id: marketId, + handleBaseData: (baseMessage) => { + const message = isWsOrderbookResponse(baseMessage); + return loadableLoaded({ + asks: mapValues( + keyBy(message.asks, (a) => a.price), + (a) => a.size + ), + bids: mapValues( + keyBy(message.bids, (a) => a.price), + (a) => a.size + ), + }); + }, + handleUpdates: (baseUpdates, value) => { + const updates = isWsOrderbookUpdateResponses(baseUpdates); + let startingValue = value.data; + if (startingValue == null) { + // eslint-disable-next-line no-console + console.log('MarketsTracker found unexpectedly null base data in update'); + return value; + } + startingValue = { asks: { ...startingValue.asks }, bids: { ...startingValue.bids } }; + updates.forEach((update) => { + if (update.asks) { + update.asks.forEach(([price, size]) => (startingValue.asks[price] = size)); + } + if (update.bids) { + update.bids.forEach(([price, size]) => (startingValue.bids[price] = size)); + } + }); + return loadableLoaded(startingValue); + }, + }, + loadablePending(), + onChange + ); +} + +const selectMarketAndWsInfo = createAppSelector( + [selectWebsocketUrl, (state) => state.perpetuals.currentMarketId], + (wsUrl, currentMarketId) => ({ wsUrl, currentMarketId }) +); + +export function setUpOrderbook(store: RootStore) { + return createStoreEffect(store, selectMarketAndWsInfo, ({ currentMarketId, wsUrl }) => { + if (!isTruthy(currentMarketId)) { + return undefined; + } + const throttledSetOrderbook = throttle((data: Loadable) => { + store.dispatch(setOrderbookRaw({ marketId: currentMarketId, data })); + }, timeUnits.second / 2); + + const thisTracker = orderbookWebsocketValue( + IndexerWebsocketManager.use(wsUrl), + currentMarketId, + (data) => throttledSetOrderbook(data) + ); + + return () => { + thisTracker.teardown(); + IndexerWebsocketManager.markDone(wsUrl); + throttledSetOrderbook.cancel(); + store.dispatch(setOrderbookRaw({ marketId: currentMarketId, data: loadableIdle() })); + }; + }); +} diff --git a/src/abacus-ts/websocket/parentSubaccount.ts b/src/abacus-ts/websocket/parentSubaccount.ts new file mode 100644 index 000000000..7c4ed94ed --- /dev/null +++ b/src/abacus-ts/websocket/parentSubaccount.ts @@ -0,0 +1,231 @@ +import { + IndexerAssetPositionResponseObject, + IndexerOrderResponseObject, + IndexerPerpetualPositionResponseObject, + IndexerSubaccountResponseObject, +} from '@/types/indexer/indexerApiGen'; +import { + isWsParentSubaccountSubscribed, + isWsParentSubaccountUpdates, +} from '@/types/indexer/indexerChecks'; +import { IndexerWsOrderUpdate } from '@/types/indexer/indexerManual'; +import { produce } from 'immer'; +import { keyBy } from 'lodash'; + +import { type RootStore } from '@/state/_store'; +import { createAppSelector } from '@/state/appTypes'; +import { setParentSubaccountRaw } from '@/state/raw'; + +import { isTruthy } from '@/lib/isTruthy'; + +import { accountRefreshSignal } from '../accountRefreshSignal'; +import { createStoreEffect } from '../lib/createStoreEffect'; +import { Loadable, loadableIdle, loadableLoaded, loadablePending } from '../lib/loadable'; +import { ChildSubaccountData, ParentSubaccountData } from '../rawTypes'; +import { selectParentSubaccountInfo, selectWebsocketUrl } from '../socketSelectors'; +import { IndexerWebsocket } from './lib/indexerWebsocket'; +import { IndexerWebsocketManager } from './lib/indexerWebsocketManager'; +import { WebsocketDerivedValue } from './lib/websocketDerivedValue'; + +function isValidSubaccount(childSubaccount: IndexerSubaccountResponseObject) { + return ( + Object.keys(childSubaccount.assetPositions).length > 0 || + Object.keys(childSubaccount.openPerpetualPositions).length > 0 + ); +} + +function convertToStoredChildSubaccount({ + address, + subaccountNumber, + assetPositions, + openPerpetualPositions, +}: IndexerSubaccountResponseObject): ChildSubaccountData { + return { + address, + subaccountNumber, + assetPositions, + openPerpetualPositions, + }; +} + +function freshChildSubaccount({ + address, + subaccountNumber, +}: { + address: string; + subaccountNumber: number; +}): ChildSubaccountData { + return { + address, + subaccountNumber, + assetPositions: {}, + openPerpetualPositions: {}, + }; +} + +function accountWebsocketValue( + websocket: IndexerWebsocket, + address: string, + parentSubaccountNumber: string, + onChange: (val: Loadable) => void +) { + return new WebsocketDerivedValue>( + websocket, + { + channel: 'v4_parent_subaccounts', + id: `${address}/${parentSubaccountNumber}`, + handleBaseData: (baseMessage) => { + const message = isWsParentSubaccountSubscribed(baseMessage); + accountRefreshSignal.notify(); + + return loadableLoaded({ + address: message.subaccount.address, + parentSubaccount: message.subaccount.parentSubaccountNumber, + childSubaccounts: keyBy( + message.subaccount.childSubaccounts + .filter(isValidSubaccount) + .map(convertToStoredChildSubaccount), + (c) => c.subaccountNumber + ), + ephemeral: { + orders: keyBy(message.orders, (o) => o.id), + }, + }); + }, + handleUpdates: (baseUpdates, value, fullMessage) => { + const updates = isWsParentSubaccountUpdates(baseUpdates); + const subaccountNumber = fullMessage?.subaccountNumber as number | undefined; + if (value.data == null || updates.length === 0 || subaccountNumber == null) { + return value; + } + const resultData = produce(value.data, (returnValue) => { + updates.forEach((update) => { + if (update.assetPositions != null) { + update.assetPositions.forEach((positionUpdate) => { + returnValue.childSubaccounts[positionUpdate.subaccountNumber] ??= + freshChildSubaccount({ + address, + subaccountNumber: positionUpdate.subaccountNumber, + }); + + const assetPositions = + returnValue.childSubaccounts[positionUpdate.subaccountNumber]!.assetPositions; + + if (assetPositions[positionUpdate.assetId] == null) { + assetPositions[positionUpdate.assetId] = + positionUpdate as IndexerAssetPositionResponseObject; + } else { + assetPositions[positionUpdate.assetId] = { + ...(assetPositions[ + positionUpdate.assetId + ] as IndexerAssetPositionResponseObject), + ...positionUpdate, + }; + } + }); + } + if (update.perpetualPositions != null) { + update.perpetualPositions.forEach((positionUpdate) => { + returnValue.childSubaccounts[positionUpdate.subaccountNumber] ??= + freshChildSubaccount({ + address, + subaccountNumber: positionUpdate.subaccountNumber, + }); + + const perpPositions = + returnValue.childSubaccounts[positionUpdate.subaccountNumber]! + .openPerpetualPositions; + + if (perpPositions[positionUpdate.market] == null) { + perpPositions[positionUpdate.market] = + positionUpdate as IndexerPerpetualPositionResponseObject; + } else { + perpPositions[positionUpdate.market] = { + ...(perpPositions[ + positionUpdate.market + ] as IndexerPerpetualPositionResponseObject), + ...positionUpdate, + }; + } + }); + } + if (update.tradingReward != null) { + returnValue.ephemeral.tradingRewards ??= []; + returnValue.ephemeral.tradingRewards = [ + ...returnValue.ephemeral.tradingRewards, + update.tradingReward, + ]; + } + if (update.fills != null) { + returnValue.ephemeral.fills ??= []; + returnValue.ephemeral.fills = [ + ...returnValue.ephemeral.fills, + ...update.fills.map((f) => ({ + ...f, + subaccountNumber, + // NOTE: provides ticker in ws response instead of market for soem reason + market: f.market ?? ((f as any).ticker as string), + })), + ]; + } + if (update.orders != null) { + returnValue.ephemeral.orders = { ...(returnValue.ephemeral.orders ?? {}) }; + const allOrders = returnValue.ephemeral.orders; + update.orders.forEach((o) => { + const previousOrder = allOrders[o.id]; + if (previousOrder == null) { + allOrders[o.id] = { + ...(o as IndexerOrderResponseObject), + subaccountNumber, + }; + } else { + allOrders[o.id] = { + ...(allOrders[o.id] as IndexerOrderResponseObject), + ...(o as IndexerWsOrderUpdate), + subaccountNumber, + }; + } + }); + } + if (update.transfers != null) { + returnValue.ephemeral.transfers ??= []; + returnValue.ephemeral.transfers = [ + ...returnValue.ephemeral.transfers, + update.transfers, + ]; + } + }); + }); + + return { ...value, data: resultData }; + }, + }, + loadablePending(), + onChange + ); +} + +const selectParentSubaccount = createAppSelector( + [selectWebsocketUrl, selectParentSubaccountInfo], + (wsUrl, { wallet, subaccount }) => ({ wsUrl, wallet, subaccount }) +); + +export function setUpParentSubaccount(store: RootStore) { + return createStoreEffect(store, selectParentSubaccount, ({ subaccount, wallet, wsUrl }) => { + if (!isTruthy(wallet) || subaccount == null) { + return undefined; + } + const thisTracker = accountWebsocketValue( + IndexerWebsocketManager.use(wsUrl), + wallet, + subaccount.toString(), + (val) => store.dispatch(setParentSubaccountRaw(val)) + ); + + return () => { + thisTracker.teardown(); + IndexerWebsocketManager.markDone(wsUrl); + store.dispatch(setParentSubaccountRaw(loadableIdle())); + }; + }); +} diff --git a/src/constants/analytics.ts b/src/constants/analytics.ts index 8428e9e99..35c0da9fc 100644 --- a/src/constants/analytics.ts +++ b/src/constants/analytics.ts @@ -324,7 +324,7 @@ export const AnalyticsEvents = unionize( Error: ofType<{ location: string; - error: Error; + error?: Error; metadata?: any; }>(), RouteError: ofType<{ diff --git a/src/constants/assetMetadata.ts b/src/constants/assetMetadata.ts index 14fa84e2c..6cc1256ae 100644 --- a/src/constants/assetMetadata.ts +++ b/src/constants/assetMetadata.ts @@ -1,17 +1,16 @@ -export type MetadataServiceInfoResponse = Record< - string, - { - name: string; - logo: string; - urls: { - website: string | null; - technical_doc: string | null; - cmc: string | null; - }; - sector_tags: string[] | null; - exchanges: any[] | null; - } ->; +export type MetadataServiceAssetInfo = { + name: string; + logo: string; + urls: { + website: string | null; + technical_doc: string | null; + cmc: string | null; + }; + sector_tags: string[] | null; + exchanges: any[] | null; +}; + +export type MetadataServiceInfoResponse = Record; export type MetadataServicePricesResponse = Record< string, diff --git a/src/hooks/useEndpointsConfig.ts b/src/hooks/useEndpointsConfig.ts index 53e76922d..92cdaf322 100644 --- a/src/hooks/useEndpointsConfig.ts +++ b/src/hooks/useEndpointsConfig.ts @@ -3,7 +3,7 @@ import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; import { getSelectedNetwork } from '@/state/appSelectors'; import { useAppSelector } from '@/state/appTypes'; -interface EndpointsConfig { +export interface EndpointsConfig { indexers: { api: string; socket: string; diff --git a/src/lib/telemetry.ts b/src/lib/telemetry.ts index 18b084676..075c4672c 100644 --- a/src/lib/telemetry.ts +++ b/src/lib/telemetry.ts @@ -4,7 +4,7 @@ import { isDev } from '@/constants/networks'; import { track } from './analytics/analytics'; import { dd } from './analytics/datadog'; -export const log = (location: string, error: Error, metadata?: object) => { +export const log = (location: string, error?: Error, metadata?: object) => { if (isDev) { // eslint-disable-next-line no-console console.warn('telemetry/log:', { location, error, metadata }); diff --git a/src/lib/testFlags.ts b/src/lib/testFlags.ts index 46ba5cbc5..dc4499797 100644 --- a/src/lib/testFlags.ts +++ b/src/lib/testFlags.ts @@ -1,3 +1,5 @@ +import { isDev } from '@/constants/networks'; + class TestFlags { public queryParams: { [key: string]: string }; @@ -60,6 +62,10 @@ class TestFlags { return !!this.queryParams.funkit_toggle; } + get useAbacusTs() { + return isDev; + } + get showNewDepositFlow() { return !!this.queryParams.deposit_rewrite; } diff --git a/src/state/_store.ts b/src/state/_store.ts index 29e79bf86..59f0af63d 100644 --- a/src/state/_store.ts +++ b/src/state/_store.ts @@ -4,6 +4,8 @@ import autoMergeLevel2 from 'redux-persist/lib/stateReconciler/autoMergeLevel2'; import storage from 'redux-persist/lib/storage'; import abacusStateManager from '@/lib/abacus'; +import { runFn } from '@/lib/do'; +import { testFlags } from '@/lib/testFlags'; import { accountSlice } from './account'; import { affiliatesSlice } from './affiliates'; @@ -23,6 +25,7 @@ import localizationMiddleware from './localizationMiddleware'; import { customCreateMigrate } from './migrations'; import { notificationsSlice } from './notifications'; import { perpetualsSlice } from './perpetuals'; +import { rawSlice } from './raw'; import { tradingViewSlice } from './tradingView'; import { vaultsSlice } from './vaults'; import { walletSlice } from './wallet'; @@ -46,6 +49,7 @@ const reducers = { tradingView: tradingViewSlice.reducer, vaults: vaultsSlice.reducer, wallet: walletSlice.reducer, + raw: rawSlice.reducer, } as const; const rootReducer = combineReducers(reducers); @@ -91,6 +95,14 @@ export const persistor = persistStore(store); // Set store so (Abacus & v4-Client) classes can getState and dispatch abacusStateManager.setStore(store); +if (testFlags.useAbacusTs) { + runFn(async () => { + const { storeLifecycles } = await import('@/abacus-ts/storeLifecycles'); + // we ignore the cleanups for now since we want these running forever + storeLifecycles.forEach((fn) => fn(store)); + }); +} + export type RootStore = typeof store; export type RootState = ReturnType; export type AppDispatch = RootStore['dispatch']; diff --git a/src/state/accountSelectors.ts b/src/state/accountSelectors.ts index c0ff08c5b..baba7393a 100644 --- a/src/state/accountSelectors.ts +++ b/src/state/accountSelectors.ts @@ -682,3 +682,8 @@ export const getComplianceUpdatedAt = (state: RootState) => state.account.compli * @returns compliance geo of the current session */ export const getGeo = (state: RootState) => state.account.compliance?.geo; + +export const getUserWalletAddress = (state: RootState) => state.account.wallet?.walletAddress; + +export const getUserSubaccountNumber = (state: RootState) => + state.account.subaccount?.subaccountNumber; diff --git a/src/state/raw.ts b/src/state/raw.ts new file mode 100644 index 000000000..651a81466 --- /dev/null +++ b/src/state/raw.ts @@ -0,0 +1,130 @@ +import { Loadable, loadableIdle } from '@/abacus-ts/lib/loadable'; +import { AssetInfos, MarketsData, OrderbookData, ParentSubaccountData } from '@/abacus-ts/rawTypes'; +import { + IndexerHistoricalBlockTradingRewardsResponse, + IndexerParentSubaccountTransferResponse, +} from '@/types/indexer/indexerApiGen'; +import { + IndexerCompositeFillResponse, + IndexerCompositeOrderObject, +} from '@/types/indexer/indexerManual'; +import { HeightResponse } from '@dydxprotocol/v4-client-js'; +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; + +import { DydxNetwork } from '@/constants/networks'; + +interface NetworkState { + indexerClientReady: boolean; + compositeClientReady: boolean; +} + +export interface RawDataState { + markets: { + allMarkets: Loadable; + assets: Loadable; + orderbooks: { [marketId: string]: Loadable }; + }; + account: { + parentSubaccount: Loadable; + fills: Loadable; + orders: Loadable<{ [id: string]: IndexerCompositeOrderObject }>; + transfers: Loadable; + blockTradingRewards: Loadable; + }; + network: { + [networkId: string]: NetworkState; + }; + heights: { + indexerHeight: Loadable; + validatorHeight: Loadable; + }; +} + +const initialState: RawDataState = { + markets: { allMarkets: loadableIdle(), assets: loadableIdle(), orderbooks: {} }, + account: { + parentSubaccount: loadableIdle(), + fills: loadableIdle(), + orders: loadableIdle(), + transfers: loadableIdle(), + blockTradingRewards: loadableIdle(), + }, + network: {}, + heights: { + indexerHeight: loadableIdle(), + validatorHeight: loadableIdle(), + }, +}; + +export const rawSlice = createSlice({ + name: 'Raw data', + initialState, + reducers: { + setAllMarketsRaw: (state, action: PayloadAction>) => { + state.markets.allMarkets = action.payload; + }, + setAllAssetsRaw: (state, action: PayloadAction>) => { + state.markets.assets = action.payload; + }, + setOrderbookRaw: ( + state, + action: PayloadAction<{ marketId: string; data: Loadable }> + ) => { + state.markets.orderbooks[action.payload.marketId] = action.payload.data; + }, + setParentSubaccountRaw: (state, action: PayloadAction>) => { + state.account.parentSubaccount = action.payload; + }, + setAccountFillsRaw: (state, action: PayloadAction>) => { + state.account.fills = action.payload; + }, + setAccountTransfersRaw: ( + state, + action: PayloadAction> + ) => { + state.account.transfers = action.payload; + }, + setAccountBlockTradingRewardsRaw: ( + state, + action: PayloadAction> + ) => { + state.account.blockTradingRewards = action.payload; + }, + setAccountOrdersRaw: ( + state, + action: PayloadAction> + ) => { + state.account.orders = action.payload; + }, + setNetworkStateRaw: ( + state, + action: PayloadAction<{ networkId: DydxNetwork; stateToMerge: Partial }> + ) => { + const { networkId, stateToMerge } = action.payload; + state.network[networkId] = { + ...(state.network[networkId] ?? { compositeClientReady: false, indexerClientReady: false }), + ...stateToMerge, + }; + }, + setIndexerHeightRaw: (state, action: PayloadAction>) => { + state.heights.indexerHeight = action.payload; + }, + setValidatorHeightRaw: (state, action: PayloadAction>) => { + state.heights.validatorHeight = action.payload; + }, + }, +}); + +export const { + setOrderbookRaw, + setAllMarketsRaw, + setAllAssetsRaw, + setParentSubaccountRaw, + setAccountFillsRaw, + setAccountOrdersRaw, + setAccountTransfersRaw, + setAccountBlockTradingRewardsRaw, + setNetworkStateRaw, + setIndexerHeightRaw, + setValidatorHeightRaw, +} = rawSlice.actions; diff --git a/src/types/indexer/indexerApiGen.ts b/src/types/indexer/indexerApiGen.ts new file mode 100644 index 000000000..4a4af9ee4 --- /dev/null +++ b/src/types/indexer/indexerApiGen.ts @@ -0,0 +1,1939 @@ +/** + * + * @export + * @interface APIOrderStatus + */ +export type IndexerAPIOrderStatus = IndexerOrderStatus | IndexerBestEffortOpenedStatus; +/** + * + * @export + * @enum {string} + */ +export enum IndexerAPITimeInForce { + GTT = 'GTT', + FOK = 'FOK', + IOC = 'IOC', +} +/** + * + * @export + * @interface AddressRegisterTokenBody + */ +export interface IndexerAddressRegisterTokenBody { + /** + * + * @type {string} + * @memberof AddressRegisterTokenBody + */ + language: string; + /** + * + * @type {string} + * @memberof AddressRegisterTokenBody + */ + token: string; +} +/** + * + * @export + * @interface AddressResponse + */ +export interface IndexerAddressResponse { + /** + * + * @type {Array} + * @memberof AddressResponse + */ + subaccounts: Array; + /** + * + * @type {string} + * @memberof AddressResponse + */ + totalTradingRewards: string; +} +/** + * + * @export + * @interface AffiliateAddressResponse + */ +export interface IndexerAffiliateAddressResponse { + /** + * + * @type {string} + * @memberof AffiliateAddressResponse + */ + address: string; +} +/** + * + * @export + * @interface AffiliateMetadataResponse + */ +export interface IndexerAffiliateMetadataResponse { + /** + * + * @type {string} + * @memberof AffiliateMetadataResponse + */ + referralCode: string; + /** + * + * @type {boolean} + * @memberof AffiliateMetadataResponse + */ + isVolumeEligible: boolean; + /** + * + * @type {boolean} + * @memberof AffiliateMetadataResponse + */ + isAffiliate: boolean; +} +/** + * + * @export + * @interface AffiliateSnapshotResponse + */ +export interface IndexerAffiliateSnapshotResponse { + /** + * + * @type {Array} + * @memberof AffiliateSnapshotResponse + */ + affiliateList: Array; + /** + * + * @type {number} + * @memberof AffiliateSnapshotResponse + */ + total: number; + /** + * + * @type {number} + * @memberof AffiliateSnapshotResponse + */ + currentOffset: number; +} +/** + * + * @export + * @interface AffiliateSnapshotResponseObject + */ +export interface IndexerAffiliateSnapshotResponseObject { + /** + * + * @type {string} + * @memberof AffiliateSnapshotResponseObject + */ + affiliateAddress: string; + /** + * + * @type {string} + * @memberof AffiliateSnapshotResponseObject + */ + affiliateReferralCode: string; + /** + * + * @type {number} + * @memberof AffiliateSnapshotResponseObject + */ + affiliateEarnings: number; + /** + * + * @type {number} + * @memberof AffiliateSnapshotResponseObject + */ + affiliateReferredTrades: number; + /** + * + * @type {number} + * @memberof AffiliateSnapshotResponseObject + */ + affiliateTotalReferredFees: number; + /** + * + * @type {number} + * @memberof AffiliateSnapshotResponseObject + */ + affiliateReferredUsers: number; + /** + * + * @type {number} + * @memberof AffiliateSnapshotResponseObject + */ + affiliateReferredNetProtocolEarnings: number; + /** + * + * @type {number} + * @memberof AffiliateSnapshotResponseObject + */ + affiliateReferredTotalVolume: number; + /** + * + * @type {number} + * @memberof AffiliateSnapshotResponseObject + */ + affiliateReferredMakerFees: number; + /** + * + * @type {number} + * @memberof AffiliateSnapshotResponseObject + */ + affiliateReferredTakerFees: number; + /** + * + * @type {number} + * @memberof AffiliateSnapshotResponseObject + */ + affiliateReferredMakerRebates: number; +} +/** + * + * @export + * @interface AffiliateTotalVolumeResponse + */ +export interface IndexerAffiliateTotalVolumeResponse { + /** + * + * @type {number} + * @memberof AffiliateTotalVolumeResponse + */ + totalVolume: number; +} +/** + * + * @export + * @interface AssetPositionResponse + */ +export interface IndexerAssetPositionResponse { + /** + * + * @type {Array} + * @memberof AssetPositionResponse + */ + positions: Array; +} +/** + * + * @export + * @interface AssetPositionResponseObject + */ +export interface IndexerAssetPositionResponseObject { + /** + * + * @type {string} + * @memberof AssetPositionResponseObject + */ + symbol: string; + /** + * + * @type {IndexerPositionSide} + * @memberof AssetPositionResponseObject + */ + side: IndexerPositionSide; + /** + * + * @type {string} + * @memberof AssetPositionResponseObject + */ + size: string; + /** + * + * @type {string} + * @memberof AssetPositionResponseObject + */ + assetId: string; + /** + * + * @type {number} + * @memberof AssetPositionResponseObject + */ + subaccountNumber: number; +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerBestEffortOpenedStatus { + BESTEFFORTOPENED = 'BEST_EFFORT_OPENED', +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerCandleResolution { + _1MIN = '1MIN', + _5MINS = '5MINS', + _15MINS = '15MINS', + _30MINS = '30MINS', + _1HOUR = '1HOUR', + _4HOURS = '4HOURS', + _1DAY = '1DAY', +} +/** + * + * @export + * @interface CandleResponse + */ +export interface IndexerCandleResponse { + /** + * + * @type {Array} + * @memberof CandleResponse + */ + candles: Array; +} +/** + * + * @export + * @interface CandleResponseObject + */ +export interface IndexerCandleResponseObject { + /** + * + * @type {IndexerIsoString} + * @memberof CandleResponseObject + */ + startedAt: IndexerIsoString; + /** + * + * @type {string} + * @memberof CandleResponseObject + */ + ticker: string; + /** + * + * @type {IndexerCandleResolution} + * @memberof CandleResponseObject + */ + resolution: IndexerCandleResolution; + /** + * + * @type {string} + * @memberof CandleResponseObject + */ + low: string; + /** + * + * @type {string} + * @memberof CandleResponseObject + */ + high: string; + /** + * + * @type {string} + * @memberof CandleResponseObject + */ + open: string; + /** + * + * @type {string} + * @memberof CandleResponseObject + */ + close: string; + /** + * + * @type {string} + * @memberof CandleResponseObject + */ + baseTokenVolume: string; + /** + * + * @type {string} + * @memberof CandleResponseObject + */ + usdVolume: string; + /** + * + * @type {number} + * @memberof CandleResponseObject + */ + trades: number; + /** + * + * @type {string} + * @memberof CandleResponseObject + */ + startingOpenInterest: string; + /** + * + * @type {string} + * @memberof CandleResponseObject + */ + orderbookMidPriceOpen?: string | null; + /** + * + * @type {string} + * @memberof CandleResponseObject + */ + orderbookMidPriceClose?: string | null; + /** + * + * @type {string} + * @memberof CandleResponseObject + */ + id: string; +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerComplianceReason { + MANUAL = 'MANUAL', + USGEO = 'US_GEO', + CAGEO = 'CA_GEO', + GBGEO = 'GB_GEO', + SANCTIONEDGEO = 'SANCTIONED_GEO', + COMPLIANCEPROVIDER = 'COMPLIANCE_PROVIDER', +} +/** + * + * @export + * @interface ComplianceResponse + */ +export interface IndexerComplianceResponse { + /** + * + * @type {boolean} + * @memberof ComplianceResponse + */ + restricted: boolean; + /** + * + * @type {string} + * @memberof ComplianceResponse + */ + reason?: string | null; +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerComplianceStatus { + COMPLIANT = 'COMPLIANT', + FIRSTSTRIKECLOSEONLY = 'FIRST_STRIKE_CLOSE_ONLY', + FIRSTSTRIKE = 'FIRST_STRIKE', + CLOSEONLY = 'CLOSE_ONLY', + BLOCKED = 'BLOCKED', +} +/** + * + * @export + * @interface ComplianceV2Response + */ +export interface IndexerComplianceV2Response { + /** + * + * @type {IndexerComplianceStatus} + * @memberof ComplianceV2Response + */ + status: IndexerComplianceStatus; + /** + * + * @type {IndexerComplianceReason} + * @memberof ComplianceV2Response + */ + reason?: IndexerComplianceReason | null; + /** + * + * @type {string} + * @memberof ComplianceV2Response + */ + updatedAt?: string | null; +} +/** + * + * @export + * @interface FillResponse + */ +export interface IndexerFillResponse { + /** + * + * @type {number} + * @memberof FillResponse + */ + pageSize?: number | null; + /** + * + * @type {number} + * @memberof FillResponse + */ + totalResults?: number | null; + /** + * + * @type {number} + * @memberof FillResponse + */ + offset?: number | null; + /** + * + * @type {Array} + * @memberof FillResponse + */ + fills: Array; +} +/** + * + * @export + * @interface FillResponseObject + */ +export interface IndexerFillResponseObject { + /** + * + * @type {string} + * @memberof FillResponseObject + */ + id: string; + /** + * + * @type {IndexerOrderSide} + * @memberof FillResponseObject + */ + side: IndexerOrderSide; + /** + * + * @type {IndexerLiquidity} + * @memberof FillResponseObject + */ + liquidity: IndexerLiquidity; + /** + * + * @type {IndexerFillType} + * @memberof FillResponseObject + */ + type: IndexerFillType; + /** + * + * @type {string} + * @memberof FillResponseObject + */ + market: string; + /** + * + * @type {IndexerMarketType} + * @memberof FillResponseObject + */ + marketType: IndexerMarketType; + /** + * + * @type {string} + * @memberof FillResponseObject + */ + price: string; + /** + * + * @type {string} + * @memberof FillResponseObject + */ + size: string; + /** + * + * @type {string} + * @memberof FillResponseObject + */ + fee: string; + /** + * + * @type {string} + * @memberof FillResponseObject + */ + affiliateRevShare: string; + /** + * + * @type {IndexerIsoString} + * @memberof FillResponseObject + */ + createdAt: IndexerIsoString; + /** + * + * @type {string} + * @memberof FillResponseObject + */ + createdAtHeight: string; + /** + * + * @type {string} + * @memberof FillResponseObject + */ + orderId?: string | null; + /** + * + * @type {string} + * @memberof FillResponseObject + */ + clientMetadata?: string | null; + /** + * + * @type {number} + * @memberof FillResponseObject + */ + subaccountNumber: number; +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerFillType { + LIMIT = 'LIMIT', + LIQUIDATED = 'LIQUIDATED', + LIQUIDATION = 'LIQUIDATION', + DELEVERAGED = 'DELEVERAGED', + OFFSETTING = 'OFFSETTING', +} +/** + * + * @export + * @interface HeightResponse + */ +export interface IndexerHeightResponse { + /** + * + * @type {string} + * @memberof HeightResponse + */ + height: string; + /** + * + * @type {IndexerIsoString} + * @memberof HeightResponse + */ + time: IndexerIsoString; +} +/** + * + * @export + * @interface HistoricalBlockTradingReward + */ +export interface IndexerHistoricalBlockTradingReward { + /** + * + * @type {string} + * @memberof HistoricalBlockTradingReward + */ + tradingReward: string; + /** + * + * @type {IndexerIsoString} + * @memberof HistoricalBlockTradingReward + */ + createdAt: IndexerIsoString; + /** + * + * @type {string} + * @memberof HistoricalBlockTradingReward + */ + createdAtHeight: string; +} +/** + * + * @export + * @interface HistoricalBlockTradingRewardsResponse + */ +export interface IndexerHistoricalBlockTradingRewardsResponse { + /** + * + * @type {Array} + * @memberof HistoricalBlockTradingRewardsResponse + */ + rewards: Array; +} +/** + * + * @export + * @interface HistoricalFundingResponse + */ +export interface IndexerHistoricalFundingResponse { + /** + * + * @type {Array} + * @memberof HistoricalFundingResponse + */ + historicalFunding: Array; +} +/** + * + * @export + * @interface HistoricalFundingResponseObject + */ +export interface IndexerHistoricalFundingResponseObject { + /** + * + * @type {string} + * @memberof HistoricalFundingResponseObject + */ + ticker: string; + /** + * + * @type {string} + * @memberof HistoricalFundingResponseObject + */ + rate: string; + /** + * + * @type {string} + * @memberof HistoricalFundingResponseObject + */ + price: string; + /** + * + * @type {IndexerIsoString} + * @memberof HistoricalFundingResponseObject + */ + effectiveAt: IndexerIsoString; + /** + * + * @type {string} + * @memberof HistoricalFundingResponseObject + */ + effectiveAtHeight: string; +} +/** + * + * @export + * @interface HistoricalPnlResponse + */ +export interface IndexerHistoricalPnlResponse { + /** + * + * @type {number} + * @memberof HistoricalPnlResponse + */ + pageSize?: number | null; + /** + * + * @type {number} + * @memberof HistoricalPnlResponse + */ + totalResults?: number | null; + /** + * + * @type {number} + * @memberof HistoricalPnlResponse + */ + offset?: number | null; + /** + * + * @type {Array} + * @memberof HistoricalPnlResponse + */ + historicalPnl: Array; +} +/** + * + * @export + * @interface HistoricalTradingRewardAggregation + */ +export interface IndexerHistoricalTradingRewardAggregation { + /** + * + * @type {string} + * @memberof HistoricalTradingRewardAggregation + */ + tradingReward: string; + /** + * + * @type {IndexerIsoString} + * @memberof HistoricalTradingRewardAggregation + */ + startedAt: IndexerIsoString; + /** + * + * @type {string} + * @memberof HistoricalTradingRewardAggregation + */ + startedAtHeight: string; + /** + * + * @type {IndexerIsoString} + * @memberof HistoricalTradingRewardAggregation + */ + endedAt?: IndexerIsoString | null; + /** + * + * @type {string} + * @memberof HistoricalTradingRewardAggregation + */ + endedAtHeight?: string | null; + /** + * + * @type {IndexerTradingRewardAggregationPeriod} + * @memberof HistoricalTradingRewardAggregation + */ + period: IndexerTradingRewardAggregationPeriod; +} +/** + * + * @export + * @interface HistoricalTradingRewardAggregationsResponse + */ +export interface IndexerHistoricalTradingRewardAggregationsResponse { + /** + * + * @type {Array} + * @memberof HistoricalTradingRewardAggregationsResponse + */ + rewards: Array; +} +/** + * + * @export + */ +export type IndexerIsoString = string; +/** + * + * @export + * @enum {string} + */ +export enum IndexerLiquidity { + TAKER = 'TAKER', + MAKER = 'MAKER', +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerMarketType { + PERPETUAL = 'PERPETUAL', + SPOT = 'SPOT', +} +/** + * + * @export + * @interface MegavaultHistoricalPnlResponse + */ +export interface IndexerMegavaultHistoricalPnlResponse { + /** + * + * @type {Array} + * @memberof MegavaultHistoricalPnlResponse + */ + megavaultPnl: Array; +} +/** + * + * @export + * @interface MegavaultPositionResponse + */ +export interface IndexerMegavaultPositionResponse { + /** + * + * @type {Array} + * @memberof MegavaultPositionResponse + */ + positions: Array; +} +/** + * + * @export + * @interface OrderResponseObject + */ +export interface IndexerOrderResponseObject { + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + id: string; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + subaccountId: string; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + clientId: string; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + clobPairId: string; + /** + * + * @type {IndexerOrderSide} + * @memberof OrderResponseObject + */ + side: IndexerOrderSide; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + size: string; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + totalFilled: string; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + price: string; + /** + * + * @type {IndexerOrderType} + * @memberof OrderResponseObject + */ + type: IndexerOrderType; + /** + * + * @type {boolean} + * @memberof OrderResponseObject + */ + reduceOnly: boolean; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + orderFlags: string; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + goodTilBlock?: string | null; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + goodTilBlockTime?: string | null; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + createdAtHeight?: string | null; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + clientMetadata: string; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + triggerPrice?: string | null; + /** + * + * @type {IndexerAPITimeInForce} + * @memberof OrderResponseObject + */ + timeInForce: IndexerAPITimeInForce; + /** + * + * @type {IndexerAPIOrderStatus} + * @memberof OrderResponseObject + */ + status: IndexerAPIOrderStatus; + /** + * + * @type {boolean} + * @memberof OrderResponseObject + */ + postOnly: boolean; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + ticker: string; + /** + * + * @type {IndexerIsoString} + * @memberof OrderResponseObject + */ + updatedAt?: IndexerIsoString | null; + /** + * + * @type {string} + * @memberof OrderResponseObject + */ + updatedAtHeight?: string | null; + /** + * + * @type {number} + * @memberof OrderResponseObject + */ + subaccountNumber: number; +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerOrderSide { + BUY = 'BUY', + SELL = 'SELL', +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerOrderStatus { + OPEN = 'OPEN', + FILLED = 'FILLED', + CANCELED = 'CANCELED', + BESTEFFORTCANCELED = 'BEST_EFFORT_CANCELED', + UNTRIGGERED = 'UNTRIGGERED', +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerOrderType { + LIMIT = 'LIMIT', + MARKET = 'MARKET', + STOPLIMIT = 'STOP_LIMIT', + STOPMARKET = 'STOP_MARKET', + TRAILINGSTOP = 'TRAILING_STOP', + TAKEPROFIT = 'TAKE_PROFIT', + TAKEPROFITMARKET = 'TAKE_PROFIT_MARKET', +} +/** + * + * @export + * @interface OrderbookResponseObject + */ +export interface IndexerOrderbookResponseObject { + /** + * + * @type {Array} + * @memberof OrderbookResponseObject + */ + bids: Array; + /** + * + * @type {Array} + * @memberof OrderbookResponseObject + */ + asks: Array; +} +/** + * + * @export + * @interface OrderbookResponsePriceLevel + */ +export interface IndexerOrderbookResponsePriceLevel { + /** + * + * @type {string} + * @memberof OrderbookResponsePriceLevel + */ + price: string; + /** + * + * @type {string} + * @memberof OrderbookResponsePriceLevel + */ + size: string; +} +/** + * + * @export + * @interface ParentSubaccountResponse + */ +export interface IndexerParentSubaccountResponse { + /** + * + * @type {string} + * @memberof ParentSubaccountResponse + */ + address: string; + /** + * + * @type {number} + * @memberof ParentSubaccountResponse + */ + parentSubaccountNumber: number; + /** + * + * @type {string} + * @memberof ParentSubaccountResponse + */ + equity: string; + /** + * + * @type {string} + * @memberof ParentSubaccountResponse + */ + freeCollateral: string; + /** + * + * @type {Array} + * @memberof ParentSubaccountResponse + */ + childSubaccounts: Array; +} +/** + * + * @export + * @interface ParentSubaccountTransferResponse + */ +export interface IndexerParentSubaccountTransferResponse { + /** + * + * @type {number} + * @memberof ParentSubaccountTransferResponse + */ + pageSize?: number | null; + /** + * + * @type {number} + * @memberof ParentSubaccountTransferResponse + */ + totalResults?: number | null; + /** + * + * @type {number} + * @memberof ParentSubaccountTransferResponse + */ + offset?: number | null; + /** + * + * @type {Array} + * @memberof ParentSubaccountTransferResponse + */ + transfers: Array; +} +/** + * + * @export + * @interface PerpetualMarketResponse + */ +export interface IndexerPerpetualMarketResponse { + /** + * + * @type {{ [key: string]: IndexerPerpetualMarketResponseObject; }} + * @memberof PerpetualMarketResponse + */ + markets: { [key: string]: IndexerPerpetualMarketResponseObject }; +} +/** + * + * @export + * @interface PerpetualMarketResponseObject + */ +export interface IndexerPerpetualMarketResponseObject { + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + clobPairId: string; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + ticker: string; + /** + * + * @type {IndexerPerpetualMarketStatus} + * @memberof PerpetualMarketResponseObject + */ + status: IndexerPerpetualMarketStatus; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + oraclePrice: string; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + priceChange24H: string; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + volume24H: string; + /** + * + * @type {number} + * @memberof PerpetualMarketResponseObject + */ + trades24H: number; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + nextFundingRate: string; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + initialMarginFraction: string; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + maintenanceMarginFraction: string; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + openInterest: string; + /** + * + * @type {number} + * @memberof PerpetualMarketResponseObject + */ + atomicResolution: number; + /** + * + * @type {number} + * @memberof PerpetualMarketResponseObject + */ + quantumConversionExponent: number; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + tickSize: string; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + stepSize: string; + /** + * + * @type {number} + * @memberof PerpetualMarketResponseObject + */ + stepBaseQuantums: number; + /** + * + * @type {number} + * @memberof PerpetualMarketResponseObject + */ + subticksPerTick: number; + /** + * + * @type {IndexerPerpetualMarketType} + * @memberof PerpetualMarketResponseObject + */ + marketType: IndexerPerpetualMarketType; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + openInterestLowerCap?: string | null; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + openInterestUpperCap?: string | null; + /** + * + * @type {string} + * @memberof PerpetualMarketResponseObject + */ + baseOpenInterest: string; +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerPerpetualMarketStatus { + ACTIVE = 'ACTIVE', + PAUSED = 'PAUSED', + CANCELONLY = 'CANCEL_ONLY', + POSTONLY = 'POST_ONLY', + INITIALIZING = 'INITIALIZING', + FINALSETTLEMENT = 'FINAL_SETTLEMENT', +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerPerpetualMarketType { + CROSS = 'CROSS', + ISOLATED = 'ISOLATED', +} +/** + * + * @export + * @interface PerpetualPositionResponse + */ +export interface IndexerPerpetualPositionResponse { + /** + * + * @type {Array} + * @memberof PerpetualPositionResponse + */ + positions: Array; +} +/** + * + * @export + * @interface PerpetualPositionResponseObject + */ +export interface IndexerPerpetualPositionResponseObject { + /** + * + * @type {string} + * @memberof PerpetualPositionResponseObject + */ + market: string; + /** + * + * @type {IndexerPerpetualPositionStatus} + * @memberof PerpetualPositionResponseObject + */ + status: IndexerPerpetualPositionStatus; + /** + * + * @type {IndexerPositionSide} + * @memberof PerpetualPositionResponseObject + */ + side: IndexerPositionSide; + /** + * + * @type {string} + * @memberof PerpetualPositionResponseObject + */ + size: string; + /** + * + * @type {string} + * @memberof PerpetualPositionResponseObject + */ + maxSize: string; + /** + * + * @type {string} + * @memberof PerpetualPositionResponseObject + */ + entryPrice: string; + /** + * + * @type {string} + * @memberof PerpetualPositionResponseObject + */ + realizedPnl: string; + /** + * + * @type {IndexerIsoString} + * @memberof PerpetualPositionResponseObject + */ + createdAt: IndexerIsoString; + /** + * + * @type {string} + * @memberof PerpetualPositionResponseObject + */ + createdAtHeight: string; + /** + * + * @type {string} + * @memberof PerpetualPositionResponseObject + */ + sumOpen: string; + /** + * + * @type {string} + * @memberof PerpetualPositionResponseObject + */ + sumClose: string; + /** + * + * @type {string} + * @memberof PerpetualPositionResponseObject + */ + netFunding: string; + /** + * + * @type {string} + * @memberof PerpetualPositionResponseObject + */ + unrealizedPnl: string; + /** + * + * @type {IndexerIsoString} + * @memberof PerpetualPositionResponseObject + */ + closedAt?: IndexerIsoString | null; + /** + * + * @type {string} + * @memberof PerpetualPositionResponseObject + */ + exitPrice?: string | null; + /** + * + * @type {number} + * @memberof PerpetualPositionResponseObject + */ + subaccountNumber: number; +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerPerpetualPositionStatus { + OPEN = 'OPEN', + CLOSED = 'CLOSED', + LIQUIDATED = 'LIQUIDATED', +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerPnlTickInterval { + Hour = 'hour', + Day = 'day', +} +/** + * + * @export + * @interface PnlTicksResponseObject + */ +export interface IndexerPnlTicksResponseObject { + /** + * + * @type {string} + * @memberof PnlTicksResponseObject + */ + id: string; + /** + * + * @type {string} + * @memberof PnlTicksResponseObject + */ + subaccountId: string; + /** + * + * @type {string} + * @memberof PnlTicksResponseObject + */ + equity: string; + /** + * + * @type {string} + * @memberof PnlTicksResponseObject + */ + totalPnl: string; + /** + * + * @type {string} + * @memberof PnlTicksResponseObject + */ + netTransfers: string; + /** + * + * @type {string} + * @memberof PnlTicksResponseObject + */ + createdAt: string; + /** + * + * @type {string} + * @memberof PnlTicksResponseObject + */ + blockHeight: string; + /** + * + * @type {IndexerIsoString} + * @memberof PnlTicksResponseObject + */ + blockTime: IndexerIsoString; +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerPositionSide { + LONG = 'LONG', + SHORT = 'SHORT', +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerSparklineTimePeriod { + ONEDAY = 'ONE_DAY', + SEVENDAYS = 'SEVEN_DAYS', +} +/** + * + * @export + * @interface SubaccountResponseObject + */ +export interface IndexerSubaccountResponseObject { + /** + * + * @type {string} + * @memberof SubaccountResponseObject + */ + address: string; + /** + * + * @type {number} + * @memberof SubaccountResponseObject + */ + subaccountNumber: number; + /** + * + * @type {string} + * @memberof SubaccountResponseObject + */ + equity: string; + /** + * + * @type {string} + * @memberof SubaccountResponseObject + */ + freeCollateral: string; + /** + * + * @type {PerpetualPositionsMap} + * @memberof SubaccountResponseObject + */ + openPerpetualPositions: { [market: string]: IndexerPerpetualPositionResponseObject }; + /** + * + * @type {AssetPositionsMap} + * @memberof SubaccountResponseObject + */ + assetPositions: { [symbol: string]: IndexerAssetPositionResponseObject }; + /** + * + * @type {boolean} + * @memberof SubaccountResponseObject + */ + marginEnabled: boolean; + /** + * + * @type {string} + * @memberof SubaccountResponseObject + */ + updatedAtHeight: string; + /** + * + * @type {string} + * @memberof SubaccountResponseObject + */ + latestProcessedBlockHeight: string; +} +/** + * + * @export + * @interface TimeResponse + */ +export interface IndexerTimeResponse { + /** + * + * @type {IndexerIsoString} + * @memberof TimeResponse + */ + iso: IndexerIsoString; + /** + * + * @type {number} + * @memberof TimeResponse + */ + epoch: number; +} +/** + * + * @export + * @interface TradeResponse + */ +export interface IndexerTradeResponse { + /** + * + * @type {number} + * @memberof TradeResponse + */ + pageSize?: number | null; + /** + * + * @type {number} + * @memberof TradeResponse + */ + totalResults?: number | null; + /** + * + * @type {number} + * @memberof TradeResponse + */ + offset?: number | null; + /** + * + * @type {Array} + * @memberof TradeResponse + */ + trades: Array; +} +/** + * + * @export + * @interface TradeResponseObject + */ +export interface IndexerTradeResponseObject { + /** + * + * @type {string} + * @memberof TradeResponseObject + */ + id: string; + /** + * + * @type {IndexerOrderSide} + * @memberof TradeResponseObject + */ + side: IndexerOrderSide; + /** + * + * @type {string} + * @memberof TradeResponseObject + */ + size: string; + /** + * + * @type {string} + * @memberof TradeResponseObject + */ + price: string; + /** + * + * @type {IndexerTradeType} + * @memberof TradeResponseObject + */ + type: IndexerTradeType; + /** + * + * @type {IndexerIsoString} + * @memberof TradeResponseObject + */ + createdAt: IndexerIsoString; + /** + * + * @type {string} + * @memberof TradeResponseObject + */ + createdAtHeight: string; +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerTradeType { + LIMIT = 'LIMIT', + LIQUIDATED = 'LIQUIDATED', + DELEVERAGED = 'DELEVERAGED', +} +/** + * + * @export + * @interface TraderSearchResponse + */ +export interface IndexerTraderSearchResponse { + /** + * + * @type {IndexerTraderSearchResponseObject} + * @memberof TraderSearchResponse + */ + result?: IndexerTraderSearchResponseObject | null; +} +/** + * + * @export + * @interface TraderSearchResponseObject + */ +export interface IndexerTraderSearchResponseObject { + /** + * + * @type {string} + * @memberof TraderSearchResponseObject + */ + address: string; + /** + * + * @type {number} + * @memberof TraderSearchResponseObject + */ + subaccountNumber: number; + /** + * + * @type {string} + * @memberof TraderSearchResponseObject + */ + subaccountId: string; + /** + * + * @type {string} + * @memberof TraderSearchResponseObject + */ + username: string; +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerTradingRewardAggregationPeriod { + DAILY = 'DAILY', + WEEKLY = 'WEEKLY', + MONTHLY = 'MONTHLY', +} +/** + * + * @export + * @interface TransferBetweenResponse + */ +export interface IndexerTransferBetweenResponse { + /** + * + * @type {number} + * @memberof TransferBetweenResponse + */ + pageSize?: number | null; + /** + * + * @type {number} + * @memberof TransferBetweenResponse + */ + totalResults?: number | null; + /** + * + * @type {number} + * @memberof TransferBetweenResponse + */ + offset?: number | null; + /** + * + * @type {Array} + * @memberof TransferBetweenResponse + */ + transfersSubset: Array; + /** + * + * @type {string} + * @memberof TransferBetweenResponse + */ + totalNetTransfers: string; +} +/** + * + * @export + * @interface TransferResponse + */ +export interface IndexerTransferResponse { + /** + * + * @type {number} + * @memberof TransferResponse + */ + pageSize?: number | null; + /** + * + * @type {number} + * @memberof TransferResponse + */ + totalResults?: number | null; + /** + * + * @type {number} + * @memberof TransferResponse + */ + offset?: number | null; + /** + * + * @type {Array} + * @memberof TransferResponse + */ + transfers: Array; +} +/** + * + * @export + * @interface TransferResponseObject + */ +export interface IndexerTransferResponseObject { + /** + * + * @type {string} + * @memberof TransferResponseObject + */ + id: string; + /** + * + * @type {IndexerTransferResponseObjectSender} + * @memberof TransferResponseObject + */ + sender: IndexerTransferResponseObjectSender; + /** + * + * @type {IndexerTransferResponseObjectSender} + * @memberof TransferResponseObject + */ + recipient: IndexerTransferResponseObjectSender; + /** + * + * @type {string} + * @memberof TransferResponseObject + */ + size: string; + /** + * + * @type {string} + * @memberof TransferResponseObject + */ + createdAt: string; + /** + * + * @type {string} + * @memberof TransferResponseObject + */ + createdAtHeight: string; + /** + * + * @type {string} + * @memberof TransferResponseObject + */ + symbol: string; + /** + * + * @type {IndexerTransferType} + * @memberof TransferResponseObject + */ + type: IndexerTransferType; + /** + * + * @type {string} + * @memberof TransferResponseObject + */ + transactionHash: string; +} +/** + * + * @export + * @interface TransferResponseObjectSender + */ +export interface IndexerTransferResponseObjectSender { + /** + * + * @type {number} + * @memberof TransferResponseObjectSender + */ + subaccountNumber?: number | null; + /** + * + * @type {string} + * @memberof TransferResponseObjectSender + */ + address: string; +} +/** + * + * @export + * @enum {string} + */ +export enum IndexerTransferType { + TRANSFERIN = 'TRANSFER_IN', + TRANSFEROUT = 'TRANSFER_OUT', + DEPOSIT = 'DEPOSIT', + WITHDRAWAL = 'WITHDRAWAL', +} +/** + * + * @export + * @interface VaultHistoricalPnl + */ +export interface IndexerVaultHistoricalPnl { + /** + * + * @type {string} + * @memberof VaultHistoricalPnl + */ + ticker: string; + /** + * + * @type {Array} + * @memberof VaultHistoricalPnl + */ + historicalPnl: Array; +} +/** + * + * @export + * @interface VaultPosition + */ +export interface IndexerVaultPosition { + /** + * + * @type {string} + * @memberof VaultPosition + */ + ticker: string; + /** + * + * @type {IndexerAssetPositionResponseObject} + * @memberof VaultPosition + */ + assetPosition: IndexerAssetPositionResponseObject; + /** + * + * @type {IndexerPerpetualPositionResponseObject} + * @memberof VaultPosition + */ + perpetualPosition?: IndexerPerpetualPositionResponseObject | null; + /** + * + * @type {string} + * @memberof VaultPosition + */ + equity: string; +} +/** + * + * @export + * @interface VaultsHistoricalPnlResponse + */ +export interface IndexerVaultsHistoricalPnlResponse { + /** + * + * @type {Array} + * @memberof VaultsHistoricalPnlResponse + */ + vaultsPnl: Array; +} diff --git a/src/types/indexer/indexerChecks.ts b/src/types/indexer/indexerChecks.ts new file mode 100644 index 000000000..e3c3805ee --- /dev/null +++ b/src/types/indexer/indexerChecks.ts @@ -0,0 +1,32 @@ +import typia from 'typia'; + +import { + IndexerHistoricalBlockTradingRewardsResponse, + IndexerOrderbookResponseObject, + IndexerParentSubaccountTransferResponse, + IndexerPerpetualMarketResponse, +} from './indexerApiGen'; +import { + IndexerCompositeFillResponse, + IndexerCompositeOrderObject, + IndexerWsMarketUpdateResponse, + IndexerWsOrderbookUpdateResponse, + IndexerWsParentSubaccountSubscribedResponse, + IndexerWsParentSubaccountUpdateObject, +} from './indexerManual'; + +export const isWsParentSubaccountSubscribed = + typia.createAssert(); +export const isWsParentSubaccountUpdates = + typia.createAssert(); +export const isWsPerpetualMarketResponse = typia.createAssert(); +export const isWsMarketUpdateResponses = typia.createAssert(); +export const isWsOrderbookResponse = typia.createAssert(); +export const isWsOrderbookUpdateResponses = + typia.createAssert(); +export const isParentSubaccountFillResponse = typia.createAssert(); +export const isParentSubaccountOrders = typia.createAssert(); +export const isParentSubaccountTransferResponse = + typia.createAssert(); +export const isParentSubaccountBlockRewardResponse = + typia.createAssert(); diff --git a/src/types/indexer/indexerManual.ts b/src/types/indexer/indexerManual.ts new file mode 100644 index 000000000..f7d4dc28a --- /dev/null +++ b/src/types/indexer/indexerManual.ts @@ -0,0 +1,151 @@ +import { + IndexerAPIOrderStatus, + IndexerAPITimeInForce, + IndexerAssetPositionResponseObject, + IndexerFillType, + IndexerHistoricalBlockTradingReward, + IndexerIsoString, + IndexerLiquidity, + IndexerMarketType, + IndexerOrderResponseObject, + IndexerOrderSide, + IndexerOrderType, + IndexerParentSubaccountResponse, + IndexerPerpetualMarketStatus, + IndexerPerpetualMarketType, + IndexerPerpetualPositionResponseObject, + IndexerTransferResponseObject, +} from './indexerApiGen'; + +export interface IndexerCompositeFillResponse { + pageSize?: number; + totalResults?: number; + offset?: number; + fills?: IndexerCompositeFillObject[]; +} + +export interface IndexerCompositeOrderObject { + id: string; + subaccountId?: string; + clientId?: string; + clobPairId?: string; + side?: IndexerOrderSide; + size?: string; + totalFilled?: string; + price?: string; + type?: IndexerOrderType; + reduceOnly?: boolean; + orderFlags?: string; + goodTilBlock?: string | null; + goodTilBlockTime?: string | null; + createdAtHeight?: string | null; + clientMetadata?: string; + triggerPrice?: string | null; + timeInForce?: IndexerAPITimeInForce; + status?: IndexerAPIOrderStatus; + postOnly?: boolean; + ticker?: string; + updatedAt?: IndexerIsoString | null; + updatedAtHeight?: string | null; + subaccountNumber?: number; + removalReason?: string; + totalOptimisticFilled?: string; +} + +export interface IndexerCompositeMarketObject { + clobPairId?: string; + ticker?: string; + status?: IndexerPerpetualMarketStatus; + oraclePrice?: string; + priceChange24H?: string; + volume24H?: string; + trades24H?: number; + nextFundingRate?: string; + initialMarginFraction?: string; + maintenanceMarginFraction?: string; + openInterest?: string; + atomicResolution?: number; + quantumConversionExponent?: number; + tickSize?: string; + stepSize?: string; + stepBaseQuantums?: number; + subticksPerTick?: number; + marketType?: IndexerPerpetualMarketType; + openInterestLowerCap?: string; + openInterestUpperCap?: string; + baseOpenInterest?: string; + id?: string; + marketId?: number; + baseAsset?: string; + quoteAsset?: string; + basePositionSize?: string; + incrementalPositionSize?: string; + maxPositionSize?: string; + incrementalInitialMarginFraction?: string; +} + +export interface IndexerWsOrderbookUpdateResponse { + asks?: IndexerWsOrderbookUpdateItem[]; + bids?: IndexerWsOrderbookUpdateItem[]; +} + +export type IndexerWsOrderbookUpdateItem = [string, string]; + +export interface IndexerWsMarketUpdateResponse { + trading?: { [key: string]: IndexerCompositeMarketObject }; + oraclePrices?: { [key: string]: IndexerWsMarketOraclePriceObject }; +} + +export interface IndexerWsMarketOraclePriceObject { + oraclePrice?: string; + effectiveAt?: IndexerIsoString; + effectiveAtHeight?: string; + marketId?: number; +} + +export interface IndexerCompositeFillObject { + id?: string; + side?: IndexerOrderSide; + liquidity?: IndexerLiquidity; + type?: IndexerFillType; + marketType?: IndexerMarketType; + price?: string; + size?: string; + fee?: string; + affiliateRevShare?: string; + createdAt?: IndexerIsoString; + createdAtHeight?: string; + orderId?: string | null; + clientMetadata?: string | null; + subaccountNumber?: number; + market?: string; +} + +export interface IndexerWsParentSubaccountSubscribedResponse { + subaccount: IndexerParentSubaccountResponse; + blockHeight: string; + orders: IndexerOrderResponseObject[]; +} + +export type IndexerWsAssetUpdate = Partial & { + subaccountNumber: number; + assetId: string; +}; +export type IndexerWsPositionUpdate = Partial & { + subaccountNumber: number; + market: string; +}; + +export type IndexerWsOrderUpdate = Partial< + Omit +> & { id: string }; + +export interface IndexerWsParentSubaccountUpdateObject { + blockHeight: string; + assetPositions?: Array; + perpetualPositions?: Array; + tradingReward?: IndexerHistoricalBlockTradingReward; + fills?: IndexerCompositeFillObject[]; + orders?: Array; + transfers?: IndexerTransferResponseObject; +} diff --git a/tsconfig.json b/tsconfig.json index 6efb2030c..0d8d4404e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,11 @@ "compilerOptions": { "target": "ESNext", "useDefineForClassFields": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], "allowJs": false, "skipLibCheck": true, "esModuleInterop": false, @@ -20,10 +24,33 @@ "useUnknownInCatchVariables": false, "noUncheckedIndexedAccess": true, "paths": { - "@/*": ["src/*"] + "@/*": [ + "src/*" + ] }, - "types": ["node", "@wdio/globals", "mocha"] + "types": [ + "node", + "@wdio/globals", + "mocha" + ], + "plugins": [ + { + "transform": "typia/lib/transform" + } + ], + "strictNullChecks": true }, - "include": ["src", "scripts", "styled.d.ts", "__tests__", "wdio.conf.ts", "types"], - "references": [{ "path": "./tsconfig.node.json" }] -} + "include": [ + "src", + "scripts", + "styled.d.ts", + "__tests__", + "wdio.conf.ts", + "types" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index 6d29f9b77..057ab9a23 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,3 +1,4 @@ +import UnpluginTypia from '@ryoppippi/unplugin-typia/vite'; import react from '@vitejs/plugin-react'; import fs from 'fs'; import path from 'path'; @@ -52,6 +53,8 @@ export default defineConfig(({ mode }) => ({ }, plugins: [ nodePolyfills(), + UnpluginTypia({}), + react({ babel: { plugins: [