diff --git a/.eslintrc.json b/.eslintrc.json index e03e9bf6..d3d7b492 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -3,7 +3,8 @@ "next/core-web-vitals", "eslint:recommended", "plugin:@typescript-eslint/recommended", - "prettier" + "prettier", + "plugin:@tanstack/eslint-plugin-query/recommended" ], "plugins": ["@typescript-eslint", "prettier", "simple-import-sort"], "parser": "@typescript-eslint/parser", diff --git a/package-lock.json b/package-lock.json index 1a724ab8..26cadf5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "@radix-ui/react-dialog": "^1.0.4", "@radix-ui/react-toast": "^1.1.4", "@radix-ui/react-tooltip": "^1.0.6", + "@skip-router/core": "^0.1.0-rc12", "@tanstack/react-query": "^4.29.5", "@types/node": "20.1.2", "@types/react": "18.2.6", @@ -65,6 +66,7 @@ }, "devDependencies": { "@playwright/test": "^1.38.0", + "@tanstack/eslint-plugin-query": "^4.36.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.4.3", @@ -171,6 +173,193 @@ } } }, + "node_modules/@axelar-network/axelar-cgp-solidity": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@axelar-network/axelar-cgp-solidity/-/axelar-cgp-solidity-4.5.0.tgz", + "integrity": "sha512-4F4rmHei0cmzeUR7/mW4Bap5rc/KlPV2crD9HA7HTRfl15mVcN6/3z8p+pAm9We6bOrQplNW9KBZ3HJFP3C1Gw==", + "engines": { + "node": "^16.0.0 || ^18.0.0" + } + }, + "node_modules/@axelar-network/axelarjs-sdk": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/@axelar-network/axelarjs-sdk/-/axelarjs-sdk-0.13.6.tgz", + "integrity": "sha512-IQBQozUzJTRxcbfTurQ7lADq1zYgns/SMPHIX0lMILfYf4DTIyDVSCmzqZVQvO5l/rR4on9ftZ8jyIaV/AqQzg==", + "hasInstallScript": true, + "dependencies": { + "@axelar-network/axelar-cgp-solidity": "^4.5.0", + "@axelar-network/axelarjs-types": "^0.33.0", + "@cosmjs/json-rpc": "^0.30.1", + "@cosmjs/stargate": "0.31.0-alpha.1", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/networks": "^5.7.1", + "@ethersproject/providers": "^5.7.2", + "@types/uuid": "^8.3.1", + "bech32": "^2.0.0", + "clone-deep": "^4.0.1", + "cross-fetch": "^3.1.5", + "ethers": "^5.7.2", + "socket.io-client": "^4.6.1", + "standard-http-error": "^2.0.1", + "string-similarity-js": "^2.1.4", + "uuid": "^8.3.2", + "ws": "^8.13.0" + } + }, + "node_modules/@axelar-network/axelarjs-sdk/node_modules/@cosmjs/json-rpc": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.30.1.tgz", + "integrity": "sha512-pitfC/2YN9t+kXZCbNuyrZ6M8abnCC2n62m+JtU9vQUfaEtVsgy+1Fk4TRQ175+pIWSdBMFi2wT8FWVEE4RhxQ==", + "dependencies": { + "@cosmjs/stream": "^0.30.1", + "xstream": "^11.14.0" + } + }, + "node_modules/@axelar-network/axelarjs-sdk/node_modules/@cosmjs/json-rpc/node_modules/@cosmjs/stream": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.30.1.tgz", + "integrity": "sha512-Fg0pWz1zXQdoxQZpdHRMGvUH5RqS6tPv+j9Eh7Q953UjMlrwZVo0YFLC8OTf/HKVf10E4i0u6aM8D69Q6cNkgQ==", + "dependencies": { + "xstream": "^11.14.0" + } + }, + "node_modules/@axelar-network/axelarjs-sdk/node_modules/@cosmjs/stargate": { + "version": "0.31.0-alpha.1", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.31.0-alpha.1.tgz", + "integrity": "sha512-kCTUT3niB2hvcHjhlxpM8cNw1KOVmgZROdJUQaO8Ts4j22OyRZRFdwRPrOIuAKpqhVW2I1vI2HQL9Bg7pk9Glw==", + "dependencies": { + "@confio/ics23": "^0.6.8", + "@cosmjs/amino": "^0.31.0-alpha.1", + "@cosmjs/encoding": "^0.31.0-alpha.1", + "@cosmjs/math": "^0.31.0-alpha.1", + "@cosmjs/proto-signing": "^0.31.0-alpha.1", + "@cosmjs/stream": "^0.31.0-alpha.1", + "@cosmjs/tendermint-rpc": "^0.31.0-alpha.1", + "@cosmjs/utils": "^0.31.0-alpha.1", + "cosmjs-types": "^0.8.0", + "long": "^4.0.0", + "protobufjs": "~6.11.3", + "xstream": "^11.14.0" + } + }, + "node_modules/@axelar-network/axelarjs-sdk/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, + "node_modules/@axelar-network/axelarjs-sdk/node_modules/cosmjs-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.8.0.tgz", + "integrity": "sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg==", + "dependencies": { + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, + "node_modules/@axelar-network/axelarjs-sdk/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/@axelar-network/axelarjs-sdk/node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@axelar-network/axelarjs-types": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@axelar-network/axelarjs-types/-/axelarjs-types-0.33.0.tgz", + "integrity": "sha512-aCbX/5G+tgWPjr9tl3dQfJftWwRMkILz61ytach7dKqxtO9G9jlxpNvELJQ6gKVOodUtSY8qBCO/fWU19v4hdQ==", + "dependencies": { + "long": "^5.2.0", + "protobufjs": "^7.0.0" + } + }, + "node_modules/@axelar-network/axelarjs-types/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/@axelar-network/axelarjs-types/node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", @@ -5326,6 +5515,38 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@skip-router/core": { + "version": "0.1.0-rc12", + "resolved": "https://registry.npmjs.org/@skip-router/core/-/core-0.1.0-rc12.tgz", + "integrity": "sha512-6YcT2+AonBsL4tCxd6Ebj3MkeCqvj2njfqaeQOA/nwN8xSplMf/3KH770wzEVFgpmBhA7tgn/mL7IiaYulEUmQ==", + "dependencies": { + "@axelar-network/axelarjs-sdk": "^0.13.6", + "@cosmjs/amino": "^0.31.1", + "@cosmjs/cosmwasm-stargate": "^0.31.1", + "@cosmjs/encoding": "^0.31.1", + "@cosmjs/math": "^0.31.1", + "@cosmjs/proto-signing": "^0.31.1", + "@cosmjs/stargate": "^0.31.1", + "@cosmjs/tendermint-rpc": "^0.31.1", + "@injectivelabs/core-proto-ts": "^0.0.18", + "@injectivelabs/sdk-ts": "^1.12.1", + "axios": "^1.4.0", + "chain-registry": "^1.19.0", + "cosmjs-types": "^0.8.0", + "faker": "^6.6.6", + "keccak256": "^1.0.6", + "viem": "^1.12.2" + } + }, + "node_modules/@skip-router/core/node_modules/cosmjs-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.8.0.tgz", + "integrity": "sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg==", + "dependencies": { + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", @@ -5518,6 +5739,19 @@ "tslib": "^2.4.0" } }, + "node_modules/@tanstack/eslint-plugin-query": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@tanstack/eslint-plugin-query/-/eslint-plugin-query-4.36.0.tgz", + "integrity": "sha512-dfKjV4k7QSAg7ROe25RlshcfkZsZKPIHcDibYtjckAlNkrwBFacCjwCsdNCt/neru6D7yCJYR0P59Ww8tg1JLQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/@tanstack/query-core": { "version": "4.35.3", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.35.3.tgz", @@ -6262,6 +6496,11 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, "node_modules/@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", @@ -8871,6 +9110,19 @@ "node": ">=0.8" } }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -11311,6 +11563,11 @@ "node": "> 0.1.90" } }, + "node_modules/faker": { + "version": "6.6.6", + "resolved": "https://registry.npmjs.org/faker/-/faker-6.6.6.tgz", + "integrity": "sha512-9tCqYEDHI5RYFQigXFwF1hnCwcWCOJl/hmll0lr5D2Ljjb0o4wphb69wikeJDz5qCEzXCoPvG6ss5SDP6IfOdg==" + }, "node_modules/fast-copy": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.1.tgz", @@ -12734,6 +12991,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -12921,6 +13189,14 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isomorphic-ws": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", @@ -14594,6 +14870,14 @@ "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz", "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==" }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -17467,6 +17751,17 @@ "buffer": "6.0.3" } }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -17719,6 +18014,19 @@ "node": ">=8" } }, + "node_modules/standard-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/standard-error/-/standard-error-1.1.0.tgz", + "integrity": "sha512-4v7qzU7oLJfMI5EltUSHCaaOd65J6S4BqKRWgzMi4EYaE5fvNabPxmAPGdxpGXqrcWjhDGI/H09CIdEuUOUeXg==" + }, + "node_modules/standard-http-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/standard-http-error/-/standard-http-error-2.0.1.tgz", + "integrity": "sha512-DX/xPIoyXQTuY6BMZK4Utyi4l3A4vFoafsfqrU6/dO4Oe/59c7PyqPd2IQj9m+ZieDg2K3RL9xOYJsabcD9IUA==", + "dependencies": { + "standard-error": ">= 1.1.0 < 2" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -17793,6 +18101,11 @@ "node": ">=10" } }, + "node_modules/string-similarity-js": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/string-similarity-js/-/string-similarity-js-2.1.4.tgz", + "integrity": "sha512-uApODZNjCHGYROzDSAdCmAHf60L/pMDHnP/yk6TAbvGg7JSPZlSto/ceCI7hZEqzc53/juU2aOJFkM2yUVTMTA==" + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -19611,6 +19924,167 @@ "zen-observable-ts": "^1.2.5" } }, + "@axelar-network/axelar-cgp-solidity": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@axelar-network/axelar-cgp-solidity/-/axelar-cgp-solidity-4.5.0.tgz", + "integrity": "sha512-4F4rmHei0cmzeUR7/mW4Bap5rc/KlPV2crD9HA7HTRfl15mVcN6/3z8p+pAm9We6bOrQplNW9KBZ3HJFP3C1Gw==" + }, + "@axelar-network/axelarjs-sdk": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/@axelar-network/axelarjs-sdk/-/axelarjs-sdk-0.13.6.tgz", + "integrity": "sha512-IQBQozUzJTRxcbfTurQ7lADq1zYgns/SMPHIX0lMILfYf4DTIyDVSCmzqZVQvO5l/rR4on9ftZ8jyIaV/AqQzg==", + "requires": { + "@axelar-network/axelar-cgp-solidity": "^4.5.0", + "@axelar-network/axelarjs-types": "^0.33.0", + "@cosmjs/json-rpc": "^0.30.1", + "@cosmjs/stargate": "0.31.0-alpha.1", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/networks": "^5.7.1", + "@ethersproject/providers": "^5.7.2", + "@types/uuid": "^8.3.1", + "bech32": "^2.0.0", + "clone-deep": "^4.0.1", + "cross-fetch": "^3.1.5", + "ethers": "^5.7.2", + "socket.io-client": "^4.6.1", + "standard-http-error": "^2.0.1", + "string-similarity-js": "^2.1.4", + "uuid": "^8.3.2", + "ws": "^8.13.0" + }, + "dependencies": { + "@cosmjs/json-rpc": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.30.1.tgz", + "integrity": "sha512-pitfC/2YN9t+kXZCbNuyrZ6M8abnCC2n62m+JtU9vQUfaEtVsgy+1Fk4TRQ175+pIWSdBMFi2wT8FWVEE4RhxQ==", + "requires": { + "@cosmjs/stream": "^0.30.1", + "xstream": "^11.14.0" + }, + "dependencies": { + "@cosmjs/stream": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.30.1.tgz", + "integrity": "sha512-Fg0pWz1zXQdoxQZpdHRMGvUH5RqS6tPv+j9Eh7Q953UjMlrwZVo0YFLC8OTf/HKVf10E4i0u6aM8D69Q6cNkgQ==", + "requires": { + "xstream": "^11.14.0" + } + } + } + }, + "@cosmjs/stargate": { + "version": "0.31.0-alpha.1", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.31.0-alpha.1.tgz", + "integrity": "sha512-kCTUT3niB2hvcHjhlxpM8cNw1KOVmgZROdJUQaO8Ts4j22OyRZRFdwRPrOIuAKpqhVW2I1vI2HQL9Bg7pk9Glw==", + "requires": { + "@confio/ics23": "^0.6.8", + "@cosmjs/amino": "^0.31.0-alpha.1", + "@cosmjs/encoding": "^0.31.0-alpha.1", + "@cosmjs/math": "^0.31.0-alpha.1", + "@cosmjs/proto-signing": "^0.31.0-alpha.1", + "@cosmjs/stream": "^0.31.0-alpha.1", + "@cosmjs/tendermint-rpc": "^0.31.0-alpha.1", + "@cosmjs/utils": "^0.31.0-alpha.1", + "cosmjs-types": "^0.8.0", + "long": "^4.0.0", + "protobufjs": "~6.11.3", + "xstream": "^11.14.0" + } + }, + "bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, + "cosmjs-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.8.0.tgz", + "integrity": "sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg==", + "requires": { + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, + "ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "requires": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "requires": {} + } + } + }, + "@axelar-network/axelarjs-types": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@axelar-network/axelarjs-types/-/axelarjs-types-0.33.0.tgz", + "integrity": "sha512-aCbX/5G+tgWPjr9tl3dQfJftWwRMkILz61ytach7dKqxtO9G9jlxpNvELJQ6gKVOodUtSY8qBCO/fWU19v4hdQ==", + "requires": { + "long": "^5.2.0", + "protobufjs": "^7.0.0" + }, + "dependencies": { + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + } + } + } + }, "@babel/code-frame": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", @@ -23602,6 +24076,40 @@ "@sinonjs/commons": "^3.0.0" } }, + "@skip-router/core": { + "version": "0.1.0-rc12", + "resolved": "https://registry.npmjs.org/@skip-router/core/-/core-0.1.0-rc12.tgz", + "integrity": "sha512-6YcT2+AonBsL4tCxd6Ebj3MkeCqvj2njfqaeQOA/nwN8xSplMf/3KH770wzEVFgpmBhA7tgn/mL7IiaYulEUmQ==", + "requires": { + "@axelar-network/axelarjs-sdk": "^0.13.6", + "@cosmjs/amino": "^0.31.1", + "@cosmjs/cosmwasm-stargate": "^0.31.1", + "@cosmjs/encoding": "^0.31.1", + "@cosmjs/math": "^0.31.1", + "@cosmjs/proto-signing": "^0.31.1", + "@cosmjs/stargate": "^0.31.1", + "@cosmjs/tendermint-rpc": "^0.31.1", + "@injectivelabs/core-proto-ts": "^0.0.18", + "@injectivelabs/sdk-ts": "^1.12.1", + "axios": "^1.4.0", + "chain-registry": "^1.19.0", + "cosmjs-types": "^0.8.0", + "faker": "^6.6.6", + "keccak256": "^1.0.6", + "viem": "^1.12.2" + }, + "dependencies": { + "cosmjs-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.8.0.tgz", + "integrity": "sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg==", + "requires": { + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + } + } + }, "@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", @@ -23791,6 +24299,13 @@ "tslib": "^2.4.0" } }, + "@tanstack/eslint-plugin-query": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@tanstack/eslint-plugin-query/-/eslint-plugin-query-4.36.0.tgz", + "integrity": "sha512-dfKjV4k7QSAg7ROe25RlshcfkZsZKPIHcDibYtjckAlNkrwBFacCjwCsdNCt/neru6D7yCJYR0P59Ww8tg1JLQ==", + "dev": true, + "requires": {} + }, "@tanstack/query-core": { "version": "4.35.3", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.35.3.tgz", @@ -24410,6 +24925,11 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, "@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", @@ -26509,6 +27029,16 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -28352,6 +28882,11 @@ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==" }, + "faker": { + "version": "6.6.6", + "resolved": "https://registry.npmjs.org/faker/-/faker-6.6.6.tgz", + "integrity": "sha512-9tCqYEDHI5RYFQigXFwF1hnCwcWCOJl/hmll0lr5D2Ljjb0o4wphb69wikeJDz5qCEzXCoPvG6ss5SDP6IfOdg==" + }, "fast-copy": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.1.tgz", @@ -29372,6 +29907,14 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==" }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, "is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -29495,6 +30038,11 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, "isomorphic-ws": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", @@ -30792,6 +31340,11 @@ "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz", "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==" }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -32882,6 +33435,14 @@ "buffer": "6.0.3" } }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -33074,6 +33635,19 @@ } } }, + "standard-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/standard-error/-/standard-error-1.1.0.tgz", + "integrity": "sha512-4v7qzU7oLJfMI5EltUSHCaaOd65J6S4BqKRWgzMi4EYaE5fvNabPxmAPGdxpGXqrcWjhDGI/H09CIdEuUOUeXg==" + }, + "standard-http-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/standard-http-error/-/standard-http-error-2.0.1.tgz", + "integrity": "sha512-DX/xPIoyXQTuY6BMZK4Utyi4l3A4vFoafsfqrU6/dO4Oe/59c7PyqPd2IQj9m+ZieDg2K3RL9xOYJsabcD9IUA==", + "requires": { + "standard-error": ">= 1.1.0 < 2" + } + }, "stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -33136,6 +33710,11 @@ "strip-ansi": "^6.0.0" } }, + "string-similarity-js": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/string-similarity-js/-/string-similarity-js-2.1.4.tgz", + "integrity": "sha512-uApODZNjCHGYROzDSAdCmAHf60L/pMDHnP/yk6TAbvGg7JSPZlSto/ceCI7hZEqzc53/juU2aOJFkM2yUVTMTA==" + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", diff --git a/package.json b/package.json index 2d9c2ea6..9649fb9a 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "@radix-ui/react-dialog": "^1.0.4", "@radix-ui/react-toast": "^1.1.4", "@radix-ui/react-tooltip": "^1.0.6", + "@skip-router/core": "^0.1.0-rc12", "@tanstack/react-query": "^4.29.5", "@types/node": "20.1.2", "@types/react": "18.2.6", @@ -68,6 +69,7 @@ }, "devDependencies": { "@playwright/test": "^1.38.0", + "@tanstack/eslint-plugin-query": "^4.36.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.4.3", diff --git a/src/api/queries.ts b/src/api/queries.ts new file mode 100644 index 00000000..4ca79943 --- /dev/null +++ b/src/api/queries.ts @@ -0,0 +1,63 @@ +import { Chain as SkipChain } from "@skip-router/core"; +import { useQuery } from "@tanstack/react-query"; +import * as chainRegistry from "chain-registry"; + +// import type { Chain as RegistryChain } from "chain-registry"; +import { useSkipClient } from "@/solve"; + +export type Chain = { + prettyName: string; + record?: (typeof chainRegistry.chains)[number]; +} & SkipChain; + +export type UseChainsQueryArgs = { + select?: (arr?: Chain[]) => T; +}; + +export function useChains(args: UseChainsQueryArgs = {}) { + const { select = (t) => t as T } = args; + + const skipRouter = useSkipClient(); + + const { data, ...queryResult } = useQuery({ + queryKey: ["skip-api-chains"], + queryFn: async () => { + const chains = await skipRouter.chains({ + includeEVM: true, + }); + + return chains + .map((chain) => { + const record = chainRegistry.chains.find( + (c) => c.chain_id === chain.chainID, + ); + + return { + ...chain, + prettyName: record?.pretty_name ?? chain.chainName, + record, + }; + }) + .sort((chainA, chainB) => { + return chainA.prettyName.localeCompare(chainB.prettyName); + }); + }, + select, + }); + + return { + ...queryResult, + chains: data, + }; +} + +export function useChainByChainID(chainID: string) { + const { chains, ...queryResult } = useChains({ + select: (chains) => (chains ?? []).find((c) => c.chainID === chainID), + }); + + return { + ...queryResult, + chain: chains, + }; +} diff --git a/src/components/AssetInput.tsx b/src/components/AssetInput.tsx index cfc625ce..4f8a49d4 100644 --- a/src/components/AssetInput.tsx +++ b/src/components/AssetInput.tsx @@ -1,8 +1,8 @@ import { ethers } from "ethers"; import { FC, Fragment, useMemo, useState } from "react"; +import { Chain } from "@/api/queries"; import { AssetWithMetadata, useAssets } from "@/context/assets"; -import { Chain } from "@/context/chains"; import { useBalancesByChain } from "@/cosmos"; import Toast from "@/elements/Toast"; import { useAccount } from "@/hooks/useAccount"; @@ -173,7 +173,7 @@ const AssetInput: FC = ({ ); diff --git a/src/components/ChainSelect/ChainSelectContent.tsx b/src/components/ChainSelect/ChainSelectContent.tsx index 9340375a..9a072fae 100644 --- a/src/components/ChainSelect/ChainSelectContent.tsx +++ b/src/components/ChainSelect/ChainSelectContent.tsx @@ -3,7 +3,7 @@ import { ArrowLeftIcon } from "@heroicons/react/20/solid"; import { FC, useEffect, useMemo, useRef, useState } from "react"; import { useWindowSize } from "usehooks-ts"; -import { Chain } from "@/context/chains"; +import { Chain } from "@/api/queries"; import { chainNameToChainlistURL } from "@/cosmos"; interface Props { @@ -42,7 +42,7 @@ const ChainSelectContent: FC = ({ chains, onChange, onClose }) => { return true; } - return chain.prettyName.toLowerCase().includes(searchValue.toLowerCase()); + return chain.chainName.toLowerCase().includes(searchValue.toLowerCase()); }); }, [chains, searchValue]); diff --git a/src/components/ChainSelect/ChainSelectTrigger.tsx b/src/components/ChainSelect/ChainSelectTrigger.tsx index bb960373..f38c4bc8 100644 --- a/src/components/ChainSelect/ChainSelectTrigger.tsx +++ b/src/components/ChainSelect/ChainSelectTrigger.tsx @@ -1,7 +1,7 @@ import { ChevronDownIcon } from "@heroicons/react/20/solid"; import { ForwardedRef, forwardRef } from "react"; -import { Chain } from "@/context/chains"; +import { Chain } from "@/api/queries"; interface Props { chain?: Chain; @@ -9,7 +9,7 @@ interface Props { const ChainSelectTrigger = forwardRef(function ChainSelectTrigger( { chain, ...props }: Props, - ref: ForwardedRef + ref: ForwardedRef, ) { return ( - - - ); -}; - interface RouteTransaction { status: "INIT" | "PENDING" | "SUCCESS"; explorerLink: string | null; @@ -136,7 +40,9 @@ const TransactionDialogContent: FC = ({ }) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { toast } = useToast(); - const { chains } = useChains(); + const { chains: skipChains } = useChains(); + + const chains = skipChains ?? []; const skipRouter = useSkipClient(); const { address: evmAddress } = useAccount(); @@ -179,7 +85,7 @@ const TransactionDialogContent: FC = ({ ); async function getCosmosKitWalletClient(chain: Chain) { - const walletRepo = await getWalletRepo(chain.record?.name ?? ""); + const walletRepo = await getWalletRepo(chain.record?.chain_name ?? ""); const currentCosmosKitWallet = localStorage.getItem( "cosmos-kit@2:core//current-wallet", @@ -368,16 +274,6 @@ const TransactionDialogContent: FC = ({ } }; - if (txComplete) { - return ( - - ); - } - return (
diff --git a/src/components/WalletModal/WalletModal.tsx b/src/components/WalletModal/WalletModal.tsx index 52b74a4c..62f56774 100644 --- a/src/components/WalletModal/WalletModal.tsx +++ b/src/components/WalletModal/WalletModal.tsx @@ -3,8 +3,8 @@ import { ArrowLeftIcon } from "@heroicons/react/20/solid"; import { FC } from "react"; import { useAccount, useConnect, useDisconnect } from "wagmi"; -import { EVM_WALLET_LOGOS } from "@/constants"; -import { useChains } from "@/context/chains"; +import { useChainByChainID } from "@/api/queries"; +import { EVM_WALLET_LOGOS } from "@/constants/constants"; import { DialogContent } from "@/elements/Dialog"; import { getChainByID } from "@/utils/utils"; @@ -96,14 +96,13 @@ export const WalletModal: FC = ({ onClose, wallets }) => { const WalletModalWithContext: FC = () => { const { connector: currentConnector } = useAccount(); const { chainID } = useWalletModal(); - const { chains } = useChains(); const { disconnect } = useDisconnect(); const { connectors, connect } = useConnect(); const { getWalletRepo } = useManager(); const { setIsOpen } = useWalletModal(); - const chain = chains.find((chain) => chain.chainID === chainID); + const { chain } = useChainByChainID(chainID); if (!chain) { return null; diff --git a/src/config/index.ts b/src/config/index.ts deleted file mode 100644 index e1b4d51b..00000000 --- a/src/config/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -export const IGNORE_CHAINS = ["agoric", "8ball"]; - -export interface ChainConfig { - id: string; - name: string; -} - -export const SUPPORTED_CHAINS: ChainConfig[] = [ - { - id: "osmosis-1", - name: "Osmosis", - }, - { - id: "cosmoshub-4", - name: "Cosmos Hub", - }, - { - id: "juno-1", - name: "Juno", - }, - { - id: "neutron-1", - name: "Neutron", - }, - { - id: "axelar-dojo-1", - name: "Axelar", - }, - { - id: "evmos_9001-2", - name: "Evmos", - }, - { - id: "stride-1", - name: "Stride", - }, - { - id: "gravity-bridge-3", - name: "Gravity Bridge", - }, -]; - -export interface SwapVenueConfig { - name: string; - imageURL: string; -} - -export const SWAP_VENUES: Record = { - "neutron-astroport": { - name: "Astroport", - imageURL: "https://avatars.githubusercontent.com/u/87135340", - }, - "osmosis-poolmanager": { - name: "Osmosis", - imageURL: - "https://raw.githubusercontent.com/cosmostation/chainlist/main/chain/osmosis/dappImg/app.png", - }, -}; diff --git a/src/constants.ts b/src/constants/constants.ts similarity index 100% rename from src/constants.ts rename to src/constants/constants.ts diff --git a/src/context/assets.tsx b/src/context/assets.tsx index 11895ff2..ddd6cb87 100644 --- a/src/context/assets.tsx +++ b/src/context/assets.tsx @@ -7,11 +7,12 @@ import { useMemo, } from "react"; +import { Chain, useChains } from "@/api/queries"; + import { filterAssetsWithMetadata, useAssets as useSolveAssets, } from "../solve"; -import { Chain, useChains } from "./chains"; export type AssetWithMetadata = Required; @@ -55,7 +56,7 @@ export const AssetsProvider: FC = ({ children }) => { const { data: solveAssets } = useSolveAssets(); const assets = useMemo(() => { - if (!solveAssets) { + if (!solveAssets || !chains) { return {}; } @@ -84,15 +85,13 @@ export const AssetsProvider: FC = ({ children }) => { } function getFeeDenom(chainID: string) { - const chain = chains.find((c) => c.chainID === chainID); + const chain = (chains ?? []).find((c) => c.chainID === chainID); - if (!chain || !chain.record?.chain.fees) { + if (!chain || !chain.feeAssets) { return undefined; } - const feeDenom = chain.record.chain.fees.fee_tokens[0].denom; - - return getAsset(feeDenom, chainID); + return getAsset(chain.feeAssets[0].denom, chainID); } function getNativeAssets() { diff --git a/src/context/chains.tsx b/src/context/chains.tsx deleted file mode 100644 index 26ea90a2..00000000 --- a/src/context/chains.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { ChainRecord } from "@cosmos-kit/core"; -import { useManager } from "@cosmos-kit/react"; -import { Chain as SkipChain } from "@skip-router/core"; -import { createContext, FC, PropsWithChildren, useContext } from "react"; - -import { useSolveChains } from "@/solve/queries"; - -export interface Chain extends SkipChain { - prettyName: string; - record?: ChainRecord; -} - -interface ChainsContext { - chains: Chain[]; -} - -export const ChainsContext = createContext({ - chains: [], -}); - -export const ChainsProvider: FC = ({ children }) => { - const { data: supportedChains } = useSolveChains(); - - const { chainRecords, walletRepos } = useManager(); - - const chains = ( - supportedChains - ? supportedChains.map((c) => { - const record = chainRecords.find( - (record) => record.chain.chain_id === c.chainID - ); - - const prettyName = record?.chain.pretty_name ?? c.chainName; - - return { - ...c, - record, - prettyName, - }; - }) - : [] - ).sort((a, b) => { - const repoA = walletRepos.find((repo) => repo.chainName === a.chainName); - const repoB = walletRepos.find((repo) => repo.chainName === b.chainName); - - if (repoA && repoB) { - if (repoA.current && !repoB.current) { - return -1; - } - - if (!repoA.current && repoB.current) { - return 1; - } - } - - if (a.prettyName < b.prettyName) { - return -1; - } - - if (a.prettyName > b.prettyName) { - return 1; - } - - return 0; - }); - - return ( - - {children} - - ); -}; - -export function useChains() { - return useContext(ChainsContext); -} diff --git a/src/cosmos/index.ts b/src/cosmos/index.ts index 9bf0e761..6b04e5d7 100644 --- a/src/cosmos/index.ts +++ b/src/cosmos/index.ts @@ -1,9 +1,8 @@ -import { SkipRouter } from "@skip-router/core"; +import { Chain, SkipRouter } from "@skip-router/core"; import { useQuery } from "@tanstack/react-query"; import { erc20ABI, PublicClient, usePublicClient } from "wagmi"; import { multicall3ABI } from "@/constants/abis"; -import { Chain } from "@/context/chains"; import { useSkipClient } from "@/solve"; import { getStargateClientForChainID } from "@/utils/utils"; @@ -53,7 +52,7 @@ export function useBalancesByChain( const skipRouter = useSkipClient(); return useQuery({ - queryKey: ["balances-by-chain", address, chain?.chainID], + queryKey: ["balances-by-chain", address, chain], queryFn: async () => { if (!chain || !address) { return {}; diff --git a/src/hooks/useAccount.ts b/src/hooks/useAccount.ts index 5f74b89a..aa26176c 100644 --- a/src/hooks/useAccount.ts +++ b/src/hooks/useAccount.ts @@ -1,15 +1,13 @@ import { useChain } from "@cosmos-kit/react"; import { useAccount as useWagmiAccount } from "wagmi"; -import { EVM_WALLET_LOGOS } from "@/constants"; -import { useChains } from "@/context/chains"; +import { useChainByChainID } from "@/api/queries"; +import { EVM_WALLET_LOGOS } from "@/constants/constants"; export function useAccount(chainID: string) { - const { chains } = useChains(); + const { chain } = useChainByChainID(chainID); - const chain = chains.find((c) => c.chainID === chainID); - - const cosmosChain = useChain(chain?.record?.name ?? "cosmoshub"); + const cosmosChain = useChain(chain?.record?.chain_name ?? "cosmoshub"); const wagmiAccount = useWagmiAccount(); diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 3bba118f..dea984a9 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -18,9 +18,8 @@ import { MetaMaskConnector } from "wagmi/connectors/metaMask"; import { publicProvider } from "wagmi/providers/public"; import MainLayout from "@/components/MainLayout"; -import { EVM_CHAINS } from "@/constants"; +import { EVM_CHAINS } from "@/constants/constants"; import { AssetsProvider } from "@/context/assets"; -import { ChainsProvider } from "@/context/chains"; import { ToastProvider } from "@/context/toast"; import { SkipProvider } from "@/solve"; import { queryClient } from "@/utils/query"; @@ -69,18 +68,16 @@ export default function App({ Component, pageProps }: AppProps) { > - - - - - - - - - - - - + + + + + + + + + + diff --git a/src/test/index.tsx b/src/test/index.tsx index 1a436782..8a9a3580 100644 --- a/src/test/index.tsx +++ b/src/test/index.tsx @@ -14,7 +14,6 @@ import { publicProvider } from "wagmi/providers/public"; import { WalletModalProvider } from "@/components/WalletModal"; import { AssetsProvider } from "@/context/assets"; -import { ChainsProvider } from "@/context/chains"; import { SkipProvider } from "@/solve"; import { queryClient } from "@/utils/query"; @@ -41,9 +40,7 @@ const AllTheProviders: FC = ({ children }) => { - - {children} - + {children} diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 838d1fd6..5a7ebb97 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -31,7 +31,7 @@ import * as chainRegistry from "chain-registry"; import { SignMode } from "cosmjs-types/cosmos/tx/signing/v1beta1/signing"; import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; -import { EVM_CHAINS } from "@/constants"; +import { EVM_CHAINS } from "@/constants/constants"; export function getChainByID(chainID: string) { return chainRegistry.chains.find(