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 }, () => (
@@ -164,7 +144,7 @@ export function SwapAssetSelect({
))
.when(
- ({ assetsToRender }) => assetsToRender?.length <= 0,
+ ({ assets }) => assets?.length <= 0,
() => (
@@ -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 (
+
+ );
+};
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) {