diff --git a/bun.lock b/bun.lock index 3419bab2c1..32459ae3be 100644 --- a/bun.lock +++ b/bun.lock @@ -644,7 +644,7 @@ "@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.8", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.4", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.0", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.13.0", "smol-toml": "^1.4.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1", "vfile": "^6.0.3" } }, "sha512-uFNyFWadnULWK2cOw4n0hLKeu+xaVWeuECdP10cQ3K2fkybtTlhb7J7TcScdjmS8Yps7oje9S/ehYMfZrhrgCg=="], - "@astrojs/mdx": ["@astrojs/mdx@4.3.9", "", { "dependencies": { "@astrojs/markdown-remark": "6.3.8", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.15.0", "es-module-lexer": "^1.7.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "picocolors": "^1.1.1", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-80LHiM4z3FxAjATHNgFpa8nlTNSprAWB4UUKnr/QG56Pwk7uRnJWrXlok4wSCi/3fg8kTZ98A408Q91M+iqJdw=="], + "@astrojs/mdx": ["@astrojs/mdx@4.3.10", "", { "dependencies": { "@astrojs/markdown-remark": "6.3.8", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.15.0", "es-module-lexer": "^1.7.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "picocolors": "^1.1.1", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-2T5+XIr7PMqMeXhRofXY5NlY4lA0Km+wkfsqmr9lq5KXUHpGlKPQ9dlDZJP9E/CtljJyEBNS17zq66LrIJ1tiQ=="], "@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="], @@ -776,7 +776,7 @@ "@cardano-sdk/crypto": ["@cardano-sdk/crypto@0.2.3", "", { "dependencies": { "@cardano-sdk/util": "~0.16.0", "blake2b": "^2.1.4", "i": "^0.3.7", "libsodium-wrappers-sumo": "^0.7.5", "lodash": "^4.17.21", "npm": "^9.3.0", "pbkdf2": "^3.1.2", "ts-custom-error": "^3.2.0", "ts-log": "^2.2.4" }, "peerDependencies": { "@dcspark/cardano-multiplatform-lib-asmjs": "^3.1.1", "@dcspark/cardano-multiplatform-lib-browser": "^3.1.1", "@dcspark/cardano-multiplatform-lib-nodejs": "^3.1.1" }, "optionalPeers": ["@dcspark/cardano-multiplatform-lib-asmjs", "@dcspark/cardano-multiplatform-lib-browser", "@dcspark/cardano-multiplatform-lib-nodejs"] }, "sha512-jTl8rbocV1XO5DBR6+lGY6Owc/bP+wBg5eO3PttTeKhx/J7o99pyuTa5H36a/XTJwqDwKIXV922QxZR+rfjVbA=="], - "@cardano-sdk/dapp-connector": ["@cardano-sdk/dapp-connector@0.13.24", "", { "dependencies": { "@cardano-sdk/core": "~0.46.10", "@cardano-sdk/crypto": "~0.4.4", "@cardano-sdk/util": "~0.17.1", "ts-custom-error": "^3.2.0", "ts-log": "^2.2.4", "webextension-polyfill": "^0.8.0" } }, "sha512-sgUko8wpLT1iF0ySeSIJIn5f696iuj6TC7E+0CmPApcGy+gpY5ECNRgXx8vus2Cq15EuE/Jtxe6on+9HJX90uw=="], + "@cardano-sdk/dapp-connector": ["@cardano-sdk/dapp-connector@0.13.25", "", { "dependencies": { "@cardano-sdk/core": "~0.46.11", "@cardano-sdk/crypto": "~0.4.4", "@cardano-sdk/util": "~0.17.1", "ts-custom-error": "^3.2.0", "ts-log": "^2.2.4", "webextension-polyfill": "^0.8.0" } }, "sha512-pu+wTbdpfwO6NJ3NhOOyVPS0B08dHqYWlfuqzSpmz6nXHhnLI1w8yi20YZXKRpcajUoAjNdoyNOXJcFTLh6f/A=="], "@cardano-sdk/input-selection": ["@cardano-sdk/input-selection@0.13.34", "", { "dependencies": { "@cardano-sdk/core": "~0.43.0", "@cardano-sdk/key-management": "~0.25.1", "@cardano-sdk/util": "~0.15.5", "bignumber.js": "^9.1.1", "lodash": "^4.17.21", "ts-custom-error": "^3.2.0" } }, "sha512-/AidYTF9WesLoMc4PHoETxXgrfYEq8GECcikjvLwx1mygmKpok4Lp41Aio7sBasUCLvZ82/yTd3uXIAvec1aCA=="], @@ -950,11 +950,11 @@ "@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], - "@ethereumjs/common": ["@ethereumjs/common@10.0.0", "", { "dependencies": { "@ethereumjs/util": "^10.0.0", "eventemitter3": "^5.0.1" } }, "sha512-qb0M1DGdXzMAf3O6Zg5Wr5UDjoxBmplLPbQyC6DQ0LfgVDBRdqn0Pk+/hHm4q0McE22Of0MxbV4hhiDTkSgKag=="], + "@ethereumjs/common": ["@ethereumjs/common@10.1.0", "", { "dependencies": { "@ethereumjs/util": "^10.1.0", "eventemitter3": "^5.0.1" } }, "sha512-zIHCy0i2LFmMDp+QkENyoPGxcoD3QzeNVhx6/vE4nJk4uWGNXzO8xJ2UC4gtGW4UJTAOXja8Z1yZMVeRc2/+Ew=="], - "@ethereumjs/rlp": ["@ethereumjs/rlp@10.0.0", "", { "bin": { "rlp": "bin/rlp.cjs" } }, "sha512-h2SK6RxFBfN5ZGykbw8LTNNLckSXZeuUZ6xqnmtF22CzZbHflFMcIOyfVGdvyCVQqIoSbGMHtvyxMCWnOyB9RA=="], + "@ethereumjs/rlp": ["@ethereumjs/rlp@10.1.0", "", { "bin": { "rlp": "bin/rlp.cjs" } }, "sha512-r67BJbwilammAqYI4B5okA66cNdTlFzeWxPNJOolKV52ZS/flo0tUBf4x4gxWXBgh48OgsdFV1Qp5pRoSe8IhQ=="], - "@ethereumjs/tx": ["@ethereumjs/tx@10.0.0", "", { "dependencies": { "@ethereumjs/common": "^10.0.0", "@ethereumjs/rlp": "^10.0.0", "@ethereumjs/util": "^10.0.0", "ethereum-cryptography": "^3.2.0" } }, "sha512-DApm04kp2nbvaOuHy2Rkcz1ZeJkTVgW6oCuNnQf9bRtGc+LsvLrdULE3LoGtBItEoNEcgXLJqrV0foooWFX6jw=="], + "@ethereumjs/tx": ["@ethereumjs/tx@10.1.0", "", { "dependencies": { "@ethereumjs/common": "^10.1.0", "@ethereumjs/rlp": "^10.1.0", "@ethereumjs/util": "^10.1.0", "ethereum-cryptography": "^3.2.0" } }, "sha512-svG6pyzUZDpunafszf2BaolA6Izuvo8ZTIETIegpKxAXYudV1hmzPQDdSI+d8nHCFyQfEFbQ6tfUq95lNArmmg=="], "@ethereumjs/util": ["@ethereumjs/util@8.1.0", "", { "dependencies": { "@ethereumjs/rlp": "^4.0.1", "ethereum-cryptography": "^2.0.0", "micro-ftch": "^0.3.1" } }, "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA=="], @@ -1022,7 +1022,7 @@ "@foxglove/crc": ["@foxglove/crc@0.0.3", "", {}, "sha512-DjIZsnL3CyP/yQ/vUYA9cjrD0a/8YXejI5ZmsaOiT16cLfZcTwaCxIN01/ys4jsy+dZCQ/9DnWFn7AEFbiMDaA=="], - "@gerrit0/mini-shiki": ["@gerrit0/mini-shiki@3.14.0", "", { "dependencies": { "@shikijs/engine-oniguruma": "^3.14.0", "@shikijs/langs": "^3.14.0", "@shikijs/themes": "^3.14.0", "@shikijs/types": "^3.14.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-c5X8fwPLOtUS8TVdqhynz9iV0GlOtFUT1ppXYzUUlEXe4kbZ/mvMT8wXoT8kCwUka+zsiloq7sD3pZ3+QVTuNQ=="], + "@gerrit0/mini-shiki": ["@gerrit0/mini-shiki@3.15.0", "", { "dependencies": { "@shikijs/engine-oniguruma": "^3.15.0", "@shikijs/langs": "^3.15.0", "@shikijs/themes": "^3.15.0", "@shikijs/types": "^3.15.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-L5IHdZIDa4bG4yJaOzfasOH/o22MCesY0mx+n6VATbaiCtMeR59pdRqYk4bEiQkIHfxsHPNgdi7VJlZb2FhdMQ=="], "@gql.tada/cli-utils": ["@gql.tada/cli-utils@1.7.1", "", { "dependencies": { "@0no-co/graphqlsp": "^1.12.13", "@gql.tada/internal": "1.0.8", "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0" }, "peerDependencies": { "@gql.tada/svelte-support": "1.0.1", "@gql.tada/vue-support": "1.0.1", "typescript": "^5.0.0" }, "optionalPeers": ["@gql.tada/svelte-support", "@gql.tada/vue-support"] }, "sha512-wg5ysZNQxtNQm67T3laVWmZzLpGb7QfyYWZdaUD2r1OjDj5Bgftq7eQlplmH+hsdffjuUyhJw/b5XAjeE2mJtg=="], @@ -1266,7 +1266,7 @@ "@near-js/transactions": ["@near-js/transactions@2.5.0", "", { "dependencies": { "@near-js/crypto": "2.5.0", "@near-js/types": "2.5.0", "@near-js/utils": "2.5.0", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-gVhWS4T5VcLjyVaW8nxWxK7kcgbGgyJ0YVS+VmaFzQbSZKuYgNnQXxynTycFc34awTNbp3a4/MqAd8RgX9VIcg=="], - "@near-js/types": ["@near-js/types@2.5.0", "", {}, "sha512-U0HgAnRwN/XKJ1O4Htac+G5bvkMalBJ8i/kwAPJpoOI1MUtP9dhbCG4GBErADCpczukhrAWlDBHHdfhPnhgyzQ=="], + "@near-js/types": ["@near-js/types@2.5.1", "", {}, "sha512-lUJJmbV6qcilIwswldeP7FIjkjTWvmtgI+yQHVmiBNRVjYvPMiQ/e9vs3SXE/cYtRluAdq0JHJwYoqhFb69mwA=="], "@near-js/utils": ["@near-js/utils@2.5.0", "", { "dependencies": { "@near-js/types": "2.5.0", "@scure/base": "^1.2.4", "depd": "2.0.0", "mustache": "4.0.0" } }, "sha512-hifdeZVzV9TFcgLNekRVVnB6q7zxdCQPmC9cybT1SjfeiIP/5jPabOZXGWNJPSloRcrTMluCTtaWinIw1HXanQ=="], @@ -1644,49 +1644,49 @@ "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.52.5", "", { "os": "android", "cpu": "arm" }, "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.53.0", "", { "os": "android", "cpu": "arm" }, "sha512-MX3DD/o2W36nlgQb8KA5QtUw/bK5aR9YDzNmX1PRHZAa6LF/MQCWMN477CgBMg8gH1vEiEZsjWRIZeL/7ttUVA=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.52.5", "", { "os": "android", "cpu": "arm64" }, "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.53.0", "", { "os": "android", "cpu": "arm64" }, "sha512-U4/R8ZvikDYLkl+hyAGP23SRHp3LwYSRy9SvJqsnva7TYLhVMy39RTVCYn1DdRNxXl1CyCQgE/mXKm9jaQT4ig=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.52.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.53.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nBG2BXRU3ifdK0HdqBKaT5VI6ScoIpABYZ+dWwQkIOYd8Suo4iykgPikjhsTd7NeHgJJ3OqlKYCcNkZtB1iLVQ=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.52.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.53.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-QuZ5hYStB/vW7b8zQYtdIPpIfNNlUXtGk8zVTkoTMKzMhE2/6tVvcCWqdWqCVhx6eguJJjKjtZ9lAAG/D3yNeA=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.52.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.53.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4yYPm1PJwK/HKI4FzElAPj2EAAFaaLUWzXV3S3edKy71JcEVzBCpgaXyEcDh3blBIjLml+aMkj6HEVGSuzpz+g=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.52.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.53.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-1SvE5euwWV8JqFc4zEAqHbJbf2yJl00EoHVcnlFqLzjrIExYttLxfZeMDIXY6Yx+bskphrQakpChZKzE2JECEg=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.52.5", "", { "os": "linux", "cpu": "arm" }, "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.53.0", "", { "os": "linux", "cpu": "arm" }, "sha512-9tS4QyfU5NF5CdUugEi7kWbcGD7pbu6Fm8SunuePH6beeQgtcRZ9K9KVwKHEgfBHeeyrr5OvfV1qWs7PMDOf5w=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.52.5", "", { "os": "linux", "cpu": "arm" }, "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.53.0", "", { "os": "linux", "cpu": "arm" }, "sha512-U+0ovxGU9bVJIHfW+oALpHd0ho1YDwhj0yHASDzIj+bOeo+VzEpNtHxcjhFab0YcHUorIMoqyxckC98+81oTJw=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.52.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.53.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Cp/TQ+wLjRTqTuiVwLz4XPZMo3ROl7EJYMF8HhMp8Uf+9kOOATB3/p4gGZPpuQ4BP7qEXG29ET24u9+F0ERYkQ=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.52.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.53.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-SuGoAwhsSonrSTEZTiQOGC3+XZfq7rc/qAdAOBrYYIp8pu+Wh4EFFXl6+QYYNbNrHL3DnVoWACLwnfwlTa0neA=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.52.5", "", { "os": "linux", "cpu": "none" }, "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.53.0", "", { "os": "linux", "cpu": "none" }, "sha512-EOKej1x0WoePnJWfg7ZbnUqiuiQunshzsKZSIfTHFDiCY9pnsr3Weit1GjcpGnun7H5HuRREqkT2c9CcKxNwSg=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.52.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.53.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-YAvv2aMFlfiawJ97lutomuehG2Yowd4YgsAqI85XNiMK9eBA1vEMZHt3BShg8cUvak71BM+VFRHddqc+OrRdVA=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.52.5", "", { "os": "linux", "cpu": "none" }, "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.53.0", "", { "os": "linux", "cpu": "none" }, "sha512-DxZe/sMVaqN+s5kVk3Iq619Rgyl1JCTob7xOLSNC84mbzg3NYTSheqqrtVllYjLYo4wm9YyqjVS57miuzNyXbQ=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.52.5", "", { "os": "linux", "cpu": "none" }, "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.53.0", "", { "os": "linux", "cpu": "none" }, "sha512-N7+iZ0jEhwLY1FEsjbCR9lAxIZP0k+3Cghx9vSQWn+rcW8SgN8VcCmwJDoPDaGKTzWWB791U1s79BSLnEhUa0Q=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.52.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.53.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-MA/NVneZyIskjvXdh2NR9YcPi7eHWBlQOWP2X8OymzyeUEB0JfUpmbKQZngHmOlyleV2IoR5nHIgMSRjLskOnA=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.52.5", "", { "os": "linux", "cpu": "x64" }, "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.53.0", "", { "os": "linux", "cpu": "x64" }, "sha512-iYEYzYpfaSCkunVD0LOYrD9OMc357be7+rBuCxW1qvsjCGl+95iWnYAFfyEoxAm6koasNN3tFxFYze5MKl5S3A=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.52.5", "", { "os": "linux", "cpu": "x64" }, "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.53.0", "", { "os": "linux", "cpu": "x64" }, "sha512-FoRekOqhRUKbJMsB5LvhQchDeFeNlS6UGUwi0p3860sxE4zE+lp07FnkuR+yQH0rSn6iLXsnr44jnorgl8mGlQ=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.52.5", "", { "os": "none", "cpu": "arm64" }, "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.53.0", "", { "os": "none", "cpu": "arm64" }, "sha512-mEN2k1zKO5PUzW8W15hKpLh+zZI2by1onX2GfI93OekGbKN5aTjWGo7yAjwRZLjhAgs2UQcXmEWbIw0R5B4RnQ=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.52.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.53.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-V1dEKUXqevG0wxo6ysGrL7g2T6tndmo6Uqw5vzOqCXv+DHc8m0RRgcCm+96iigDniwpvV6o4HZtkRUnuTz9XiA=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.52.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.53.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-93mJ8Hm9+vbhtu+A1VtmwptSqCYojtMQkBGDjLytCWC8muxmZLGo/MA/4CMAWf6+QpKlxTTMDAHdTC+kxn9ZcQ=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.52.5", "", { "os": "win32", "cpu": "x64" }, "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ=="], + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.53.0", "", { "os": "win32", "cpu": "x64" }, "sha512-1OrYs0p/deXEFLUW1gvyjIabmsJKY3I/9fCUA1K6demaNc4iEhXDW6RnyPv/BWqb7NRmQ9+i+SKoi1HgJxWcwg=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.52.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.53.0", "", { "os": "win32", "cpu": "x64" }, "sha512-xtSei8paPcLy3GzeeOjoRrllJn6EN8PB+/bXnhZ4R0AaviJsRwtKxFZRVnfFXNZTTp0nLeDo+BcEuIfdZS14/A=="], "@rvagg/ripemd160": ["@rvagg/ripemd160@2.2.4", "", {}, "sha512-ejuJhx9Q+hfOy/4w86E+obE4OAzTVcDh6QNc0v/0IG9hHvegqzwLeltNJSarzkXvIIZfgh63a/EZhpA25VoJLg=="], @@ -1702,13 +1702,13 @@ "@shikijs/core": ["@shikijs/core@3.14.0", "", { "dependencies": { "@shikijs/types": "3.14.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-qRSeuP5vlYHCNUIrpEBQFO7vSkR7jn7Kv+5X3FO/zBKVDGQbcnlScD3XhkrHi/R8Ltz0kEjvFR9Szp/XMRbFMw=="], - "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.14.0", "", { "dependencies": { "@shikijs/types": "3.14.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "sha512-3v1kAXI2TsWQuwv86cREH/+FK9Pjw3dorVEykzQDhwrZj0lwsHYlfyARaKmn6vr5Gasf8aeVpb8JkzeWspxOLQ=="], + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.15.0", "", { "dependencies": { "@shikijs/types": "3.15.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "sha512-ZedbOFpopibdLmvTz2sJPJgns8Xvyabe2QbmqMTz07kt1pTzfEvKZc5IqPVO/XFiEbbNyaOpjPBkkr1vlwS+qg=="], - "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.14.0", "", { "dependencies": { "@shikijs/types": "3.14.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-TNcYTYMbJyy+ZjzWtt0bG5y4YyMIWC2nyePz+CFMWqm+HnZZyy9SWMgo8Z6KBJVIZnx8XUXS8U2afO6Y0g1Oug=="], + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.15.0", "", { "dependencies": { "@shikijs/types": "3.15.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA=="], - "@shikijs/langs": ["@shikijs/langs@3.14.0", "", { "dependencies": { "@shikijs/types": "3.14.0" } }, "sha512-DIB2EQY7yPX1/ZH7lMcwrK5pl+ZkP/xoSpUzg9YC8R+evRCCiSQ7yyrvEyBsMnfZq4eBzLzBlugMyTAf13+pzg=="], + "@shikijs/langs": ["@shikijs/langs@3.15.0", "", { "dependencies": { "@shikijs/types": "3.15.0" } }, "sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A=="], - "@shikijs/themes": ["@shikijs/themes@3.14.0", "", { "dependencies": { "@shikijs/types": "3.14.0" } }, "sha512-fAo/OnfWckNmv4uBoUu6dSlkcBc+SA1xzj5oUSaz5z3KqHtEbUypg/9xxgJARtM6+7RVm0Q6Xnty41xA1ma1IA=="], + "@shikijs/themes": ["@shikijs/themes@3.15.0", "", { "dependencies": { "@shikijs/types": "3.15.0" } }, "sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ=="], "@shikijs/twoslash": ["@shikijs/twoslash@3.14.0", "", { "dependencies": { "@shikijs/core": "3.14.0", "@shikijs/types": "3.14.0", "twoslash": "^0.3.4" }, "peerDependencies": { "typescript": ">=5.5.0" } }, "sha512-Eh8Kg9ZZF+kY5zLFrnkA8iFNWZ8L25g2B5sviHwyx6G38pVDSIBpNmchHnx5qS8lUCNtt/Os3S5VmC0JBEDz+A=="], @@ -2308,7 +2308,7 @@ "bare-addon-resolve": ["bare-addon-resolve@1.9.5", "", { "dependencies": { "bare-module-resolve": "^1.10.0", "bare-semver": "^1.0.0" }, "peerDependencies": { "bare-url": "*" }, "optionalPeers": ["bare-url"] }, "sha512-XdqrG73zLK9LDfblOJwoAxmJ+7YdfRW4ex46+f4L+wPhk7H7LDrRMAbBw8s8jkxeEFpUenyB7QHnv0ErAWd3Yg=="], - "bare-events": ["bare-events@2.8.1", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ=="], + "bare-events": ["bare-events@2.8.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ=="], "bare-fs": ["bare-fs@4.5.0", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-GljgCjeupKZJNetTqxKaQArLK10vpmK28or0+RwWjEl5Rk+/xG3wkpmkv+WrcBm3q1BwHKlnhXzR8O37kcvkXQ=="], @@ -2480,7 +2480,7 @@ "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001753", "", {}, "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001754", "", {}, "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg=="], "cardinal": ["cardinal@2.1.1", "", { "dependencies": { "ansicolors": "~0.3.2", "redeyed": "~2.1.0" }, "bin": { "cdl": "./bin/cdl.js" } }, "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw=="], @@ -2736,7 +2736,7 @@ "eip55": ["eip55@2.1.1", "", { "dependencies": { "keccak": "^3.0.3" } }, "sha512-WcagVAmNu2Ww2cDUfzuWVntYwFxbvZ5MvIyLZpMjTTkjD6sCvkGOiS86jTppzu9/gWsc8isLHAeMBWK02OnZmA=="], - "electron-to-chromium": ["electron-to-chromium@1.5.245", "", {}, "sha512-rdmGfW47ZhL/oWEJAY4qxRtdly2B98ooTJ0pdEI4jhVLZ6tNf8fPtov2wS1IRKwFJT92le3x4Knxiwzl7cPPpQ=="], + "electron-to-chromium": ["electron-to-chromium@1.5.248", "", {}, "sha512-zsur2yunphlyAO4gIubdJEXCK6KOVvtpiuDfCIqbM9FjcnMYiyn0ICa3hWfPr0nc41zcLWobgy1iL7VvoOyA2Q=="], "elliptic": ["elliptic@6.6.1", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="], @@ -3590,7 +3590,7 @@ "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], - "min-document": ["min-document@2.19.0", "", { "dependencies": { "dom-walk": "^0.1.0" } }, "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ=="], + "min-document": ["min-document@2.19.1", "", { "dependencies": { "dom-walk": "^0.1.0" } }, "sha512-8lqe85PkqQJzIcs2iD7xW/WSxcncC3/DPVbTOafKNJDIMXwGfwXS350mH4SJslomntN2iYtFBuC0yNO3CEap6g=="], "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], @@ -3626,7 +3626,7 @@ "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], - "nan": ["nan@2.23.0", "", {}, "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ=="], + "nan": ["nan@2.23.1", "", {}, "sha512-r7bBUGKzlqk8oPBDYxt6Z0aEdF1G1rwlMcLk8LCOMbOzf0mG+JUfUzG4fIMWwHWP0iyaLWEQZJmtB7nOHEm/qw=="], "nanoassert": ["nanoassert@2.0.0", "", {}, "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA=="], @@ -4054,7 +4054,7 @@ "ripple-keypairs": ["ripple-keypairs@2.0.0", "", { "dependencies": { "@noble/curves": "^1.0.0", "@xrplf/isomorphic": "^1.0.0", "ripple-address-codec": "^5.0.0" } }, "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag=="], - "rollup": ["rollup@4.52.5", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.52.5", "@rollup/rollup-android-arm64": "4.52.5", "@rollup/rollup-darwin-arm64": "4.52.5", "@rollup/rollup-darwin-x64": "4.52.5", "@rollup/rollup-freebsd-arm64": "4.52.5", "@rollup/rollup-freebsd-x64": "4.52.5", "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", "@rollup/rollup-linux-arm-musleabihf": "4.52.5", "@rollup/rollup-linux-arm64-gnu": "4.52.5", "@rollup/rollup-linux-arm64-musl": "4.52.5", "@rollup/rollup-linux-loong64-gnu": "4.52.5", "@rollup/rollup-linux-ppc64-gnu": "4.52.5", "@rollup/rollup-linux-riscv64-gnu": "4.52.5", "@rollup/rollup-linux-riscv64-musl": "4.52.5", "@rollup/rollup-linux-s390x-gnu": "4.52.5", "@rollup/rollup-linux-x64-gnu": "4.52.5", "@rollup/rollup-linux-x64-musl": "4.52.5", "@rollup/rollup-openharmony-arm64": "4.52.5", "@rollup/rollup-win32-arm64-msvc": "4.52.5", "@rollup/rollup-win32-ia32-msvc": "4.52.5", "@rollup/rollup-win32-x64-gnu": "4.52.5", "@rollup/rollup-win32-x64-msvc": "4.52.5", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw=="], + "rollup": ["rollup@4.53.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.53.0", "@rollup/rollup-android-arm64": "4.53.0", "@rollup/rollup-darwin-arm64": "4.53.0", "@rollup/rollup-darwin-x64": "4.53.0", "@rollup/rollup-freebsd-arm64": "4.53.0", "@rollup/rollup-freebsd-x64": "4.53.0", "@rollup/rollup-linux-arm-gnueabihf": "4.53.0", "@rollup/rollup-linux-arm-musleabihf": "4.53.0", "@rollup/rollup-linux-arm64-gnu": "4.53.0", "@rollup/rollup-linux-arm64-musl": "4.53.0", "@rollup/rollup-linux-loong64-gnu": "4.53.0", "@rollup/rollup-linux-ppc64-gnu": "4.53.0", "@rollup/rollup-linux-riscv64-gnu": "4.53.0", "@rollup/rollup-linux-riscv64-musl": "4.53.0", "@rollup/rollup-linux-s390x-gnu": "4.53.0", "@rollup/rollup-linux-x64-gnu": "4.53.0", "@rollup/rollup-linux-x64-musl": "4.53.0", "@rollup/rollup-openharmony-arm64": "4.53.0", "@rollup/rollup-win32-arm64-msvc": "4.53.0", "@rollup/rollup-win32-ia32-msvc": "4.53.0", "@rollup/rollup-win32-x64-gnu": "4.53.0", "@rollup/rollup-win32-x64-msvc": "4.53.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-43Z5T+4YTdfYkkA6CStU2DUYh7Ha9dLtvK+K3n0yEE/QS+4i28vSxrQsM59KqpvmT4tbOwJsFnRGMj/tvmQwWw=="], "rollup-plugin-inject": ["rollup-plugin-inject@3.0.2", "", { "dependencies": { "estree-walker": "^0.6.1", "magic-string": "^0.25.3", "rollup-pluginutils": "^2.8.1" } }, "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w=="], @@ -4066,7 +4066,7 @@ "rollup-pluginutils": ["rollup-pluginutils@2.8.2", "", { "dependencies": { "estree-walker": "^0.6.1" } }, "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ=="], - "rpc-websockets": ["rpc-websockets@9.3.0", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-Sf6b6tCpLa6FxgZV20FC1GotVjinFfMkWWfuYtZOdoExvoXQl9ed1J7NdbybLZshNDHjWNa38U186MwElN1VjA=="], + "rpc-websockets": ["rpc-websockets@9.3.1", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-bY6a+i/lEtBJ/mUxwsCTgevoV1P0foXTVA7UoThzaIWbM+3NDqorf8NBWs5DmqKTFeA1IoNzgvkWjFCPgnzUiQ=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], @@ -4128,7 +4128,7 @@ "shelljs": ["shelljs@0.8.5", "", { "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", "rechoir": "^0.6.2" }, "bin": { "shjs": "bin/shjs" } }, "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow=="], - "shiki": ["shiki@3.14.0", "", { "dependencies": { "@shikijs/core": "3.14.0", "@shikijs/engine-javascript": "3.14.0", "@shikijs/engine-oniguruma": "3.14.0", "@shikijs/langs": "3.14.0", "@shikijs/themes": "3.14.0", "@shikijs/types": "3.14.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-J0yvpLI7LSig3Z3acIuDLouV5UCKQqu8qOArwMx+/yPVC3WRMgrP67beaG8F+j4xfEWE0eVC4GeBCIXeOPra1g=="], + "shiki": ["shiki@3.15.0", "", { "dependencies": { "@shikijs/core": "3.15.0", "@shikijs/engine-javascript": "3.15.0", "@shikijs/engine-oniguruma": "3.15.0", "@shikijs/langs": "3.15.0", "@shikijs/themes": "3.15.0", "@shikijs/types": "3.15.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-kLdkY6iV3dYbtPwS9KXU7mjfmDm25f5m0IPNFnaXO7TBPcvbUOY72PYXSuSqDzwp+vlH/d7MXpHlKO/x+QoLXw=="], "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], @@ -4730,7 +4730,7 @@ "@cardano-sdk/crypto/@cardano-sdk/util": ["@cardano-sdk/util@0.16.0", "", { "dependencies": { "bech32": "^2.0.0", "lodash": "^4.17.21", "serialize-error": "^8", "ts-custom-error": "^3.2.0", "ts-log": "^2.2.4", "type-fest": "^2.19.0" } }, "sha512-f0tfX8oiauqAFCyyc/o2Ouezyk83QD4zqLl4DUjZNyCtITL8gBHh25Bkw7RUCGEZ+hf6Qms1n0ui0j3wVY7zRg=="], - "@cardano-sdk/dapp-connector/@cardano-sdk/core": ["@cardano-sdk/core@0.46.10", "", { "dependencies": { "@biglup/is-cid": "^1.0.3", "@cardano-ogmios/client": "6.9.0", "@cardano-ogmios/schema": "6.9.0", "@cardano-sdk/crypto": "~0.4.4", "@cardano-sdk/util": "~0.17.1", "@foxglove/crc": "^0.0.3", "@scure/base": "^1.1.1", "fraction.js": "4.0.1", "ip-address": "^9.0.5", "lodash": "^4.17.21", "ts-custom-error": "^3.2.0", "ts-log": "^2.2.4", "web-encoding": "^1.1.5" }, "peerDependencies": { "rxjs": "^7.4.0" }, "optionalPeers": ["rxjs"] }, "sha512-QgEg8EHbGrbGmVfHhkJAG3GLrgReJXr0K7SM/HjhgbvWJDIz3NRrgS3k2NWk7BmaElT4hQX7HFokMaKoV2WeYQ=="], + "@cardano-sdk/dapp-connector/@cardano-sdk/core": ["@cardano-sdk/core@0.46.11", "", { "dependencies": { "@biglup/is-cid": "^1.0.3", "@cardano-ogmios/client": "6.9.0", "@cardano-ogmios/schema": "6.9.0", "@cardano-sdk/crypto": "~0.4.4", "@cardano-sdk/util": "~0.17.1", "@foxglove/crc": "^0.0.3", "@scure/base": "^1.1.1", "fraction.js": "4.0.1", "ip-address": "^9.0.5", "lodash": "^4.17.21", "ts-custom-error": "^3.2.0", "ts-log": "^2.2.4", "web-encoding": "^1.1.5" }, "peerDependencies": { "rxjs": "^7.4.0" }, "optionalPeers": ["rxjs"] }, "sha512-N/f0Gna41Jsw/KFdulqgpTks4VoeNG1rhTYmGkgtUkMqBTYK+IdaOwMH4QrNxz08VpbOGv76Km3phqGuvTUinQ=="], "@cardano-sdk/dapp-connector/@cardano-sdk/crypto": ["@cardano-sdk/crypto@0.4.4", "", { "dependencies": { "@cardano-sdk/util": "~0.17.1", "blake2b": "^2.1.4", "i": "^0.3.7", "libsodium-wrappers-sumo": "^0.7.5", "lodash": "^4.17.21", "pbkdf2": "^3.1.3", "ts-custom-error": "^3.2.0", "ts-log": "^2.2.4" }, "peerDependencies": { "@dcspark/cardano-multiplatform-lib-asmjs": "^3.1.1", "@dcspark/cardano-multiplatform-lib-browser": "^3.1.1", "@dcspark/cardano-multiplatform-lib-nodejs": "^3.1.1" }, "optionalPeers": ["@dcspark/cardano-multiplatform-lib-asmjs", "@dcspark/cardano-multiplatform-lib-browser", "@dcspark/cardano-multiplatform-lib-nodejs"] }, "sha512-jvElFox4TPlTZRtjfw0HlkucRD90EeijfhMT0uD0N6ptkn8sRQXUFO+z+1Zcp9v9L2V324N7+2ThpjjBEoUdXQ=="], @@ -4770,9 +4770,9 @@ "@eslint/eslintrc/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - "@ethereumjs/common/@ethereumjs/util": ["@ethereumjs/util@10.0.0", "", { "dependencies": { "@ethereumjs/rlp": "^10.0.0", "ethereum-cryptography": "^3.2.0" } }, "sha512-lO23alM4uQsv8dp6/yEm4Xw4328+wIRjSeuBO1mRTToUWRcByEMTk87yzBpXgpixpgHrl+9LTn9KB2vvKKtOQQ=="], + "@ethereumjs/common/@ethereumjs/util": ["@ethereumjs/util@10.1.0", "", { "dependencies": { "@ethereumjs/rlp": "^10.1.0", "ethereum-cryptography": "^3.2.0" } }, "sha512-GGTCkRu1kWXbz2JoUnIYtJBOoA9T5akzsYa91Bh+DZQ3Cj4qXj3hkNU0Rx6wZlbcmkmhQfrjZfVt52eJO/y2nA=="], - "@ethereumjs/tx/@ethereumjs/util": ["@ethereumjs/util@10.0.0", "", { "dependencies": { "@ethereumjs/rlp": "^10.0.0", "ethereum-cryptography": "^3.2.0" } }, "sha512-lO23alM4uQsv8dp6/yEm4Xw4328+wIRjSeuBO1mRTToUWRcByEMTk87yzBpXgpixpgHrl+9LTn9KB2vvKKtOQQ=="], + "@ethereumjs/tx/@ethereumjs/util": ["@ethereumjs/util@10.1.0", "", { "dependencies": { "@ethereumjs/rlp": "^10.1.0", "ethereum-cryptography": "^3.2.0" } }, "sha512-GGTCkRu1kWXbz2JoUnIYtJBOoA9T5akzsYa91Bh+DZQ3Cj4qXj3hkNU0Rx6wZlbcmkmhQfrjZfVt52eJO/y2nA=="], "@ethereumjs/tx/ethereum-cryptography": ["ethereum-cryptography@3.2.0", "", { "dependencies": { "@noble/ciphers": "1.3.0", "@noble/curves": "1.9.0", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0" } }, "sha512-Urr5YVsalH+Jo0sYkTkv1MyI9bLYZwW8BENZCeE1QYaTHETEYx0Nv/SVsWkSqpYrzweg6d8KMY1wTjH/1m/BIg=="], @@ -4780,6 +4780,8 @@ "@fabianbormann/meerkat/bs58": ["bs58@6.0.0", "", { "dependencies": { "base-x": "^5.0.0" } }, "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw=="], + "@gerrit0/mini-shiki/@shikijs/types": ["@shikijs/types@3.15.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw=="], + "@humanwhocodes/config-array/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], @@ -4918,16 +4920,22 @@ "@mysten/utils/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + "@near-js/accounts/@near-js/types": ["@near-js/types@2.5.0", "", {}, "sha512-U0HgAnRwN/XKJ1O4Htac+G5bvkMalBJ8i/kwAPJpoOI1MUtP9dhbCG4GBErADCpczukhrAWlDBHHdfhPnhgyzQ=="], + "@near-js/accounts/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], "@near-js/accounts/borsh": ["borsh@1.0.0", "", {}, "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ=="], + "@near-js/crypto/@near-js/types": ["@near-js/types@2.5.0", "", {}, "sha512-U0HgAnRwN/XKJ1O4Htac+G5bvkMalBJ8i/kwAPJpoOI1MUtP9dhbCG4GBErADCpczukhrAWlDBHHdfhPnhgyzQ=="], + "@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], "@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], "@near-js/crypto/borsh": ["borsh@1.0.0", "", {}, "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ=="], + "@near-js/keystores/@near-js/types": ["@near-js/types@2.5.0", "", {}, "sha512-U0HgAnRwN/XKJ1O4Htac+G5bvkMalBJ8i/kwAPJpoOI1MUtP9dhbCG4GBErADCpczukhrAWlDBHHdfhPnhgyzQ=="], + "@near-js/keystores-browser/@near-js/crypto": ["@near-js/crypto@2.3.0", "", { "dependencies": { "@near-js/types": "2.3.0", "@near-js/utils": "2.3.0", "@noble/curves": "1.8.1", "borsh": "1.0.0", "randombytes": "2.1.0", "secp256k1": "5.0.1" } }, "sha512-H+C4+8cDgAp+0r8OF6IyBfPcNzZHRUFtRrUuqvPD/m2Y7vzseYuP1QZy59nmY5Sdn2jiO6OLC+qA7DIDHxLjUw=="], "@near-js/keystores-browser/@near-js/keystores": ["@near-js/keystores@2.3.0", "", { "dependencies": { "@near-js/crypto": "2.3.0", "@near-js/types": "2.3.0" } }, "sha512-2bpvqHLkdPdNiS0SDrJjFPLEcy3ZrzWcluN80B2d7Ay2U6AnW9KC4IwcGST5eTc1Rgqxg4T6wq9h5bsMAA2Grg=="], @@ -4936,6 +4944,8 @@ "@near-js/keystores-node/@near-js/keystores": ["@near-js/keystores@0.0.9", "", { "dependencies": { "@near-js/crypto": "1.2.1", "@near-js/types": "0.0.4" } }, "sha512-j8ySgVEcm2Gg6zxkSdadNtPlIqhJZdPGfWWM3tPtEoowNS9snhwZn5NRFPrgmX0+MzpF7E091CRcY90MvRVhsg=="], + "@near-js/providers/@near-js/types": ["@near-js/types@2.5.0", "", {}, "sha512-U0HgAnRwN/XKJ1O4Htac+G5bvkMalBJ8i/kwAPJpoOI1MUtP9dhbCG4GBErADCpczukhrAWlDBHHdfhPnhgyzQ=="], + "@near-js/providers/borsh": ["borsh@1.0.0", "", {}, "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ=="], "@near-js/providers/node-fetch": ["node-fetch@2.6.7", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ=="], @@ -4944,10 +4954,14 @@ "@near-js/signers/borsh": ["borsh@1.0.0", "", {}, "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ=="], + "@near-js/transactions/@near-js/types": ["@near-js/types@2.5.0", "", {}, "sha512-U0HgAnRwN/XKJ1O4Htac+G5bvkMalBJ8i/kwAPJpoOI1MUtP9dhbCG4GBErADCpczukhrAWlDBHHdfhPnhgyzQ=="], + "@near-js/transactions/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], "@near-js/transactions/borsh": ["borsh@1.0.0", "", {}, "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ=="], + "@near-js/utils/@near-js/types": ["@near-js/types@2.5.0", "", {}, "sha512-U0HgAnRwN/XKJ1O4Htac+G5bvkMalBJ8i/kwAPJpoOI1MUtP9dhbCG4GBErADCpczukhrAWlDBHHdfhPnhgyzQ=="], + "@near-js/utils/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], "@near-js/wallet-account/@near-js/accounts": ["@near-js/accounts@1.0.4", "", { "dependencies": { "@near-js/crypto": "1.2.1", "@near-js/providers": "0.1.1", "@near-js/signers": "0.1.1", "@near-js/transactions": "1.1.2", "@near-js/types": "0.0.4", "@near-js/utils": "0.1.0", "ajv": "8.11.2", "ajv-formats": "2.1.1", "bn.js": "5.2.1", "borsh": "1.0.0", "depd": "2.0.0", "lru_map": "0.4.1", "near-abi": "0.1.1" } }, "sha512-6zgSwq/rQ9ggPOIkGUx9RoEurbJiojqA/axeh6o1G+46GqUBI7SUcDooyVvZjeiOvUPObnTQptDYpbV+XZji8g=="], @@ -5168,6 +5182,14 @@ "@scure/starknet/@noble/hashes": ["@noble/hashes@1.6.0", "", {}, "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ=="], + "@shikijs/engine-javascript/@shikijs/types": ["@shikijs/types@3.15.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw=="], + + "@shikijs/engine-oniguruma/@shikijs/types": ["@shikijs/types@3.15.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw=="], + + "@shikijs/langs/@shikijs/types": ["@shikijs/types@3.15.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw=="], + + "@shikijs/themes/@shikijs/types": ["@shikijs/types@3.15.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw=="], + "@solana/accounts/@solana/codecs-strings": ["@solana/codecs-strings@2.3.0", "", { "dependencies": { "@solana/codecs-core": "2.3.0", "@solana/codecs-numbers": "2.3.0", "@solana/errors": "2.3.0" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", "typescript": ">=5.3.3" } }, "sha512-y5pSBYwzVziXu521hh+VxqUtp0hYGTl1eWGoc1W+8mdvBdC1kTqm/X7aYQw33J42hw03JjryvYOvmGgk3Qz/Ug=="], "@solana/addresses/@solana/codecs-strings": ["@solana/codecs-strings@2.3.0", "", { "dependencies": { "@solana/codecs-core": "2.3.0", "@solana/codecs-numbers": "2.3.0", "@solana/errors": "2.3.0" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", "typescript": ">=5.3.3" } }, "sha512-y5pSBYwzVziXu521hh+VxqUtp0hYGTl1eWGoc1W+8mdvBdC1kTqm/X7aYQw33J42hw03JjryvYOvmGgk3Qz/Ug=="], @@ -5300,8 +5322,6 @@ "abi-wan-kanabi/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - "ajv-formats/ajv": ["ajv@8.11.2", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg=="], - "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "aria-hidden/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -5982,8 +6002,6 @@ "ox/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "ox/abitype": ["abitype@1.1.1", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-Loe5/6tAgsBukY95eGaPSDmQHIjRZYQq8PB1MpsNccDIK8WiV+Uw6WzaIXipvaxTEL2yEB0OpEaQv3gs8pkS9Q=="], - "p-filter/p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="], "p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], @@ -6056,6 +6074,10 @@ "shelljs/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "shiki/@shikijs/core": ["@shikijs/core@3.15.0", "", { "dependencies": { "@shikijs/types": "3.15.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-8TOG6yG557q+fMsSVa8nkEDOZNTSxjbbR8l6lF2gyr6Np+jrPlslqDxQkN6rMXCECQ3isNPZAGszAfYoJOPGlg=="], + + "shiki/@shikijs/types": ["@shikijs/types@3.15.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw=="], + "signale/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], "sitemap/@types/node": ["@types/node@17.0.45", "", {}, "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="], @@ -6442,8 +6464,6 @@ "@walletconnect/utils/ox/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "@walletconnect/utils/ox/abitype": ["abitype@1.1.1", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-Loe5/6tAgsBukY95eGaPSDmQHIjRZYQq8PB1MpsNccDIK8WiV+Uw6WzaIXipvaxTEL2yEB0OpEaQv3gs8pkS9Q=="], - "abi-wan-kanabi/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "abi-wan-kanabi/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 827c7caf50..51f34231b5 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -22,6 +22,7 @@ import type { createPlugin } from "@swapkit/plugins"; import type { FullWallet } from "@swapkit/toolboxes"; import type { EVMCreateTransactionParams, EVMTransferParams } from "@swapkit/toolboxes/evm"; import type { createWallet } from "@swapkit/wallets"; +import { match } from "ts-pattern"; export type SwapKitParams = { config?: SKConfigState; plugins?: P; wallets?: W }; @@ -34,8 +35,7 @@ export function SwapKit< } type PluginName = keyof Plugins; - const connectedWallets = {} as FullWallet; - type ConnectedChains = keyof typeof connectedWallets; + const connectedWallets = {} as Partial>>; type ActionType = "transfer" | "approve" | "swap"; type ActionParams

= { @@ -106,12 +106,10 @@ export function SwapKit< if (plugin) { if (type === ApproveMode.CheckOnly && "isAssetValueApproved" in plugin) { - // @ts-expect-error TODO: add optional approve for plugin - return plugin.isAssetValueApproved({ assetValue }) as ApproveReturnType; + return plugin?.isAssetValueApproved({ assetValue }) as ApproveReturnType; } if (type === ApproveMode.Approve && "approveAssetValue" in plugin) { - // @ts-expect-error TODO: add optional approve for plugin - return plugin.approveAssetValue({ assetValue }) as ApproveReturnType; + return plugin?.approveAssetValue({ assetValue }) as ApproveReturnType; } throw new SwapKitError({ @@ -147,12 +145,12 @@ export function SwapKit< /** * @Public */ - function getWallet(chain: T) { - return connectedWallets[chain]; + function getWallet(chain: T) { + return connectedWallets[chain] as FullWallet[T]; } function getAllWallets() { - return { ...connectedWallets }; + return { ...connectedWallets } as Partial; } function getAddress(chain: T) { @@ -205,8 +203,7 @@ export function SwapKit< const plugin = getSwapKitPlugin(pluginName || route.providers[0]); if ("swap" in plugin) { - // @ts-expect-error TODO: fix this - return plugin.swap({ ...rest, route }); + return plugin?.swap?.({ ...rest, route }); } throw new SwapKitError("core_plugin_swap_not_found"); @@ -273,9 +270,8 @@ export function SwapKit< if (!getWallet(chain as Chain)) throw new SwapKitError("core_wallet_connection_not_found"); const baseValue = AssetValue.from({ chain }); - const { match } = await import("ts-pattern"); - return match(chain as Chain) + return await match(chain as Chain) .returnType | AssetValue | undefined>() .with(...EVMChains, (chain) => { const { address, ...wallet } = getWallet(chain); diff --git a/packages/helpers/src/api/swapkitApi/endpoints.ts b/packages/helpers/src/api/swapkitApi/endpoints.ts index 943cca7f1a..eff0449f67 100644 --- a/packages/helpers/src/api/swapkitApi/endpoints.ts +++ b/packages/helpers/src/api/swapkitApi/endpoints.ts @@ -8,7 +8,7 @@ import { SKConfig, SwapKitError, } from "@swapkit/helpers"; - +import { match, P } from "ts-pattern"; import { type BalanceResponse, type BrokerDepositChannelParams, @@ -24,6 +24,8 @@ import { PriceResponseSchema, type QuoteRequest, type QuoteResponse, + type QuoteResponseRoute, + QuoteResponseRouteItem, QuoteResponseSchema, type TokenListProvidersResponse, type TokensResponseV2, @@ -57,7 +59,12 @@ export async function getTrackerDetails(json: TrackingRequest) { } export async function getSwapQuote(json: QuoteRequest) { - const response = await SKRequestClient.post(getApiUrl("/quote"), { json }); + const experimentalApiKey = SKConfig.get("envs").experimental_apiKey; + + const response = await SKRequestClient.post(getApiUrl("/quote"), { + ...(experimentalApiKey ? { dynamicHeader: () => ({ "x-api-key": experimentalApiKey }) } : {}), + json, + }); if (response.error) { throw new SwapKitError("api_v2_server_error", { message: response.error }); @@ -77,6 +84,28 @@ export async function getSwapQuote(json: QuoteRequest) { } } +export async function getRouteWithTx(json: { routeId: string }) { + const experimentalApiKey = SKConfig.get("envs").experimental_apiKey; + + const response = await SKRequestClient.post(getApiUrl("/swap"), { + ...(experimentalApiKey ? { dynamicHeader: () => ({ "x-api-key": experimentalApiKey }) } : {}), + json, + }); + + try { + const parsedResponse = QuoteResponseRouteItem.safeParse(response); + + if (!parsedResponse.success) { + throw new SwapKitError("api_v2_invalid_response", parsedResponse.error); + } + + return parsedResponse.data; + } catch (error) { + console.error(new SwapKitError("api_v2_invalid_response", error)); + return response; + } +} + export async function getChainBalance({ chain, address, @@ -185,9 +214,20 @@ export async function getNearDepositChannel(body: NearDepositChannelParams) { } function getApiUrl(path?: `/${string}`) { - const { isDev, apiUrl, devApiUrl } = SKConfig.get("envs"); - - return `${isDev ? devApiUrl : apiUrl}${path}`; + const { isDev, apiUrl, devApiUrl, experimental_apiUrlQuote, experimental_apiUrlSwap } = SKConfig.get("envs"); + + const defaultUrl = `${isDev ? devApiUrl : apiUrl}${path}`; + + return match({ experimental_apiUrlQuote, experimental_apiUrlSwap, path }) + .with( + { experimental_apiUrlQuote: P.string.startsWith("http"), path: "/quote" }, + ({ experimental_apiUrlQuote, path }) => `${experimental_apiUrlQuote}${path}`, + ) + .with( + { experimental_apiUrlSwap: P.string.startsWith("http"), path: "/swap" }, + ({ experimental_apiUrlSwap, path }) => `${experimental_apiUrlSwap}${path}`, + ) + .otherwise(() => defaultUrl); } function evmAssetHasAddress(assetString: string) { diff --git a/packages/helpers/src/api/swapkitApi/types.ts b/packages/helpers/src/api/swapkitApi/types.ts index fb7fa1bf61..52bca6e53b 100644 --- a/packages/helpers/src/api/swapkitApi/types.ts +++ b/packages/helpers/src/api/swapkitApi/types.ts @@ -553,7 +553,7 @@ const QuoteResponseRouteLegItem = object({ sellAsset: string().describe("Asset to sell"), }); -const QuoteResponseRouteItem = object({ +export const QuoteResponseRouteItem = object({ buyAsset: string().describe("Asset to buy"), destinationAddress: string().describe("Destination address"), estimatedTime: optional(EstimatedTimeSchema), @@ -566,6 +566,7 @@ const QuoteResponseRouteItem = object({ memo: optional(string().describe("Memo")), meta: RouteQuoteMetadataV2Schema, providers: array(z.enum(ProviderName)), + routeId: string().describe("Route ID"), sellAmount: string().describe("Sell amount"), sellAsset: string().describe("Asset to sell"), sourceAddress: string().describe("Source address"), diff --git a/packages/helpers/src/modules/swapKitConfig.ts b/packages/helpers/src/modules/swapKitConfig.ts index 4edd0dfc2f..4641129353 100644 --- a/packages/helpers/src/modules/swapKitConfig.ts +++ b/packages/helpers/src/modules/swapKitConfig.ts @@ -60,6 +60,9 @@ const initialState = { envs: { apiUrl: "https://api.swapkit.dev", devApiUrl: "https://dev-api.swapkit.dev", + experimental_apiKey: null as string | null, + experimental_apiUrlQuote: null as string | null, + experimental_apiUrlSwap: null as string | null, isDev: false, isStagenet: false, }, diff --git a/packages/helpers/src/types/sdk.ts b/packages/helpers/src/types/sdk.ts index 74ae0523d0..369d622219 100644 --- a/packages/helpers/src/types/sdk.ts +++ b/packages/helpers/src/types/sdk.ts @@ -6,6 +6,7 @@ export type GenericSwapParams = { recipient?: string; feeOptionKey?: FeeOption; route: T; + useApiTx?: boolean; }; export type SwapParams = GenericSwapParams & { pluginName?: PluginNames }; diff --git a/packages/plugins/src/utils.ts b/packages/plugins/src/utils.ts index b8f5affd72..468c519170 100644 --- a/packages/plugins/src/utils.ts +++ b/packages/plugins/src/utils.ts @@ -4,7 +4,7 @@ import type { SwapKitPluginParams } from "./types"; export function createPlugin< const Name extends string, - T extends (params: SwapKitPluginParams) => Record, + T extends (params: SwapKitPluginParams) => ReturnType, K extends { supportedSwapkitProviders?: readonly ProviderName[] }, >({ name, properties, methods }: { name: Name; properties?: K; methods: T }) { function plugin(pluginParams: SwapKitPluginParams) { diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index 15dd13243f..38eb650186 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -114,14 +114,14 @@ export const defaultWallets = { ...walletSelectorWallet, ...walletconnectWallet, ...xamanWallet, -}; +} as ReturnType; export function createSwapKit< Plugins extends ReturnType = typeof defaultPlugins, Wallets extends ReturnType = typeof defaultWallets, >({ config, plugins, wallets }: { config?: SKConfigState; plugins?: Plugins; wallets?: Wallets } = {}) { const mergedPlugins = { ...defaultPlugins, ...plugins } as typeof defaultPlugins & Plugins; - const mergedWallets = { ...defaultWallets, ...wallets } as typeof defaultWallets & Wallets; + const mergedWallets = { ...defaultWallets, ...wallets } as ReturnType & Wallets; return SwapKit({ config: config, plugins: mergedPlugins, wallets: mergedWallets }); } diff --git a/packages/toolboxes/src/near/toolbox.ts b/packages/toolboxes/src/near/toolbox.ts index 5e8097e6be..b810ac0f7b 100644 --- a/packages/toolboxes/src/near/toolbox.ts +++ b/packages/toolboxes/src/near/toolbox.ts @@ -21,13 +21,13 @@ import { } from "./helpers/gasEstimation"; import { createNearContract } from "./helpers/nep141"; import type { + NEP141StorageContract, NearCreateTransactionParams, NearFunctionCallParams, NearToolboxParams, NearTransferParams, } from "./types"; import type { NearContractInterface, NearGasEstimateParams } from "./types/contract"; -import type { NEP141StorageContract } from "./types/nep141"; import type { BatchTransaction, ContractFunctionCallParams, diff --git a/packages/ui/src/react/components/composable/swap-asset-item.tsx b/packages/ui/src/react/components/composable/swap-asset-item.tsx index 300be05c87..1004504c77 100644 --- a/packages/ui/src/react/components/composable/swap-asset-item.tsx +++ b/packages/ui/src/react/components/composable/swap-asset-item.tsx @@ -9,11 +9,11 @@ export function SwapAssetItem({ asset }: { asset: string | undefined }) { const assetValue = AssetValue.from({ asset }); return ( -

+
-
- {assetValue?.ticker} +
+ {assetValue?.ticker} {assetValue?.chain}
diff --git a/packages/ui/src/react/components/composable/swap-asset-select.tsx b/packages/ui/src/react/components/composable/swap-asset-select.tsx index 2fe32eed5c..a3d87d03dd 100644 --- a/packages/ui/src/react/components/composable/swap-asset-select.tsx +++ b/packages/ui/src/react/components/composable/swap-asset-select.tsx @@ -4,7 +4,8 @@ import { Chain } from "@swapkit/sdk"; import { SearchIcon } from "lucide-react"; import { useMemo, useState } from "react"; import { match } from "ts-pattern"; -import { cn } from "../../../lib/utils"; +import { cn, formatCurrency } from "../../../lib/utils"; +import { useFilteredSortedAssets } from "../../hooks/use-filtered-sorted-assets"; import { showModal } from "../../hooks/use-modal"; import { useSwapKit } from "../../swapkit-context"; import { ChainIcon } from "../chain-icon"; @@ -22,10 +23,11 @@ export function SwapAssetSelect({ setSelectedAsset: (asset: string) => void; }) { const [isNetworkListExpanded, setIsNetworkListExpanded] = useState(false); - const [searchQuery, setSearchQuery] = useState(""); const [selectedNetworks, setSelectedNetworks] = useState([]); const [open, setOpen] = useState(false); - const { chains, balanceGroupedByChain, isWalletConnected } = useSwapKit(); + const { isWalletConnected } = useSwapKit(); + + const { assets, filters, setFilters } = useFilteredSortedAssets(); // 8 cols * 2 rows - 1 (button "all") - 2 (button "hide/show more") const collapsedNetworksAmount = 8 * 2 - 1 - 2; @@ -33,34 +35,12 @@ export function SwapAssetSelect({ const visibleNetworksAmount = isNetworkListExpanded ? totalNetworksAmount : collapsedNetworksAmount; const canShowMore = collapsedNetworksAmount < totalNetworksAmount - 2; - const lowerSearchQuery = searchQuery.toLowerCase(); - const networksToRender = useMemo(() => { return Object.values(Chain) ?.sort((a, b) => a?.localeCompare(b)) ?.slice(0, canShowMore ? visibleNetworksAmount : visibleNetworksAmount + 2); }, [canShowMore, visibleNetworksAmount]); - // biome-ignore lint/correctness/useExhaustiveDependencies: @Drakeoon check deps please - const assetsToRender = useMemo(() => { - return chains - ?.flatMap?.((chain) => { - if (selectedNetworks.length > 0 && !selectedNetworks?.includes(chain)) return null; - if (!balanceGroupedByChain?.[chain]?.length) return null; - - const filteredAssets = balanceGroupedByChain?.[chain]?.filter?.((assetValue) => { - return ( - assetValue?.symbol?.toLowerCase()?.includes(lowerSearchQuery) || - assetValue?.ticker?.toLowerCase()?.includes(lowerSearchQuery) || - assetValue?.chain?.toLowerCase()?.includes(lowerSearchQuery) - ); - }); - - return filteredAssets; - }) - ?.filter((assetValue) => assetValue !== null); - }, [balanceGroupedByChain, selectedNetworks, lowerSearchQuery, chains?.flatMap]); - const handleDialogTriggerClick = async (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); @@ -87,7 +67,7 @@ export function SwapAssetSelect({ - + Select Token @@ -95,9 +75,9 @@ export function SwapAssetSelect({
setSearchQuery(e.target.value)} + onChange={(e) => setFilters({ searchQuery: e.target.value })} placeholder="Search token name" - value={searchQuery} + value={filters?.searchQuery ?? ""} /> @@ -129,7 +109,7 @@ export function SwapAssetSelect({ "aspect-[1.3/1] h-auto border border-transparent p-0", isSelected && "border-foreground text-foreground", )} - key={`swap-asset-item-${chain}`} + key={`swap-asset-network-${chain}`} onClick={() => { setSelectedNetworks((selectedNetworks) => { if (isSelected) { @@ -154,8 +134,8 @@ export function SwapAssetSelect({
- - {match({ assetsToRender, isWalletConnected }) + + {match({ assets, isWalletConnected }) .with({ isWalletConnected: false }, () => (
Connect your wallet
@@ -164,7 +144,7 @@ export function SwapAssetSelect({
)) .when( - ({ assetsToRender }) => assetsToRender?.length <= 0, + ({ assets }) => assets?.length <= 0, () => (
No assets found
@@ -176,29 +156,30 @@ export function SwapAssetSelect({ ), ) .otherwise(() => ( -
- {assetsToRender?.map((assetValue) => { - const assetValueString = assetValue?.toString(); - - return ( - - ); - })} +
+ {assets?.slice(0, 100)?.map((asset) => ( + + ))}
))} diff --git a/packages/ui/src/react/components/dialogs/wallet-connect-dialog.tsx b/packages/ui/src/react/components/dialogs/wallet-connect-dialog.tsx index 762b2812dc..90906dc81e 100644 --- a/packages/ui/src/react/components/dialogs/wallet-connect-dialog.tsx +++ b/packages/ui/src/react/components/dialogs/wallet-connect-dialog.tsx @@ -7,13 +7,14 @@ import { SearchIcon, WalletMinimalIcon } from "lucide-react"; import { useCallback, useMemo, useState } from "react"; import { toast } from "sonner"; import { match, P } from "ts-pattern"; -import { useModal } from "../../hooks/use-modal"; +import { showModal, useModal } from "../../hooks/use-modal"; import { useSwapKit } from "../../swapkit-context"; import { Button } from "../ui/button"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "../ui/dialog"; import { Input } from "../ui/input"; import { SWAPKIT_WIDGET_TOASTER_ID } from "../ui/sonner"; import { WalletIcon } from "../wallet-icon"; +import { GlobalKeystoreDialog } from "./wallet-connect-keystore-dialog"; const WALLET_GROUPS = { "Browser Extensions": [ @@ -294,7 +295,20 @@ function WalletConnectButton({ wallet }: { wallet: WalletOption }) { const handleButtonClick = useCallback(async () => { try { - await connectWallet(wallet, [Chain.Cosmos, Chain.Maya, Chain.THORChain, Chain.Kujira] as Chain[]); + if (wallet === WalletOption.KEYSTORE) { + return void showModal(); + } + + await connectWallet(wallet, [ + Chain.Cosmos, + Chain.Maya, + Chain.THORChain, + Chain.Kujira, + Chain.Bitcoin, + Chain.Ethereum, + Chain.Avalanche, + Chain.BinanceSmartChain, + ] as Chain[]); modal.resolve({ confirmed: true, data: wallet }); } catch { diff --git a/packages/ui/src/react/components/dialogs/wallet-connect-keystore-dialog.tsx b/packages/ui/src/react/components/dialogs/wallet-connect-keystore-dialog.tsx new file mode 100644 index 0000000000..b54c30b31a --- /dev/null +++ b/packages/ui/src/react/components/dialogs/wallet-connect-keystore-dialog.tsx @@ -0,0 +1,120 @@ +"use client"; + +import { Chain } from "@swapkit/sdk"; +import { useEffect, useRef, useState } from "react"; +import { toast } from "sonner"; +import { useModal } from "../../hooks/use-modal"; +import { useSwapKit } from "../../swapkit-context"; +import { Button } from "../ui/button"; +import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "../ui/dialog"; +import { Input } from "../ui/input"; +import { SWAPKIT_WIDGET_TOASTER_ID } from "../ui/sonner"; + +export const GlobalKeystoreDialog = () => { + const modal = useModal(); + const { isKeystoreOpen, setIsKeystoreOpen, isKeystoreDecrypting, keystoreFile, setKeystoreFile, connectKeystore } = + useSwapKit(); + const [password, setPassword] = useState(""); + const inputRef = useRef(null); + + useEffect(() => { + if (isKeystoreOpen) { + inputRef.current?.focus(); + setPassword(""); + } + }, [isKeystoreOpen]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + const trimmedPassword = password.trim(); + if (!(trimmedPassword && keystoreFile)) return; + + try { + await connectKeystore(trimmedPassword); + + modal.resolve({ confirmed: true, data: null }); + } catch (error) { + console.error(error); + toast.error("Failed to connect keystore", { + description: "Please try again with a valid password.", + toasterId: SWAPKIT_WIDGET_TOASTER_ID, + }); + } + }; + + const handleCancel = () => { + setIsKeystoreOpen(false); + setKeystoreFile(null); + }; + + return ( + + +
+ + Enter Keystore Password + + Please enter your keystore password to decrypt and connect your wallet. + + +
+ { + const file = e.target.files?.[0]; + + if (!file) return; + + try { + const textFile = await file.text(); + const keystore = JSON.parse(textFile) as import("@swapkit/sdk/wallets").Keystore; + + setKeystoreFile({ + chains: [ + Chain.Cosmos, + Chain.Maya, + Chain.THORChain, + Chain.Kujira, + Chain.Bitcoin, + Chain.Ethereum, + Chain.Avalanche, + Chain.BinanceSmartChain, + ], + file, + keystore, + }); + } catch (error) { + console.error(error); + toast.error("Failed to parse keystore file", { + description: "Please try again with a valid keystore file.", + toasterId: SWAPKIT_WIDGET_TOASTER_ID, + }); + } + }} + placeholder="Select keystore file" + required + type="file" + /> + setPassword(e.target.value)} + placeholder="Enter password" + ref={inputRef} + required + type="password" + value={password} + /> +
+ + + + +
+
+
+ ); +}; diff --git a/packages/ui/src/react/components/ui/accordion.tsx b/packages/ui/src/react/components/ui/accordion.tsx index 58e0bee4a3..7a71a90509 100644 --- a/packages/ui/src/react/components/ui/accordion.tsx +++ b/packages/ui/src/react/components/ui/accordion.tsx @@ -2,20 +2,29 @@ import * as AccordionPrimitive from "@radix-ui/react-accordion"; import { ChevronDown } from "lucide-react"; +import type { ComponentPropsWithoutRef, ComponentRef } from "react"; import * as React from "react"; import { cn } from "../../../lib/utils"; -const Accordion = AccordionPrimitive.Root; +const Accordion: React.FC< + ComponentPropsWithoutRef +> = AccordionPrimitive.Root; -const AccordionItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef +const AccordionItem: React.ForwardRefExoticComponent< + ComponentPropsWithoutRef & + React.RefAttributes> +> = React.forwardRef< + ComponentRef, + ComponentPropsWithoutRef >(({ className, ...props }, ref) => ); AccordionItem.displayName = "AccordionItem"; -const AccordionTrigger = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef +const AccordionTrigger: React.ForwardRefExoticComponent< + ComponentPropsWithoutRef & + React.RefAttributes> +> = React.forwardRef< + ComponentRef, + ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( , - React.ComponentPropsWithoutRef +const AccordionContent: React.ForwardRefExoticComponent< + ComponentPropsWithoutRef & + React.RefAttributes> +> = React.forwardRef< + ComponentRef, + ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( ({ searchQuery: "", selectedNetworks: [] }); + const [internalFiltersState, setInternalFilterState] = useState(filters); + + const [assetsMap, setAssetsMap] = useState< + Map + >(new Map()); + const [isLoading, setIsLoading] = useState(true); + + useDebouncedEffect( + () => { + setInternalFilterState(filters); + }, + [filters], + 500, + ); + + useEffect(() => { + if (!isWalletConnected) return; + + let isCancelled = false; + + void loadTokenLists().then((tokenLists) => { + if (isCancelled) return; + + // nested foreach would be more efficient here + const assetsMapEntries = Object.values(tokenLists).flatMap( + ({ tokens }: { tokens: UseFilteredSortedAssetsToken[] }) => + tokens.filter((token) => !!token).map((token) => [token.identifier, token]), + ); + + const uniqueAssetsMap = new Map( + assetsMapEntries as [string, UseFilteredSortedAssetsToken][], + ); + + setAssetsMap(uniqueAssetsMap); + setIsLoading(false); + }); + + return () => { + isCancelled = true; + }; + }, [isWalletConnected]); + + const networks = useMemo(() => { + const uniqueNetworks = new Set(); + + assetsMap.forEach((asset) => { + if (!asset?.chain) return; + + uniqueNetworks.add(asset.chain); + }, []); + + return Array.from(uniqueNetworks).sort((a, b) => a.localeCompare(b)); + }, [assetsMap.forEach]); + + const filteredAssets = useMemo(() => { + const filteredAssetsMap = filterAssetsMap({ assetsMap, filters: internalFiltersState }); + + balances?.forEach(({ identifier, balance }) => { + const matchingAsset = filteredAssetsMap.get(identifier); + + if (!matchingAsset) return; + + filteredAssetsMap.set(matchingAsset.identifier, { ...matchingAsset, balance }); + }); + + const assets = Array.from(filteredAssetsMap.values()); + + return sortAssets({ assets, filters: internalFiltersState }); + }, [internalFiltersState, balances, assetsMap]); + + return useMemo( + () => ({ assets: filteredAssets, filters, isLoading, networks, setFilters }), + [filters, isLoading, networks, filteredAssets], + ); +} + +function sortAssets({ + assets, + filters, +}: { + assets: (UseFilteredSortedAssetsToken & { balance?: AssetValue })[]; + filters: UseFilteredSortedAssetsOptions; +}) { + const lowerSearchQuery = filters?.searchQuery?.toLowerCase() ?? ""; + + return assets?.sort((tokenA, tokenB) => { + const hasBalanceA = tokenA?.balance && tokenA?.balance?.getValue?.("number") >= 0; + const hasBalanceB = tokenB?.balance && tokenB?.balance?.getValue?.("number") >= 0; + + const exactMatchA = lowerSearchQuery.length >= 1 && tokenA.ticker.toLowerCase() === lowerSearchQuery; + const exactMatchB = lowerSearchQuery.length >= 1 && tokenB.ticker.toLowerCase() === lowerSearchQuery; + + // 1. Ticker matches search query + wallet has balance + if (exactMatchA && hasBalanceA && !(exactMatchB && hasBalanceB)) return -1; + if (exactMatchB && hasBalanceB && !(exactMatchA && hasBalanceA)) return 1; + + // 2. Ticker matches search query + wallet has no balance + if (exactMatchA && !exactMatchB) return -1; + if (!exactMatchA && exactMatchB) return 1; + + // 3. Asset has any balance defined (0 is valid) + if (hasBalanceA && !hasBalanceB) return -1; + if (!hasBalanceA && hasBalanceB) return 1; + + // 4. Sort alphabetically within each group + return tokenA.ticker.localeCompare(tokenB.ticker); + }); +} + +function filterAssetsMap({ + assetsMap, + filters, +}: { + assetsMap: Map; + filters: UseFilteredSortedAssetsOptions; +}) { + const lowerSearchQuery = filters.searchQuery?.toLowerCase() ?? ""; + const selectedNetworks = filters.selectedNetworks ?? []; + + const filteredAssetsMap = new Map< + UseFilteredSortedAssetsToken["identifier"], + UseFilteredSortedAssetsToken & { balance?: AssetValue } + >(); + + assetsMap.forEach((asset) => { + if (!asset?.ticker || asset.ticker.length === 0) return; + if (!asset?.chain || asset.chain.length === 0) return; + if (!asset?.address && !asset?.chainId) return; + + if (selectedNetworks.length > 0 && !selectedNetworks.includes(asset.chain)) return; + + const matchesSearchQuery = + asset?.symbol?.toLowerCase()?.includes(lowerSearchQuery) || + asset?.ticker?.toLowerCase()?.includes(lowerSearchQuery) || + asset?.chain?.toLowerCase()?.includes(lowerSearchQuery); + + if (lowerSearchQuery.length >= 1 && !matchesSearchQuery) return; + + filteredAssetsMap.set(asset.identifier, asset); + }); + + return filteredAssetsMap; +} diff --git a/packages/ui/src/react/hooks/use-swap-quote.ts b/packages/ui/src/react/hooks/use-swap-quote.ts index 2116609f9b..9af11a217a 100644 --- a/packages/ui/src/react/hooks/use-swap-quote.ts +++ b/packages/ui/src/react/hooks/use-swap-quote.ts @@ -27,7 +27,7 @@ export const useSwapQuote = ({ inputAsset, outputAsset, amount }: UseSwapQuotePa const [selectedRouteIndex, setSelectedRouteIndex] = useState(0); const [expectedBuyAmountFor1Input, setExpectedBuyAmountFor1Input] = useState(0); - const { swapKit } = useSwapKit(); + const { swapKit, isWalletConnected } = useSwapKit(); const swapKitConfig = useSwapKitConfig(); const inputAssetValue = useMemo(() => { @@ -58,6 +58,7 @@ export const useSwapQuote = ({ inputAsset, outputAsset, amount }: UseSwapQuotePa const isValid = amount && swapKit && + isWalletConnected && inputAssetValue?.chain && outputAssetValue?.chain && outputAssetIdentifier && @@ -71,14 +72,21 @@ export const useSwapQuote = ({ inputAsset, outputAsset, amount }: UseSwapQuotePa try { setIsFetchingQuote(true); + const destinationAddress = swapKit.getAddress(outputAssetValue?.chain); + const sourceAddress = swapKit.getAddress(inputAssetValue?.chain); + + if (!destinationAddress || !sourceAddress) { + throw new Error("Destination or source address not found"); + } + const quote = await SwapKitApi.getSwapQuote({ buyAsset: outputAssetIdentifier, - destinationAddress: swapKit.getAddress(outputAssetValue?.chain), + destinationAddress, includeTx: true, sellAmount: amount, sellAsset: inputAssetIdentifier, slippage: 3, - sourceAddress: swapKit.getAddress(inputAssetValue?.chain), + sourceAddress, }); if (quote?.routes?.length <= 0) return; @@ -98,7 +106,15 @@ export const useSwapQuote = ({ inputAsset, outputAsset, amount }: UseSwapQuotePa } finally { setIsFetchingQuote(false); } - }, [amount, swapKit, outputAssetValue?.chain, inputAssetValue?.chain, inputAssetIdentifier, outputAssetIdentifier]); + }, [ + amount, + swapKit, + outputAssetValue?.chain, + inputAssetValue?.chain, + inputAssetIdentifier, + outputAssetIdentifier, + isWalletConnected, + ]); useDebouncedEffect(fetchSwapQuote, [amount, swapKit, swapKitConfig, outputAsset, inputAsset], 700); diff --git a/packages/ui/src/react/swapkit-context.tsx b/packages/ui/src/react/swapkit-context.tsx index 9be856e8fa..715eebefa1 100644 --- a/packages/ui/src/react/swapkit-context.tsx +++ b/packages/ui/src/react/swapkit-context.tsx @@ -1,6 +1,6 @@ "use client"; -import type { Chain, EVMChain, SKConfigState } from "@swapkit/sdk"; +import type { Chain, ChainWallet, EVMChain, SKConfigState } from "@swapkit/sdk"; import { AssetValue, NetworkDerivationPath, WalletOption } from "@swapkit/sdk"; import { useCallback, useEffect, useMemo } from "react"; import { create } from "zustand"; @@ -21,7 +21,6 @@ const useSwapKitStore = create((set) => { isKeystoreDecrypting: false, setSwapKit: (swapKit) => set({ swapKit }), - setBalances: (balances) => set({ balances }), setWalletState: ({ connected, type }) => set({ isWalletConnected: connected, walletType: type }), setKeystoreFile: (keystoreFile) => set({ keystoreFile }), setIsKeystoreOpen: (isKeystoreOpen) => set({ isKeystoreOpen }), @@ -33,7 +32,6 @@ const useSwapKitStore = create((set) => { export const useSwapKit = () => { const { swapKit, - balances, walletType, isWalletConnected, keystoreFile, @@ -41,7 +39,6 @@ export const useSwapKit = () => { isKeystoreDecrypting, isConnectingWallet, setSwapKit, - setBalances, setWalletState, setKeystoreFile, setIsKeystoreOpen, @@ -57,29 +54,15 @@ export const useSwapKit = () => { void loadSwapKit(); }, []); - async function loadSwapKit(params?: { config: SKConfigState | undefined }) { - const { createSwapKit } = await import("@swapkit/sdk"); + const loadSwapKit = useCallback( + async (params?: { config: SKConfigState | undefined }) => { + const { createSwapKit } = await import("@swapkit/sdk"); - const swapKitClient = createSwapKit({ config: params?.config }); + const swapKitClient = createSwapKit({ config: params?.config }); - setSwapKit(swapKitClient); - } - - const getBalances = useCallback( - async (refresh?: boolean) => { - if ((!refresh && balances.length) || !swapKit) return; - - const connectedWallets = swapKit.getAllWallets(); - let nextBalances: AssetValue[] = []; - - for (const chain of Object.keys(connectedWallets)) { - const balance = await swapKit?.getBalance(chain as Chain); - nextBalances = nextBalances.concat(balance); - } - - setBalances(nextBalances.sort((a, b) => a.getValue("number") - b.getValue("number"))); + setSwapKit(swapKitClient); }, - [swapKit, setBalances, balances], + [setSwapKit], ); const connectWallet = useCallback( @@ -92,46 +75,46 @@ export const useSwapKit = () => { case WalletOption.METAMASK: case WalletOption.COINBASE_WEB: case WalletOption.TRUSTWALLET_WEB: - await swapKit?.connectEVMWallet(chains as EVMChain[]); + await swapKit?.connectEVMWallet?.(chains as EVMChain[]); break; case WalletOption.PHANTOM: - await swapKit?.connectPhantom(chains); + await swapKit?.connectPhantom?.(chains); break; case WalletOption.KEPLR: - await swapKit?.connectKeplr(chains); + await swapKit?.connectKeplr?.(chains); break; case WalletOption.LEDGER: - await swapKit?.connectLedger(chains); + await swapKit?.connectLedger?.(chains); break; case WalletOption.TREZOR: { const [chain] = chains; if (!chain) throw new Error("Chain is required for Trezor"); - await swapKit?.connectTrezor(chains, NetworkDerivationPath[chain]); + await swapKit?.connectTrezor?.(chains, NetworkDerivationPath[chain]); break; } case WalletOption.WALLETCONNECT: - await swapKit?.connectWalletconnect(chains); + await swapKit?.connectWalletconnect?.(chains); break; case WalletOption.COINBASE_MOBILE: - await swapKit?.connectCoinbaseWallet(chains); + await swapKit?.connectCoinbaseWallet?.(chains); break; case WalletOption.BITGET: - await swapKit?.connectBitget(chains); + await swapKit?.connectBitget?.(chains); break; case WalletOption.CTRL: - await swapKit?.connectCtrl(chains); + await swapKit?.connectCtrl?.(chains); break; case WalletOption.KEEPKEY: - await swapKit?.connectKeepkey(chains); + await swapKit?.connectKeepkey?.(chains); break; case WalletOption.KEEPKEY_BEX: @@ -148,19 +131,19 @@ export const useSwapKit = () => { case WalletOption.OKX: case WalletOption.OKX_MOBILE: - await swapKit?.connectOkx(chains); + await swapKit?.connectOkx?.(chains); break; case WalletOption.POLKADOT_JS: - await swapKit?.connectPolkadotJs(chains); + await swapKit?.connectPolkadotJs?.(chains); break; case WalletOption.RADIX_WALLET: - await swapKit?.connectRadixWallet(chains); + await swapKit?.connectRadixWallet?.(chains); break; case WalletOption.TALISMAN: - await swapKit?.connectTalisman(chains); + await swapKit?.connectTalisman?.(chains); break; default: @@ -168,18 +151,14 @@ export const useSwapKit = () => { } const isConnected = chains.some((chain) => !!swapKit?.getAddress(chain)); + + if (!isConnected) throw new Error("Failed to connect wallet"); + setWalletState({ connected: isConnected, type: option }); - if (isConnected) { - const balancePromises = chains.map(async (chain) => { - const wallet = await swapKit?.getWalletWithBalance(chain); - if (!(wallet && "balance" in wallet)) return []; - return wallet.balance as AssetValue[]; - }); - const chainBalances = await Promise.all(balancePromises); - const allBalances = chainBalances.flat(); - setBalances(allBalances.sort((a, b) => a.getValue("number") - b.getValue("number"))); - } + await Promise.all(chains.map((chain) => swapKit?.getWalletWithBalance(chain))); + + setSwapKit(swapKit); } catch (error) { console.error(`Failed to connect ${option}:`, error); @@ -190,7 +169,7 @@ export const useSwapKit = () => { setIsConnectingWallet(false); } }, - [setWalletState, setBalances, swapKit, setIsConnectingWallet], + [setWalletState, swapKit, setIsConnectingWallet, setSwapKit], ); const disconnectWallet = useCallback(() => { @@ -202,27 +181,23 @@ export const useSwapKit = () => { const connectKeystore = useCallback( async (password: string) => { - if (!(keystoreFile && swapKit)) return; + if (!keystoreFile?.keystore || !swapKit) return; try { setIsKeystoreDecrypting(true); const { decryptFromKeystore } = await import("@swapkit/wallet-keystore"); const phrase = await decryptFromKeystore(keystoreFile.keystore, password); + if (!phrase) throw new Error("Failed to decrypt keystore"); - await swapKit.connectKeystore(keystoreFile.chains, phrase); + await swapKit?.connectKeystore?.(keystoreFile.chains, phrase); + setWalletState({ connected: true, type: WalletOption.KEYSTORE }); + + await Promise.all(keystoreFile.chains.map((balance) => swapKit?.getWalletWithBalance(balance))); + setIsKeystoreOpen(false); setKeystoreFile(null); - - const balancePromises = keystoreFile.chains.map(async (chain) => { - const wallet = await swapKit?.getWalletWithBalance(chain); - if (!(wallet && "balance" in wallet)) return []; - return wallet.balance as AssetValue[]; - }); - const chainBalances = await Promise.all(balancePromises); - const allBalances = chainBalances.flat(); - setBalances(allBalances.sort((a, b) => a.getValue("number") - b.getValue("number"))); } catch (error) { console.error("Failed to decrypt keystore:", error); setWalletState({ connected: false, type: null }); @@ -230,56 +205,58 @@ export const useSwapKit = () => { setIsKeystoreDecrypting(false); } }, - [keystoreFile, swapKit, setWalletState, setBalances, setIsKeystoreOpen, setKeystoreFile, setIsKeystoreDecrypting], + [keystoreFile, swapKit, setWalletState, setIsKeystoreOpen, setKeystoreFile, setIsKeystoreDecrypting], ); - const { chains, balanceGroupedByChain } = useMemo(() => { - const balanceGroupedByChain = (Array.isArray(balances) ? balances : []).reduce( - (acc: Record, assetValue: AssetValue) => { - if (!acc[assetValue.chain]) { - acc[assetValue.chain] = []; - } - - if (assetValue.isGasAsset || assetValue.getValue("number") > 0) { - acc[assetValue.chain].push(assetValue); - } - - return acc; - }, - {} as Record, - ); - - const chains = Object.keys(balanceGroupedByChain) as Chain[]; - - return { balanceGroupedByChain, chains }; - }, [balances]); - - // biome-ignore assist/source/useSortedKeys: sort by variable type/use case, not alphabetically - return { - swapKit, - loadSwapKit, - - walletType, - balanceGroupedByChain, - balances, - chains, - isConnectingWallet, - isWalletConnected, - - checkIfChainConnected, - connectKeystore, - connectWallet, - disconnectWallet, - getBalances, - - // Keystore related - keystoreFile, - - isKeystoreDecrypting, - isKeystoreOpen, - - setIsKeystoreDecrypting, - setIsKeystoreOpen, - setKeystoreFile, - }; + const balances = + (Object.entries(swapKit?.getAllWallets() || {})?.flatMap(([chain, wallet]) => + wallet?.balance?.flatMap((balance) => ({ balance, chain, identifier: `${chain}.${balance.symbol}`, wallet })), + ) as { balance: AssetValue; chain: Chain; identifier: string; wallet: ChainWallet }[]) || []; + + return useMemo( + // biome-ignore assist/source/useSortedKeys: sort by variable type/use case, not alphabetically + () => ({ + swapKit, + loadSwapKit, + + balances, + + walletType, + isConnectingWallet, + isWalletConnected, + + checkIfChainConnected, + connectKeystore, + connectWallet, + disconnectWallet, + + // Keystore related + keystoreFile, + + isKeystoreDecrypting, + isKeystoreOpen, + + setIsKeystoreDecrypting, + setIsKeystoreOpen, + setKeystoreFile, + }), + [ + swapKit, + loadSwapKit, + balances, + walletType, + isConnectingWallet, + isWalletConnected, + checkIfChainConnected, + connectKeystore, + connectWallet, + disconnectWallet, + keystoreFile, + isKeystoreDecrypting, + isKeystoreOpen, + setIsKeystoreDecrypting, + setIsKeystoreOpen, + setKeystoreFile, + ], + ); }; diff --git a/packages/ui/src/react/swapkit-widget.tsx b/packages/ui/src/react/swapkit-widget.tsx index 5e884eaac7..1dbe21ccb8 100644 --- a/packages/ui/src/react/swapkit-widget.tsx +++ b/packages/ui/src/react/swapkit-widget.tsx @@ -1,11 +1,13 @@ "use client"; -import { AssetValue, ProviderName, type QuoteResponseRoute, useSwapKitStore } from "@swapkit/sdk"; +import { AssetValue, type QuoteResponseRoute, SwapKitApi, useSwapKitStore } from "@swapkit/sdk"; +import "@swapkit/ui/swapkit.css"; import { ArrowDownUpIcon, Loader2Icon } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { match, P } from "ts-pattern"; import { getStableConfigMemoKey } from "../utils"; import { SwapInputWithChainSelector } from "./components/composable/swap-input-chain-selector"; +import { SwapQuotePreview } from "./components/composable/swap-quote-preview"; import { WalletConnectDialog } from "./components/dialogs/wallet-connect-dialog"; import { Button } from "./components/ui/button"; import { Card, CardContent } from "./components/ui/card"; @@ -14,8 +16,6 @@ import { ModalSpawner, showModal } from "./hooks/use-modal"; import { useSwapQuote } from "./hooks/use-swap-quote"; import { useSwapKit } from "./swapkit-context"; import type { SwapKitWidgetProps } from "./types"; -import "@swapkit/ui/swapkit.css"; -import { SwapQuotePreview } from "./components/composable/swap-quote-preview"; export function SwapKitWidget({ config }: SwapKitWidgetProps) { const [amount, setAmount] = useState(""); @@ -44,54 +44,40 @@ export function SwapKitWidget({ config }: SwapKitWidgetProps) { cachedStableConfigMemoKey.current = stableConfigMemoKey; }, [swapKit, stableConfigMemoKey]); - - const handleSwap = async (route: QuoteResponseRoute) => { - if (!swapKit) return; + const performSwap = async (route: QuoteResponseRoute, inputAssetValue?: AssetValue) => { + if (!(inputAssetValue && swapKit)) return; try { setIsSwapping(true); - const swap = await swapKit.swap({ route }); - await swap.wait(); - setAmount(""); - toast.success("Swap completed successfully", { toasterId: SWAPKIT_WIDGET_TOASTER_ID }); - } catch (error) { - console.error("Swap failed:", error); - toast.error(`Swap failed: ${error instanceof Error ? error.message : "Unknown error"}`, { - toasterId: SWAPKIT_WIDGET_TOASTER_ID, - }); - } finally { - setIsSwapping(false); - } - }; + if (!route?.sourceAddress || !route?.destinationAddress || Number.parseFloat(route?.sellAmount) <= 0) { + console.error("Invalid route parameters. Please check the route details and try again.", { route }); - const performSwap = async (route: QuoteResponseRoute, inputAssetValue?: AssetValue) => { - if (!(inputAssetValue && swapKit)) return; - - try { - const isChainflip = route?.providers?.includes(ProviderName.CHAINFLIP); - if (isChainflip) { - await handleSwap(route); - return; + throw new Error("Invalid route parameters. Please check the route details and try again."); } - const tx = route.tx; - if (!tx || typeof tx === "string" || !("from" in tx)) { - throw new Error("Invalid transaction format"); - } + const isApproved = await swapKit.isAssetValueApproved(inputAssetValue, route?.sourceAddress); - const isApproved = await swapKit.isAssetValueApproved(inputAssetValue, tx.from); - if (isApproved) { - await handleSwap(route); - } else { - await swapKit.approveAssetValue(inputAssetValue, tx.from); - toast.success("Asset approved, you can now swap", { toasterId: SWAPKIT_WIDGET_TOASTER_ID }); + if (!isApproved) { + await swapKit.approveAssetValue(inputAssetValue, route?.sourceAddress); } + + const routeWithTx = await SwapKitApi.getRouteWithTx({ routeId: route.routeId }); + + if (!routeWithTx) throw new Error("No route with TX found"); + + const swap = await swapKit.swap({ route: routeWithTx, useApiTx: true }); + + await swap?.wait?.(); + + toast.success("Swap transaction has been successfully submitted!", { toasterId: SWAPKIT_WIDGET_TOASTER_ID }); } catch (error) { console.error("Swap process failed:", error); toast.error(`Swap process failed: ${error instanceof Error ? error.message : "Unknown error"}`, { toasterId: SWAPKIT_WIDGET_TOASTER_ID, }); + } finally { + setIsSwapping(false); } }; @@ -128,6 +114,11 @@ export function SwapKitWidget({ config }: SwapKitWidgetProps) { .with({ amount: P.nullish }, () => "Enter Amount") .otherwise(() => "Swap"); + const isSubmitButtonDisabled = + (isWalletConnected && !(inputAsset && outputAsset && Number.parseFloat(amount ?? "0") > 0)) || + isSwapping || + isFetchingQuote; + return (

Swap

@@ -181,11 +172,7 @@ export function SwapKitWidget({ config }: SwapKitWidgetProps) { - - - - - - ); -}; - -export const triggerKeystoreFileSelect = (onSelect: (file: File) => void) => { - const input = document.createElement("input"); - input.type = "file"; - input.accept = ".txt,.json"; - input.style.display = "none"; - document.body.appendChild(input); - - input.onchange = (e) => { - const file = (e.target as HTMLInputElement).files?.[0]; - if (file) onSelect(file); - document.body.removeChild(input); - }; - - input.click(); -}; diff --git a/playgrounds/nextjs/src/components/WalletDrawer.tsx b/playgrounds/nextjs/src/components/WalletDrawer.tsx index 6735c78523..d1ee609512 100644 --- a/playgrounds/nextjs/src/components/WalletDrawer.tsx +++ b/playgrounds/nextjs/src/components/WalletDrawer.tsx @@ -1,8 +1,6 @@ "use client"; -import type { Chain } from "@swapkit/helpers"; import { ChainIcon, useModal, useSwapKit } from "@swapkit/ui/react"; import { LogOut } from "lucide-react"; -import { useMemo } from "react"; import { Button } from "~/components/ui/button"; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from "~/components/ui/sheet"; import { TokenBalance } from "./TokenBalance"; @@ -10,25 +8,7 @@ import { TruncatedAddress } from "./TruncatedAddress"; export function WalletDrawer() { const modal = useModal(); - const { balances, walletType, disconnectWallet } = useSwapKit(); - - const connectedChains = useMemo(() => { - const uniqueChains = new Set(); - for (const balance of balances) { - uniqueChains.add(balance.chain); - } - return Array.from(uniqueChains); - }, [balances]); - - const chainAddresses = useMemo(() => { - const addresses = new Map(); - for (const balance of balances) { - if (!addresses.has(balance.chain)) { - addresses.set(balance.chain, balance.address || ""); - } - } - return addresses; - }, [balances]); + const { walletType, disconnectWallet, balances } = useSwapKit(); return ( @@ -36,37 +16,31 @@ export function WalletDrawer() { Connected Wallets - {walletType} connected to {connectedChains.length} chain - {connectedChains.length !== 1 ? "s" : ""} + {walletType} connected to {balances.length} chain + {balances.length !== 1 ? "s" : ""}
- {connectedChains?.map((chain) => { - const chainBalances = balances.filter((b) => b.chain === chain); - const address = chainAddresses.get(chain); - const gasAsset = chainBalances.find((b) => b.isGasAsset); - const otherBalances = chainBalances.filter((b) => !b.isGasAsset); - + {balances?.map(({ balance, identifier }) => { return ( -
+
- -

{chain}

+ + +

{balance.chain}

- {address && } + + {balance?.address && }
+
- {gasAsset && ( -
- -
+ {balance?.getValue?.("number") > 0 ? ( + + ) : ( +
No balance found
)} - {otherBalances.map((balance) => ( - - ))} - {chainBalances.length === 0 &&
No balances found
}
); @@ -77,7 +51,7 @@ export function WalletDrawer() { className="w-full" onClick={() => { disconnectWallet(); - modal.resolve({ confirmed: true }); + modal.resolve({ confirmed: true, data: undefined }); }} variant="destructive"> diff --git a/playgrounds/nextjs/src/components/WidgetConfigurator.tsx b/playgrounds/nextjs/src/components/WidgetConfigurator.tsx index 8522b5312a..9138a4a025 100644 --- a/playgrounds/nextjs/src/components/WidgetConfigurator.tsx +++ b/playgrounds/nextjs/src/components/WidgetConfigurator.tsx @@ -1,13 +1,23 @@ "use client"; -import type { Control } from "react-hook-form"; +import { useState } from "react"; +import { type Control, useWatch } from "react-hook-form"; +import { Button } from "./ui/button"; +import { Card, CardContent } from "./ui/card"; import { InputField } from "./ui/input-field"; import { SidebarGroup } from "./ui/sidebar"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "./ui/tabs"; -export type WidgetConfiguratorFormValues = { apiKey: string; apiUrl: string }; +export type WidgetConfiguratorFormValues = { + apiKey: string; + apiUrl: string; + experimental: { apiUrlQuote: string; apiUrlSwap: string; apiKey: string }; +}; export function WidgetConfigurator({ control }: { control: Control }) { + const [isAdvancedVisible, setIsAdvancedVisible] = useState(false); + const { apiUrl, apiKey } = useWatch({ control }); + return ( @@ -22,11 +32,46 @@ export function WidgetConfigurator({ control }: { control: Control + SwapKit API Endpoint URL + + +
+ } name="apiUrl" placeholder="https://api.swapkit.dev" /> + {isAdvancedVisible && ( + + + + + + + + + + )} +
{children}
- ); diff --git a/playgrounds/nextjs/src/components/ui/button.tsx b/playgrounds/nextjs/src/components/ui/button.tsx index 33b4b6bc87..83333f0741 100644 --- a/playgrounds/nextjs/src/components/ui/button.tsx +++ b/playgrounds/nextjs/src/components/ui/button.tsx @@ -22,7 +22,7 @@ const buttonVariants = cva( variant: { default: "bg-primary text-primary-foreground hover:bg-primary/90", ghost: "hover:bg-white/[0.08] bg-transparent hover:text-foreground text-muted-foreground", - link: "text-primary underline-offset-4 hover:underline", + link: "text-foreground underline-offset-4 hover:underline p-0 h-auto", outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground", primary: "bg-primary-foreground text-primary hover:opacity-80 transition-opacity",