From 7a3291531c004ed887d6070ae19cebca12f31b0e Mon Sep 17 00:00:00 2001 From: Andrew-kerslake Date: Wed, 15 Mar 2023 10:04:36 +0000 Subject: [PATCH] TFL Changes TFL Changes --- .env.development | 2 +- README.md | 12 +- package-lock.json | 252 +--------- package.json | 15 +- public/favicon.svg | 5 +- public/index.html | 4 +- src/app/App.tsx | 1 + src/app/InitChains.tsx | 49 +- src/app/InitNetworks.tsx | 116 ++--- src/app/InitQueryClient.tsx | 25 + src/app/InitTheme.tsx | 2 - src/app/InitWallet.tsx | 19 +- src/app/components/AddressTable.module.scss | 10 + src/app/components/AddressTable.tsx | 51 +- src/app/components/PopoverNone.module.scss | 2 +- src/app/routes.tsx | 176 +++---- src/app/sections/ConnectWallet.tsx | 11 +- src/app/sections/Connected.module.scss | 2 + src/app/sections/Connected.tsx | 99 ++-- src/app/sections/LCDSetting.tsx | 6 +- src/app/sections/Links.tsx | 10 +- src/app/sections/Nav.module.scss | 6 - src/app/sections/Nav.tsx | 18 +- src/app/sections/Preferences.tsx | 5 +- src/app/sections/SelectTheme.tsx | 3 - src/auth/hooks/useAuth.ts | 3 +- src/auth/modules/manage/ManageWallets.tsx | 22 - .../modules/select/SwitchWallet.module.scss | 7 + src/auth/modules/select/SwitchWallet.tsx | 126 ++--- src/auth/scripts/decrypt.ts | 32 +- src/auth/scripts/keystore.ts | 3 +- src/components/display/List.module.scss | 12 + src/components/display/List.tsx | 31 +- src/components/display/NetworkStatus.tsx | 4 +- src/components/form/AddressBox.module.scss | 21 +- src/components/form/AddressBox.tsx | 28 +- src/components/form/ChainSelector.tsx | 3 +- src/components/general/Copy.module.scss | 3 - src/components/general/CopyIcon.tsx | 6 +- src/components/general/FinderLink.tsx | 34 +- src/components/general/WalletQR.tsx | 29 ++ src/components/general/index.ts | 1 + src/components/layout/ChainFilter.tsx | 8 +- src/components/layout/Table.module.scss | 6 + src/components/token/Read.tsx | 5 +- src/config/constants.ts | 2 + src/data/Terra/TerraAPI.ts | 10 - src/data/external/tfm.ts | 2 +- src/data/queries/chains.ts | 8 +- src/data/queries/coingecko.ts | 16 + src/data/queries/tendermint.ts | 34 +- src/data/query.ts | 2 +- src/data/settings/Theme.ts | 36 +- src/index.tsx | 25 +- src/pages/charts/TxVolume.tsx | 15 +- src/pages/contract/ContractActions.tsx | 1 + src/pages/custom/TokenFilters.tsx | 4 +- src/pages/custom/WithSearchInput.tsx | 4 +- src/pages/dashboard/CommunityPool.tsx | 6 +- src/pages/dashboard/Dashboard.tsx | 5 +- src/pages/stake/StakedDonut.tsx | 6 +- src/pages/stake/ValidatorsList.tsx | 46 +- src/pages/stake/components/StakedCard.tsx | 29 +- .../stake/delegations/ChainDelegations.tsx | 2 + src/pages/stake/rewards/ChainRewards.tsx | 2 +- .../stake/unbondings/ChainUnbondings.tsx | 2 + src/pages/stake/unbondings/Unbondings.tsx | 2 +- src/pages/wallet/Asset.tsx | 4 +- src/pages/wallet/AssetList.tsx | 12 +- src/pages/wallet/AssetPage.tsx | 6 +- src/pages/wallet/NetWorth.tsx | 6 +- src/pages/wallet/ReceivePage.module.scss | 7 + src/pages/wallet/ReceivePage.tsx | 2 +- src/pages/wallet/SendPage.module.scss | 14 +- src/pages/wallet/SendPage.tsx | 8 +- src/pages/wallet/TransferPage.tsx | 8 +- src/pages/wallet/Wallet.module.scss | 1 + src/pages/wallet/Wallet.tsx | 19 +- src/styles/_customize.scss | 4 +- src/styles/_theme.scss | 440 +++--------------- src/styles/themes/Blossom/Broadcasting.png | Bin 0 -> 111371 bytes src/styles/themes/Blossom/favicon.svg | 4 + src/styles/themes/Blossom/preview.svg | 7 + src/styles/themes/themes.tsx | 196 ++------ src/txs/AddressBook/AddressBookList.tsx | 4 +- src/txs/Tx.tsx | 102 ++-- src/txs/gov/SubmitProposalForm.tsx | 10 +- src/txs/gov/VoteForm.tsx | 1 - src/txs/stake/WithdrawRewardsForm.tsx | 5 +- src/txs/swap/SwapTx.tsx | 1 + src/utils/localStorage.ts | 35 +- tsconfig.json | 1 - 92 files changed, 921 insertions(+), 1520 deletions(-) create mode 100644 src/app/InitQueryClient.tsx create mode 100644 src/components/general/WalletQR.tsx create mode 100644 src/styles/themes/Blossom/Broadcasting.png create mode 100644 src/styles/themes/Blossom/favicon.svg create mode 100644 src/styles/themes/Blossom/preview.svg diff --git a/.env.development b/.env.development index 2d7a41a..c9c3e6d 100644 --- a/.env.development +++ b/.env.development @@ -1,2 +1,2 @@ -HTTPS=false +HTTPS=true BROWSER=none diff --git a/README.md b/README.md index 4f3ce3b..9367736 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# Toxic Station +# Station ![Banner](Banner.png) -**Toxic Station** is a web application to interact with [Terra Core](https://github.com/terra-money/core) and other supported chains. +**Station** is a web application to interact with [Terra Core](https://github.com/terra-money/core) and other supported chains. Station allows users to: @@ -15,15 +15,15 @@ Station allows users to: - Earn rewards generated by staking tokens. - Participate in governance by voting on proposals and submitting your own. -## Running Toxic Station +## Running Station This project was bootstrapped with [Create React App](https://create-react-app.dev/). -Run Toxic Station with the following commands: +Run Terra Station with the following commands: ``` -git clone https://github.com/ToxicLabs/c-Station.git -cd Toxic-Station +git clone https://github.com/terra-money/station.git +cd station npm i npm run start ``` diff --git a/package-lock.json b/package-lock.json index 0e7ef2c..0093bd9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,10 +1,10 @@ { - "name": "toxic-station", + "name": "terra-station", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "toxic-station", + "name": "terra-station", "license": "MIT", "dependencies": { "@anchor-protocol/anchor.js": "^5.1.1", @@ -27,7 +27,6 @@ "classnames": "^2.3.1", "crypto-js": "^4.1.1", "date-fns": "^2.28.0", - "formik": "^2.2.9", "i18next": "^21.8.14", "i18next-browser-languagedetector": "^6.1.4", "immutability-helper": "^3.1.1", @@ -42,22 +41,18 @@ "react": "^17.0.2", "react-copy-to-clipboard": "^5.1.0", "react-dom": "^17.0.2", - "react-google-recaptcha": "^2.1.0", "react-hook-form": "7.22.5", "react-i18next": "^11.18.1", - "react-iframe": "^1.8.5", "react-modal": "^3.15.1", "react-query": "^3.39.0", "react-router-dom": "^6.3.0", - "react-toastify": "^8.1.0", "recharts": "^2.1.16", "recoil": "^0.7.2", "sass": "^1.52.1", "secp256k1": "^4.0.3", "semver": "^7.3.7", "sentence-case": "^3.0.4", - "xss": "1.0.11", - "yup": "^1.0.2" + "xss": "1.0.11" }, "devDependencies": { "@emotion/react": "^11.9.0", @@ -11492,42 +11487,6 @@ "node": ">= 6" } }, - "node_modules/formik": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", - "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==", - "funding": [ - { - "type": "individual", - "url": "https://opencollective.com/formik" - } - ], - "dependencies": { - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^3.3.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "react-fast-compare": "^2.0.1", - "tiny-warning": "^1.0.2", - "tslib": "^1.10.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/formik/node_modules/deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/formik/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -12195,6 +12154,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "devOptional": true, "dependencies": { "react-is": "^16.7.0" } @@ -12202,7 +12162,8 @@ "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "devOptional": true }, "node_modules/hoopy": { "version": "0.1.4", @@ -16468,11 +16429,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, "node_modules/lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", @@ -20032,11 +19988,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "node_modules/property-expr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", - "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" - }, "node_modules/protobufjs": { "version": "6.11.3", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", @@ -20362,18 +20313,6 @@ "node": ">=10" } }, - "node_modules/react-async-script": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/react-async-script/-/react-async-script-1.2.0.tgz", - "integrity": "sha512-bCpkbm9JiAuMGhkqoAiC0lLkb40DJ0HOEJIku+9JDjxX3Rcs+ztEOG13wbrOskt3n2DTrjshhaQ/iay+SnGg5Q==", - "dependencies": { - "hoist-non-react-statics": "^3.3.0", - "prop-types": "^15.5.0" - }, - "peerDependencies": { - "react": ">=16.4.1" - } - }, "node_modules/react-copy-to-clipboard": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", @@ -20545,23 +20484,6 @@ "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", "dev": true }, - "node_modules/react-fast-compare": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", - "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" - }, - "node_modules/react-google-recaptcha": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-google-recaptcha/-/react-google-recaptcha-2.1.0.tgz", - "integrity": "sha512-K9jr7e0CWFigi8KxC3WPvNqZZ47df2RrMAta6KmRoE4RUi7Ys6NmNjytpXpg4HI/svmQJLKR+PncEPaNJ98DqQ==", - "dependencies": { - "prop-types": "^15.5.0", - "react-async-script": "^1.1.1" - }, - "peerDependencies": { - "react": ">=16.4.1" - } - }, "node_modules/react-hook-form": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.22.5.tgz", @@ -20598,17 +20520,6 @@ } } }, - "node_modules/react-iframe": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/react-iframe/-/react-iframe-1.8.5.tgz", - "integrity": "sha512-F4cQJGs3ydaG6fJWfuz9yLwOU0Trzl6kttXuUG+vYwosH8enOOFxZWEDQCSbNVO8ayjfYZeqLxEvdvcsSy4GvA==", - "dependencies": { - "object-assign": "^4.1.1" - }, - "peerDependencies": { - "react": ">=16.x.x" - } - }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -20964,18 +20875,6 @@ "react-dom": ">=15.0.0" } }, - "node_modules/react-toastify": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.2.0.tgz", - "integrity": "sha512-Pg2Ju7NngAamarFvLwqrFomJ57u/Ay6i6zfLurt/qPynWkAkOthu6vxfqYpJCyNhHRhR4hu7+bySSeWWJu6PAg==", - "dependencies": { - "clsx": "^1.1.1" - }, - "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" - } - }, "node_modules/react-transition-group": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", @@ -24522,11 +24421,6 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, - "node_modules/tiny-case": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", - "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" - }, "node_modules/tiny-secp256k1": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", @@ -24652,11 +24546,6 @@ "node": ">=0.6" } }, - "node_modules/toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" - }, "node_modules/tough-cookie": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", @@ -27516,28 +27405,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/yup": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/yup/-/yup-1.0.2.tgz", - "integrity": "sha512-Lpi8nITFKjWtCoK3yQP8MUk78LJmHWqbFd0OOMXTar+yjejlQ4OIIoZgnTW1bnEUKDw6dZBcy3/IdXnt2KDUow==", - "dependencies": { - "property-expr": "^2.0.5", - "tiny-case": "^1.0.3", - "toposort": "^2.0.2", - "type-fest": "^2.19.0" - } - }, - "node_modules/yup/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } } }, "dependencies": { @@ -36466,32 +36333,6 @@ "mime-types": "^2.1.12" } }, - "formik": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", - "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==", - "requires": { - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^3.3.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "react-fast-compare": "^2.0.1", - "tiny-warning": "^1.0.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -37029,6 +36870,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "devOptional": true, "requires": { "react-is": "^16.7.0" }, @@ -37036,7 +36878,8 @@ "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "devOptional": true } } }, @@ -40268,11 +40111,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", @@ -43171,11 +43009,6 @@ } } }, - "property-expr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", - "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" - }, "protobufjs": { "version": "6.11.3", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", @@ -43427,15 +43260,6 @@ "whatwg-fetch": "^3.4.1" } }, - "react-async-script": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/react-async-script/-/react-async-script-1.2.0.tgz", - "integrity": "sha512-bCpkbm9JiAuMGhkqoAiC0lLkb40DJ0HOEJIku+9JDjxX3Rcs+ztEOG13wbrOskt3n2DTrjshhaQ/iay+SnGg5Q==", - "requires": { - "hoist-non-react-statics": "^3.3.0", - "prop-types": "^15.5.0" - } - }, "react-copy-to-clipboard": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", @@ -43572,20 +43396,6 @@ "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", "dev": true }, - "react-fast-compare": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", - "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" - }, - "react-google-recaptcha": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-google-recaptcha/-/react-google-recaptcha-2.1.0.tgz", - "integrity": "sha512-K9jr7e0CWFigi8KxC3WPvNqZZ47df2RrMAta6KmRoE4RUi7Ys6NmNjytpXpg4HI/svmQJLKR+PncEPaNJ98DqQ==", - "requires": { - "prop-types": "^15.5.0", - "react-async-script": "^1.1.1" - } - }, "react-hook-form": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.22.5.tgz", @@ -43601,14 +43411,6 @@ "html-parse-stringify": "^3.0.1" } }, - "react-iframe": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/react-iframe/-/react-iframe-1.8.5.tgz", - "integrity": "sha512-F4cQJGs3ydaG6fJWfuz9yLwOU0Trzl6kttXuUG+vYwosH8enOOFxZWEDQCSbNVO8ayjfYZeqLxEvdvcsSy4GvA==", - "requires": { - "object-assign": "^4.1.1" - } - }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -43849,14 +43651,6 @@ } } }, - "react-toastify": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.2.0.tgz", - "integrity": "sha512-Pg2Ju7NngAamarFvLwqrFomJ57u/Ay6i6zfLurt/qPynWkAkOthu6vxfqYpJCyNhHRhR4hu7+bySSeWWJu6PAg==", - "requires": { - "clsx": "^1.1.1" - } - }, "react-transition-group": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", @@ -46691,11 +46485,6 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, - "tiny-case": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", - "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" - }, "tiny-secp256k1": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", @@ -46798,11 +46587,6 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, - "toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" - }, "tough-cookie": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", @@ -49157,24 +48941,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true - }, - "yup": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/yup/-/yup-1.0.2.tgz", - "integrity": "sha512-Lpi8nITFKjWtCoK3yQP8MUk78LJmHWqbFd0OOMXTar+yjejlQ4OIIoZgnTW1bnEUKDw6dZBcy3/IdXnt2KDUow==", - "requires": { - "property-expr": "^2.0.5", - "tiny-case": "^1.0.3", - "toposort": "^2.0.2", - "type-fest": "^2.19.0" - }, - "dependencies": { - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" - } - } } } } diff --git a/package.json b/package.json index 0a1066d..ca10f2d 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { - "name": "toxic-station", + "name": "terra-station", "description": "A web application to interact with Terra Core.", "hompage": "https://station.terra.money", "author": "Terra (https://terra.money)", "repository": "github:terra-money/station", "license": "MIT", "scripts": { - "start": "react-scripts --openssl-legacy-provider start", - "build": "react-scripts --openssl-legacy-provider build", - "test": "react-scripts --openssl-legacy-provider test", + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", "prepare": "husky install", "pre-commit": "lint-staged", "analyze": "source-map-explorer 'build/static/js/*.js'" @@ -34,7 +34,6 @@ "classnames": "^2.3.1", "crypto-js": "^4.1.1", "date-fns": "^2.28.0", - "formik": "^2.2.9", "i18next": "^21.8.14", "i18next-browser-languagedetector": "^6.1.4", "immutability-helper": "^3.1.1", @@ -49,22 +48,18 @@ "react": "^17.0.2", "react-copy-to-clipboard": "^5.1.0", "react-dom": "^17.0.2", - "react-google-recaptcha": "^2.1.0", "react-hook-form": "7.22.5", "react-i18next": "^11.18.1", - "react-iframe": "^1.8.5", "react-modal": "^3.15.1", "react-query": "^3.39.0", "react-router-dom": "^6.3.0", - "react-toastify": "^8.1.0", "recharts": "^2.1.16", "recoil": "^0.7.2", "sass": "^1.52.1", "secp256k1": "^4.0.3", "semver": "^7.3.7", "sentence-case": "^3.0.4", - "xss": "1.0.11", - "yup": "^1.0.2" + "xss": "1.0.11" }, "devDependencies": { "@emotion/react": "^11.9.0", diff --git a/public/favicon.svg b/public/favicon.svg index 083fb0f..232dab7 100644 --- a/public/favicon.svg +++ b/public/favicon.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/public/index.html b/public/index.html index 2d11e97..c5ce01e 100644 --- a/public/index.html +++ b/public/index.html @@ -3,11 +3,11 @@ - + - Toxic Station + Station
diff --git a/src/app/App.tsx b/src/app/App.tsx index c1a0616..aadeab3 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -32,6 +32,7 @@ import NetworkStatus from "components/display/NetworkStatus" const App = () => { const { element: routes } = useNav() + return ( diff --git a/src/app/InitChains.tsx b/src/app/InitChains.tsx index c50741b..fc12f1a 100644 --- a/src/app/InitChains.tsx +++ b/src/app/InitChains.tsx @@ -2,40 +2,31 @@ import axios from "axios" import { ASSETS, STATION_ASSETS } from "config/constants" import { WhitelistProvider, WhitelistData } from "data/queries/chains" import { PropsWithChildren, useEffect, useState } from "react" -import NetworkLoading from "./NetworkLoading" const InitChains = ({ children }: PropsWithChildren<{}>) => { - const [data, setData] = useState() - useEffect(() => { - ;(async () => { - const [whitelist, ibcDenoms, legacyWhitelist] = await Promise.all([ - (async () => { - const { data } = await axios.get("/coins.json", { - baseURL: STATION_ASSETS, - }) - return data - })(), - (async () => { - const { data } = await axios.get("/ibc_denoms.json", { - baseURL: STATION_ASSETS, - }) - return data - })(), - (async () => { - const { data } = await axios.get("/station/coins.json", { - baseURL: ASSETS, - }) - return data - })(), - ]) + const [whitelist, setWhitelist] = useState() + const [ibcDenoms, setIbcDenoms] = useState() + const [legacyWhitelist, setLegacyWhitelist] = + useState() - setData({ whitelist, ibcDenoms, legacyWhitelist }) - })() + useEffect(() => { + axios + .get("/coins.json", { baseURL: STATION_ASSETS }) + .then(({ data }) => setWhitelist(data)) + axios + .get("/ibc_denoms.json", { baseURL: STATION_ASSETS }) + .then(({ data }) => setIbcDenoms(data)) + axios + .get("/station/coins.json", { baseURL: ASSETS }) + .then(({ data }) => setLegacyWhitelist(data)) }, []) - if (!data) return - - return {children} + if (!(whitelist && ibcDenoms && legacyWhitelist)) return null + return ( + + {children} + + ) } export default InitChains diff --git a/src/app/InitNetworks.tsx b/src/app/InitNetworks.tsx index 1866b1e..db839c8 100644 --- a/src/app/InitNetworks.tsx +++ b/src/app/InitNetworks.tsx @@ -2,9 +2,10 @@ import { PropsWithChildren, useEffect, useState } from "react" import axios from "axios" import { STATION_ASSETS } from "config/constants" import createContext from "utils/createContext" -import NetworkLoading from "./NetworkLoading" -import { randomAddress } from "utils/bech32" import { useCustomLCDs } from "utils/localStorage" +import { useValidNetworks } from "data/queries/tendermint" +import { WithFetching } from "components/feedback" +import { combineState } from "data/query" type TokenFilter = (network: Record) => Record @@ -12,11 +13,11 @@ export const [useNetworks, NetworksProvider] = createContext<{ networks: InterchainNetworks filterEnabledNetworks: TokenFilter filterDisabledNetworks: TokenFilter + networksLoading: boolean }>("useNetworks") const InitNetworks = ({ children }: PropsWithChildren<{}>) => { const [networks, setNetworks] = useState() - const [enabledNetworks, setEnabledNetworks] = useState([]) const { customLCDs } = useCustomLCDs() useEffect(() => { @@ -27,88 +28,61 @@ const InitNetworks = ({ children }: PropsWithChildren<{}>) => { baseURL: STATION_ASSETS, } ) - setNetworks(chains) } fetchChains() }, []) - useEffect(() => { - const testChains = async () => { - if (!networks) return - const testBase = { + const testBase = networks + ? Object.values({ ...networks.mainnet, ...networks.testnet, ...networks.classic, - //...networks.localterra, - } - - const stored = localStorage.getItem("enabledNetworks") - const cached = stored && JSON.parse(stored) - - if (cached && cached.time > Date.now() - 10 * 60 * 1000) { - setEnabledNetworks(cached.networks) - return - } - - const result = await Promise.all( - Object.values(testBase).map(async (network) => { - if (network.prefix === "terra") return network.chainID - try { - const { data } = await axios.get( - `/cosmos/bank/v1beta1/balances/${randomAddress(network.prefix)}`, - { - baseURL: customLCDs[network.chainID] || network.lcd, - timeout: 3_000, - } - ) - return Array.isArray(data.balances) && network.chainID - } catch (e) { - console.error(e) - return null - } - }) - ) + }).map((chain) => { + const lcd = customLCDs[chain.chainID] ?? chain.lcd + return { ...chain, lcd } + }) + : [] - localStorage.setItem( - "enabledNetworks", - JSON.stringify({ - time: Date.now(), - networks: result.filter((r) => typeof r === "string") as string[], - }) - ) - setEnabledNetworks( - result.filter((r) => typeof r === "string") as string[] - ) - } + const validationResult = useValidNetworks(testBase) - testChains() - }, [networks]) // eslint-disable-line + const validNetworks = validationResult.reduce( + (acc, { data }) => (data ? [...acc, data] : acc), + [] as string[] + ) + + const validationState = combineState(...validationResult) - if (!networks || !enabledNetworks.length) return + if (!networks) return null return ( - - Object.fromEntries( - Object.entries(networks).filter( - ([chainID]) => - chainID === "localterra" || enabledNetworks.includes(chainID) - ) - ), - filterDisabledNetworks: (networks) => - Object.fromEntries( - Object.entries(networks).filter( - ([chainID]) => !enabledNetworks.includes(chainID) - ) - ), - }} - > - {children} - + + {(progress) => ( + + Object.fromEntries( + Object.entries(networks).filter( + ([chainID]) => + chainID === "localterra" || validNetworks.includes(chainID) + ) + ), + filterDisabledNetworks: (networks) => + Object.fromEntries( + Object.entries(networks).filter( + ([chainID]) => !validNetworks.includes(chainID) + ) + ), + }} + > + {progress} + {children} + + )} + ) } diff --git a/src/app/InitQueryClient.tsx b/src/app/InitQueryClient.tsx new file mode 100644 index 0000000..85b68bc --- /dev/null +++ b/src/app/InitQueryClient.tsx @@ -0,0 +1,25 @@ +import { useNetworkName } from "data/wallet" +import { PropsWithChildren, useMemo } from "react" +import { QueryClient, QueryClientProvider } from "react-query" + +const InitQueryClient = ({ children }: PropsWithChildren<{}>) => { + const queryClient = useQueryClient() + const networkName = useNetworkName() + + return ( + + {children} + + ) +} + +const useQueryClient = () => { + const name = useNetworkName() + + return useMemo(() => { + if (!name) throw new Error() + return new QueryClient() + }, [name]) +} + +export default InitQueryClient diff --git a/src/app/InitTheme.tsx b/src/app/InitTheme.tsx index edeb62e..bbe1419 100644 --- a/src/app/InitTheme.tsx +++ b/src/app/InitTheme.tsx @@ -7,8 +7,6 @@ const InitTheme = () => { const validate = useValidateTheme() const valid = validate(theme) - - useEffect(() => { setTheme(valid ? theme : DefaultTheme) }, [valid, theme, setTheme]) diff --git a/src/app/InitWallet.tsx b/src/app/InitWallet.tsx index af9f1ca..44d221f 100644 --- a/src/app/InitWallet.tsx +++ b/src/app/InitWallet.tsx @@ -1,8 +1,6 @@ -import { PropsWithChildren, useEffect, useMemo } from "react" -import { QueryClient, QueryClientProvider } from "react-query" +import { PropsWithChildren, useEffect } from "react" import { WalletStatus } from "@terra-money/wallet-types" import { useWallet } from "@terra-money/use-wallet" -import { useNetworkName } from "data/wallet" import { isWallet, useAuth } from "auth" import Online from "./containers/Online" import NetworkLoading from "./NetworkLoading" @@ -11,8 +9,6 @@ import { sandbox } from "auth/scripts/env" const InitWallet = ({ children }: PropsWithChildren<{}>) => { useOnNetworkChange() const { status } = useWallet() - const queryClient = useQueryClient() - const networkName = useNetworkName() return status === WalletStatus.INITIALIZING && !sandbox ? ( ) => { }} /> ) : ( - + <> {children} - + ) } @@ -44,12 +40,3 @@ const useOnNetworkChange = () => { if (shouldDisconnect) disconnect() }, [disconnect, shouldDisconnect]) } - -const useQueryClient = () => { - const name = useNetworkName() - - return useMemo(() => { - if (!name) throw new Error() - return new QueryClient() - }, [name]) -} diff --git a/src/app/components/AddressTable.module.scss b/src/app/components/AddressTable.module.scss index 8acfe63..98162f4 100644 --- a/src/app/components/AddressTable.module.scss +++ b/src/app/components/AddressTable.module.scss @@ -1,5 +1,12 @@ @import "mixins"; +.grid__override { + height: calc(100% - 56px); + position: relative; + grid-template-columns: 1fr; + grid-template-rows: auto 1fr; +} + .address { @include flex(space-between); } @@ -15,4 +22,7 @@ .chain .name { margin-left: 10px; + text-overflow: ellipsis; + overflow: hidden; + max-width: 80px; } diff --git a/src/app/components/AddressTable.tsx b/src/app/components/AddressTable.tsx index 495b5c4..56232fd 100644 --- a/src/app/components/AddressTable.tsx +++ b/src/app/components/AddressTable.tsx @@ -1,9 +1,6 @@ import { AccAddress } from "@terra-money/feather.js" -import { FinderLink } from "components/general" import { getChainNamefromID } from "data/queries/chains" import { useNetwork, useAddress } from "data/wallet" -import { truncate } from "@terra.kitchen/utils" -import { CopyIcon } from "components/general" import { TokenIcon } from "components/token" import { useInterchainAddresses } from "auth/hooks/useAddress" import { Table } from "components/layout" @@ -12,7 +9,6 @@ import { useTranslation } from "react-i18next" import WithSearchInput from "pages/custom/WithSearchInput" import AddressBox from "components/form/AddressBox" import { useBankBalance } from "data/queries/bank" -import { useMemo } from "react" interface Props { finderLink?: boolean // either display finder link if true or AddressBox comp @@ -27,27 +23,28 @@ const AddressTable = (props: Props) => { const { t } = useTranslation() const coins = useBankBalance() - const addressData = useMemo( - () => - Object.keys(addresses) - .map((key) => ({ - address: addresses?.[key], - chainName: getChainNamefromID(key, networks) ?? key, - id: key, - })) - .sort((a) => (coins.some(({ chain }) => chain === a.id) ? -1 : 1)), - [addresses, coins, networks] + const NotConnected = () => ( +

+ {t("Connect a wallet to see your addresses")} +

) - if (!isConnected) - return ( -

- {t("Connect a wallet to see your addresses")} -

- ) + if (!isConnected) return + + const addressData = Object.keys(addresses) + .map((key) => ({ + address: addresses?.[key], + chainName: getChainNamefromID(key, networks) ?? key, + id: key, + })) + .sort((a) => (coins.some(({ chain }) => chain === a.id) ? -1 : 1)) return ( - + {(keyword: string) => ( { ), }, { + hidden: finderLink, dataIndex: "address", - hidden: !finderLink, render: (address: AccAddress) => ( -
- {truncate(address)} - -
+ ), }, - { - hidden: finderLink, - dataIndex: "address", - render: (address: AccAddress) => , - }, ]} /> )} diff --git a/src/app/components/PopoverNone.module.scss b/src/app/components/PopoverNone.module.scss index 44c226d..c0708b6 100644 --- a/src/app/components/PopoverNone.module.scss +++ b/src/app/components/PopoverNone.module.scss @@ -6,7 +6,7 @@ } .inner { - padding: 24px; + padding: 28px 20px; } .footer { diff --git a/src/app/routes.tsx b/src/app/routes.tsx index d3fa56c..354c1fb 100644 --- a/src/app/routes.tsx +++ b/src/app/routes.tsx @@ -7,23 +7,17 @@ import { ReactComponent as SwapIcon } from "styles/images/menu/Swap.svg" import { ReactComponent as StakeIcon } from "styles/images/menu/Stake.svg" import { ReactComponent as GovernanceIcon } from "styles/images/menu/Governance.svg" import { ReactComponent as ContractIcon } from "styles/images/menu/Contract.svg" -import { ReactComponent as NFTIcon } from "styles/images/menu/NFT.svg" -import LaptopChromebookIcon from '@mui/icons-material/LaptopChromebook'; -import AutoAwesomeMosaicIcon from '@mui/icons-material/AutoAwesomeMosaic'; + /* menu */ import History from "pages/history/History" -import NFT from "pages/nft/NFT" -import Dashboard from "pages/dashboard/Dashboard" import Stake from "pages/stake/Stake" import Governance from "pages/gov/Governance" -import Projects from "pages/projects/Projects" -import Home from "pages/home/Home" import Contract from "pages/contract/Contract" -import {useChainID } from "data/wallet" + /* details */ import ValidatorDetails from "pages/stake/ValidatorDetails" import ProposalDetails from "pages/gov/ProposalDetails" -import QamarFaucet from "pages/qamar/faucet/components/Home" + /* txs */ import TransferCW721Tx from "txs/wasm/TransferCW721Tx" import SwapTx from "txs/swap/SwapTx" @@ -35,13 +29,12 @@ import DepositTx from "txs/gov/DepositTx" import VoteTx from "txs/gov/VoteTx" import StoreCodeTx from "txs/wasm/StoreCodeTx" import InstantiateContractTx from "txs/wasm/InstantiateContractTx" -//import ExecuteContractTx from "txs/wasm/ExecuteContractTx" -//import MigrateContractTx from "txs/wasm/MigrateContractTx" +import ExecuteContractTx from "txs/wasm/ExecuteContractTx" +import MigrateContractTx from "txs/wasm/MigrateContractTx" import UpdateAdminContractTx from "txs/wasm/UpdateAdminContractTx" import SignMultisigTxPage from "pages/multisig/SignMultisigTxPage" import PostMultisigTxPage from "pages/multisig/PostMultisigTxPage" - /* auth */ import Auth from "auth/modules/Auth" //import ManageNetworksPage from "auth/networks/ManageNetworksPage" @@ -57,108 +50,60 @@ import Labs from "pages/labs/Labs" import NotFound from "pages/NotFound" import DonateAllVestingTokensTx from "txs/stake/DonateAllVestingTokensTx" -const ICON_SIZE = { width: 25, height: 25 } - - +const ICON_SIZE = { width: 20, height: 20 } export const useNav = () => { const { t } = useTranslation() - const chainID = useChainID() - let menu; - if(chainID !== ""){ - menu = [ - { - path: "/", - element: , - }, - { - path: "/dashboard", - element: , - title: t("Dashboard"), - icon: , - }, - { - path: "/Swap", - element: , - title: t("Swap"), - icon: , - }, - { - path: "/history", - element: , - title: t("History"), - icon: , - }, - { - path: "/stake", - element: , - title: t("Stake"), - icon: , - }, - { - path: "/gov", - element: , - title: t("Governance"), - icon: , - }, - { - path: "/contract", - element: , - title: t("Contract"), - icon: , - }, - { - path: "/nft", - element: , - title: t("NFT"), - icon: , - }, - { - path: "/projects", - element: , - title: t("Projects"), - icon: , - } - ] - }else{ - menu = [ - { - path: "/", - element: , - }, - { - path: "/Swap", - element: , - title: t("Swap"), - icon: , - }, - { - path: "/history", - element: , - title: t("History"), - icon: , - }, - { - path: "/stake", - element: , - title: t("Stake"), - icon: , - }, - { - path: "/gov", - element: , - title: t("Governance"), - icon: , - }, - { - path: "/contract", - element: , - title: t("Contract"), - icon: , - } - ] - } - + + const menu = [ + /* + { + path: "/", + element: , + title: t("Dashboard"), + icon: , + }, + */ + { + path: "/", + element: , + title: t("Swap"), + icon: , + }, + { + path: "/history", + element: , + title: t("History"), + icon: , + }, + { + path: "/stake", + element: , + title: t("Stake"), + icon: , + }, + { + path: "/gov", + element: , + title: t("Governance"), + icon: , + }, + { + path: "/contract", + element: , + title: t("Contract"), + icon: , + }, + /* + { + path: "/nft", + element: , + title: t("NFT"), + icon: , + }, + + */ + ] const routes = [ /* pages */ @@ -180,8 +125,8 @@ export const useNav = () => { { path: "/proposal/:chain/:id/vote", element: }, { path: "/contract/instantiate", element: }, { path: "/contract/store", element: }, - //{ path: "/contract/execute/:contract", element: }, - //{ path: "/contract/migrate/:contract", element: }, + { path: "/contract/execute/:contract", element: }, + { path: "/contract/migrate/:contract", element: }, { path: "/contract/updateadmin/:contract", element: , @@ -193,10 +138,9 @@ export const useNav = () => { //{ path: "/networks", element: }, //{ path: "/network/new", element: }, { path: "/settings", element: }, - { path: "/labs", element: }, - { path: "/qamarfaucet", element: }, - + /* dev */ + { path: "/labs", element: }, /* 404 */ { path: "*", element: }, diff --git a/src/app/sections/ConnectWallet.tsx b/src/app/sections/ConnectWallet.tsx index 75c0d42..35f5b7e 100644 --- a/src/app/sections/ConnectWallet.tsx +++ b/src/app/sections/ConnectWallet.tsx @@ -32,16 +32,7 @@ const ConnectWallet = ({ renderButton }: Props) => { {t("Connect")} ) - - /* - availableInstallations.push({ - icon: "", - type: availableInstallations[0].type, - identifier: "keplr-wallet", - name: "Keplr Wallet", - url: "https://chrome.google.com/webstore/detail/keplr/dmkamcknogkgcdfhhbddcghachkejeap" - }) - */ + const list = [ ...availableConnections .filter(({ type }) => type !== "READONLY") diff --git a/src/app/sections/Connected.module.scss b/src/app/sections/Connected.module.scss index c3ff0de..8fcbd92 100644 --- a/src/app/sections/Connected.module.scss +++ b/src/app/sections/Connected.module.scss @@ -1,5 +1,7 @@ .popover { min-width: 260px; + background-color: var(--card-bg-muted); + border-radius: var(--border-radius); } .modal { diff --git a/src/app/sections/Connected.tsx b/src/app/sections/Connected.tsx index 3ccb9a0..27ea311 100644 --- a/src/app/sections/Connected.tsx +++ b/src/app/sections/Connected.tsx @@ -2,27 +2,37 @@ import { useState } from "react" import { useTranslation } from "react-i18next" import AccountBalanceWalletIcon from "@mui/icons-material/AccountBalanceWallet" import GroupsIcon from "@mui/icons-material/Groups" -import QrCodeIcon from "@mui/icons-material/QrCode" import UsbIcon from "@mui/icons-material/Usb" import BluetoothIcon from "@mui/icons-material/Bluetooth" import { truncate } from "@terra.kitchen/utils" import { useAddress } from "data/wallet" import { useTnsName } from "data/external/tns" -import { Button, Copy } from "components/general" -import CopyStyles from "components/general/Copy.module.scss" -import { Flex, Grid } from "components/layout" -import { Tooltip, Popover } from "components/display" -import { isWallet, useAuth } from "auth" +import { Button } from "components/general" +import { Grid } from "components/layout" +import { Popover, List } from "components/display" +import { isWallet } from "auth" +import useAuth from "auth/hooks/useAuth" import SwitchWallet from "auth/modules/select/SwitchWallet" import PopoverNone from "../components/PopoverNone" -import WalletQR from "./WalletQR" import styles from "./Connected.module.scss" +import { useRecoilState } from "recoil" +import { isWalletBarOpen, walletBarRoute, Path } from "pages/wallet/Wallet" +import { useNavigate } from "react-router-dom" +import { useWallet } from "@terra-money/use-wallet" +import { + Contacts as ContactsIcon, + Logout as LogoutIcon, +} from "@mui/icons-material" const Connected = () => { const { t } = useTranslation() const address = useAddress() - const { wallet, getLedgerKey } = useAuth() + const navigate = useNavigate() + const { wallet, getLedgerKey, disconnect: disconnectLedger } = useAuth() + const { disconnect } = useWallet() const { data: name } = useTnsName(address ?? "") + const [, setWalletIsOpen] = useRecoilState(isWalletBarOpen) + const [, setWalletRoute] = useRecoilState(walletBarRoute) /* hack to close popover */ const [key, setKey] = useState(0) @@ -36,43 +46,52 @@ const Connected = () => { children: t("Manage wallets"), } + const list = [ + { + onClick: () => { + isWallet.ledger(wallet) ? disconnectLedger() : disconnect() + navigate("/", { replace: true }) + closePopover() + }, + children: t("Disconnect"), + icon: , + }, + { + onClick: () => { + setWalletIsOpen(true) + setWalletRoute({ + path: Path.receive, + previousPage: { path: Path.wallet }, + }) + closePopover() + }, + children: t("View wallet addresses"), + icon: , + }, + ] + + if (isWallet.ledger(wallet)) { + list.push({ + onClick: async () => { + const lk = await getLedgerKey("330") + lk.showAddressAndPubKey("terra") + }, + children: t("Show address in Ledger"), + icon: , + }) + } + return ( - - -
{truncate(address)}
- - - ( - - - - )} - /> - - {isWallet.ledger(wallet) && ( - - - - )} - -
- + + + } diff --git a/src/app/sections/LCDSetting.tsx b/src/app/sections/LCDSetting.tsx index 38298cc..caad30c 100644 --- a/src/app/sections/LCDSetting.tsx +++ b/src/app/sections/LCDSetting.tsx @@ -1,6 +1,6 @@ import { useNetworkName, useNetworkOptions } from "data/wallet" import { useForm } from "react-hook-form" -import { Form, FormItem, Input} from "components/form" +import { Form, FormItem, Input } from "components/form" import { useTranslation } from "react-i18next" import { useNetworks } from "app/InitNetworks" import ChainSelector from "components/form/ChainSelector" @@ -44,8 +44,8 @@ const LCDSetting = () => { () => Object.values(networks[network] ?? {}) .sort((a, b) => { - if (a.prefix === "terra") return -1 - if (b.prefix === "terra") return 1 + if (a?.prefix === "terra") return -1 + if (b?.prefix === "terra") return 1 return 0 }) .map(({ chainID }) => chainID), diff --git a/src/app/sections/Links.tsx b/src/app/sections/Links.tsx index 0b57b2d..7914232 100644 --- a/src/app/sections/Links.tsx +++ b/src/app/sections/Links.tsx @@ -13,11 +13,11 @@ const Links = () => { const isConnected = useAddress() const community = { - medium: "https://medium.com/@ToxicLabsDAO", - discord: "https://discord.gg/KMAEHcGx", - telegram: "https://t.me/ToxicLabs_DAO", - twitter: "https://twitter.com/ToxicLabsDAO", - github: "https://github.com/ToxicLabs", + medium: "https://medium.com/terra-money", + discord: "https://terra.sc/discord", + telegram: "https://t.me/TerraNetworkLobby", + twitter: "https://twitter.com/terra_money", + github: "https://github.com/terra-money", } return ( diff --git a/src/app/sections/Nav.module.scss b/src/app/sections/Nav.module.scss index d582880..eac8d53 100644 --- a/src/app/sections/Nav.module.scss +++ b/src/app/sections/Nav.module.scss @@ -49,7 +49,6 @@ @media (max-width: 500px) { display: none; } - width: 600px; } .link { @@ -77,9 +76,4 @@ display: none; } } - } - -.alink{ - text-decoration:none !important; -} \ No newline at end of file diff --git a/src/app/sections/Nav.tsx b/src/app/sections/Nav.tsx index de90f71..e196305 100644 --- a/src/app/sections/Nav.tsx +++ b/src/app/sections/Nav.tsx @@ -6,29 +6,25 @@ import CloseIcon from "@mui/icons-material/Close" import { mobileIsMenuOpenState } from "components/layout" import { useNav } from "../routes" import styles from "./Nav.module.scss" -///import { useThemeFavicon } from "data/settings/Theme" +import { useThemeFavicon } from "data/settings/Theme" import { isWalletBarOpen } from "pages/wallet/Wallet" -import ToxicIcon from "styles/images/menu/ToxicLabsLogo.svg" const cx = classNames.bind(styles) - const Nav = () => { useCloseMenuOnNavigate() const { menu } = useNav() - //const icon = useThemeFavicon() + const icon = useThemeFavicon() const [isOpen, setIsOpen] = useRecoilState(mobileIsMenuOpenState) const close = () => setIsOpen(false) return (
@@ -16,8 +18,9 @@ const Dashboard = () => { // TODO: recreate LunaPrice with coingecko API // isClassic && } - + + diff --git a/src/pages/stake/StakedDonut.tsx b/src/pages/stake/StakedDonut.tsx index 14d8e76..6c5cecd 100644 --- a/src/pages/stake/StakedDonut.tsx +++ b/src/pages/stake/StakedDonut.tsx @@ -58,7 +58,7 @@ const StakedDonut = ({ chain }: { chain: string }) => { )}

{entry.payload.moniker}

- {percentage < 1 ? `< ${percentage}` : percentage}% + {percentage < 1 ? `< 1` : percentage}%

) : ( @@ -70,7 +70,7 @@ const StakedDonut = ({ chain }: { chain: string }) => { />

{entry.value}

- {Math.round(entry.payload.percent * 100)}% + {percentage < 1 ? `< 1` : percentage}%

)} @@ -133,7 +133,7 @@ const StakedDonut = ({ chain }: { chain: string }) => { outerRadius={100} fill="#8884d8" paddingAngle={0} - dataKey="value" + dataKey={chain !== "all" ? "amount" : "value"} > {graphData[chain || "all"].map((_, index) => ( { if (!validators) return null const priorityVals = getPriorityVals(validators) const calcRate = getCalcVotingPowerRate(validators) - if (chainID === "columbus-5") { - return validators - .filter(({ status, commission }) => (showAll || !getIsUnbonded(status)) && Number(commission.commission_rates.rate) >= MAX_COMMISSION) - .map((validator) => { - const { operator_address } = validator - const voting_power_rate = calcRate(operator_address) - return { - ...validator, - rank: - (priorityVals.includes(operator_address) ? 1 : 0) + Math.random(), - voting_power_rate, - } - }) - .sort((a, b) => b.rank - a.rank) - } else { - return validators - .filter(({ status, commission }) => (showAll || !getIsUnbonded(status))) - .map((validator) => { - const { operator_address } = validator - const voting_power_rate = calcRate(operator_address) - return { - ...validator, - rank: - (priorityVals.includes(operator_address) ? 1 : 0) + Math.random(), - voting_power_rate, - } - }) - .sort((a, b) => b.rank - a.rank) - } - }, [validators, showAll,chainID]) + return validators + .filter(({ status }) => showAll || !getIsUnbonded(status)) + .map((validator) => { + const { operator_address } = validator + const voting_power_rate = calcRate(operator_address) + return { + ...validator, + rank: + (priorityVals.includes(operator_address) ? 1 : 0) + Math.random(), + voting_power_rate, + } + }) + .sort((a, b) => b.rank - a.rank) + }, [validators, showAll]) if (!activeValidators) return null diff --git a/src/pages/stake/components/StakedCard.tsx b/src/pages/stake/components/StakedCard.tsx index 2aa251c..4818b61 100644 --- a/src/pages/stake/components/StakedCard.tsx +++ b/src/pages/stake/components/StakedCard.tsx @@ -22,9 +22,14 @@ const StakedCard = (props: PropsWithChildren) => { - {value !== "-1" ? ( + {(value !== "-1" && value !== "0") || + (amount !== undefined && new BigNumber(amount || 0).gt(0.0)) ? ( ) => { {currency.symbol} {children} - {new BigNumber(amount || -1).gt(0.0) && - showTokens && - cardName === "rewards" && ( - - )} + {new BigNumber(amount || -1).gt(0.0) && showTokens && ( + + )} ) : ( diff --git a/src/pages/stake/delegations/ChainDelegations.tsx b/src/pages/stake/delegations/ChainDelegations.tsx index 16b96d5..60ee4cd 100644 --- a/src/pages/stake/delegations/ChainDelegations.tsx +++ b/src/pages/stake/delegations/ChainDelegations.tsx @@ -49,6 +49,7 @@ const ChainDelegations = ({ chain }: { chain: string }) => { ) const totalToDisplay = chainTotalPriceAndAmount?.price + const showTokens = chainTotalPriceAndAmount?.amount !== -1 const list = chainDelegations || [] @@ -71,6 +72,7 @@ const ChainDelegations = ({ chain }: { chain: string }) => { denom={chainDenom} onClick={open} cardName={"delegations"} + showTokens={showTokens} /> )} > diff --git a/src/pages/stake/rewards/ChainRewards.tsx b/src/pages/stake/rewards/ChainRewards.tsx index c7e972d..b7ee19e 100644 --- a/src/pages/stake/rewards/ChainRewards.tsx +++ b/src/pages/stake/rewards/ChainRewards.tsx @@ -102,7 +102,7 @@ const ChainRewards = ({ chain }: { chain: string }) => { } value={totalToDisplay?.toString() || "-1"} - amount={amountToDisplay} + amount={amountToDisplay.toString()} denom={networks[chain]?.baseAsset || ""} showTokens={showTokens} onClick={open} diff --git a/src/pages/stake/unbondings/ChainUnbondings.tsx b/src/pages/stake/unbondings/ChainUnbondings.tsx index c50b1af..02a7aa2 100644 --- a/src/pages/stake/unbondings/ChainUnbondings.tsx +++ b/src/pages/stake/unbondings/ChainUnbondings.tsx @@ -63,6 +63,7 @@ const ChainUnbondings = ({ chain }: { chain: string }) => { const list = flattenUnbondings(chainUnbondings) const totalToDisplay = chainTotalPriceAndAmount?.price + const showTokens = chainTotalPriceAndAmount?.amount !== -1 return ( { denom={chainDenom} onClick={open} cardName={"undelegations"} + showTokens={showTokens} /> )} > diff --git a/src/pages/stake/unbondings/Unbondings.tsx b/src/pages/stake/unbondings/Unbondings.tsx index 9516d9a..3c39f0c 100644 --- a/src/pages/stake/unbondings/Unbondings.tsx +++ b/src/pages/stake/unbondings/Unbondings.tsx @@ -68,7 +68,7 @@ const Unbondings = () => { > {title} - {total !== -1 && ( + {total !== 0 && ( View More )} diff --git a/src/pages/wallet/Asset.tsx b/src/pages/wallet/Asset.tsx index 7543ad4..3749023 100644 --- a/src/pages/wallet/Asset.tsx +++ b/src/pages/wallet/Asset.tsx @@ -40,7 +40,7 @@ const Asset = (props: Props) => { className={styles.asset} key={token} onClick={() => - setRoute({ path: Path.coin, denom: token, previusPage: route }) + setRoute({ path: Path.coin, denom: token, previousPage: route }) } >
@@ -73,7 +73,7 @@ const Asset = (props: Props) => { token="" /> ) : ( - "-" + "—" )}

diff --git a/src/pages/wallet/AssetList.tsx b/src/pages/wallet/AssetList.tsx index 8e24873..57ca825 100644 --- a/src/pages/wallet/AssetList.tsx +++ b/src/pages/wallet/AssetList.tsx @@ -65,14 +65,12 @@ const AssetList = () => { ), ] .filter( - (a) => (hideNoWhitelist ? !a.symbol.endsWith("...") : a) // TODO: update and implement whitelist check + (a) => (hideNoWhitelist ? !a.symbol.endsWith("...") : true) // TODO: update and implement whitelist check ) - .filter((asset) => { - if (!hideLowBal) return true - - if (alwaysVisibleDenoms.has(asset.denom)) return true - - return hideLowBal ? asset.price * toInput(asset.balance) >= 1 : asset + .filter((a) => { + if (!hideLowBal || a.price === 0 || alwaysVisibleDenoms.has(a.denom)) + return true + return a.price * toInput(a.balance) >= 1 }) .sort( (a, b) => diff --git a/src/pages/wallet/AssetPage.tsx b/src/pages/wallet/AssetPage.tsx index 5186c84..f6d90e2 100644 --- a/src/pages/wallet/AssetPage.tsx +++ b/src/pages/wallet/AssetPage.tsx @@ -29,7 +29,7 @@ const AssetPage = () => { (acc, b) => acc + parseInt(b.amount), 0 ) - const price = symbol.endsWith("...") ? 0 : prices?.[token]?.price ?? 0 + const price = symbol?.endsWith("...") ? 0 : prices?.[token]?.price ?? 0 return ( <> @@ -75,7 +75,7 @@ const AssetPage = () => { setRoute({ path: Path.send, denom, - previusPage: route, + previousPage: route, }) } > @@ -85,7 +85,7 @@ const AssetPage = () => { onClick={() => setRoute({ path: Path.receive, - previusPage: route, + previousPage: route, }) } > diff --git a/src/pages/wallet/NetWorth.tsx b/src/pages/wallet/NetWorth.tsx index 62ae937..daa02f0 100644 --- a/src/pages/wallet/NetWorth.tsx +++ b/src/pages/wallet/NetWorth.tsx @@ -25,7 +25,7 @@ const NetWorth = () => { return ( acc + (parseInt(amount) * - (symbol.endsWith("...") ? 0 : prices?.[token]?.price ?? 0)) / + (symbol?.endsWith("...") ? 0 : prices?.[token]?.price ?? 0)) / 10 ** decimals ) }, 0) @@ -45,7 +45,7 @@ const NetWorth = () => { onClick={() => setRoute({ path: Path.send, - previusPage: route, + previousPage: route, }) } > @@ -55,7 +55,7 @@ const NetWorth = () => { onClick={() => setRoute({ path: Path.receive, - previusPage: route, + previousPage: route, }) } > diff --git a/src/pages/wallet/ReceivePage.module.scss b/src/pages/wallet/ReceivePage.module.scss index 11f1f0d..b8fad40 100644 --- a/src/pages/wallet/ReceivePage.module.scss +++ b/src/pages/wallet/ReceivePage.module.scss @@ -8,6 +8,8 @@ max-width: var(--wallet-width); box-sizing: border-box; overflow-y: auto; + height: 100%; + position: relative; h1 { font-size: 18pt; @@ -38,3 +40,8 @@ color: var(--button-primary-text); } } + +.address__table { + max-height: 655px; + align-items: start; +} diff --git a/src/pages/wallet/ReceivePage.tsx b/src/pages/wallet/ReceivePage.tsx index 5580c1a..ec255fb 100644 --- a/src/pages/wallet/ReceivePage.tsx +++ b/src/pages/wallet/ReceivePage.tsx @@ -8,7 +8,7 @@ const ReceivePage = () => { return (

{capitalize(t("receive"))}

- +
) } diff --git a/src/pages/wallet/SendPage.module.scss b/src/pages/wallet/SendPage.module.scss index 772ba74..68c456f 100644 --- a/src/pages/wallet/SendPage.module.scss +++ b/src/pages/wallet/SendPage.module.scss @@ -16,6 +16,7 @@ padding: 20px; margin-top: 0.2rem; padding-bottom: 40px; + padding-top: 4.5rem; max-width: var(--wallet-width); box-sizing: border-box; overflow-y: auto; @@ -51,10 +52,21 @@ margin-top: 1.2rem; } h1 { - margin-left: 2rem; + margin-top: 1.45rem; + margin-bottom: 1.45rem; + margin-left: 3rem; } } +.form__header__wrapper { + position: absolute; + top: 0; + left: 0; + width: 100%; + background-color: var(--card-bg-muted); + z-index: 9; +} + .destination { color: var(--button-primary-bg); } diff --git a/src/pages/wallet/SendPage.tsx b/src/pages/wallet/SendPage.tsx index 389396c..e61bbe4 100644 --- a/src/pages/wallet/SendPage.tsx +++ b/src/pages/wallet/SendPage.tsx @@ -115,8 +115,8 @@ const SendPage = () => { availableAssets .find(({ denom }) => denom === (asset ?? defaultAsset)) ?.chains.sort((a, b) => { - if (networks[a].prefix === "terra") return -1 - if (networks[b].prefix === "terra") return 1 + if (networks[a]?.prefix === "terra") return -1 + if (networks[b]?.prefix === "terra") return 1 return 0 }), [asset, availableAssets, defaultAsset, networks] @@ -327,7 +327,9 @@ const SendPage = () => {
-

{t("Send")}

+
+

{t("Send")}

+
{ availableAssets .find(({ denom }) => denom === (asset ?? defaultAsset)) ?.chains.sort((a, b) => { - if (networks[a].prefix === "terra") return -1 - if (networks[b].prefix === "terra") return 1 + if (networks[a]?.prefix === "terra") return -1 + if (networks[b]?.prefix === "terra") return 1 return 0 }), [asset, availableAssets, defaultAsset, networks] @@ -120,8 +120,8 @@ const TransferPage = () => { Object.keys(networks) .filter((chainID) => chainID !== chain) .sort((a, b) => { - if (networks[a].prefix === "terra") return -1 - if (networks[b].prefix === "terra") return 1 + if (networks[a]?.prefix === "terra") return -1 + if (networks[b]?.prefix === "terra") return 1 return 0 }), [networks, availableChains, chain] // eslint-disable-line diff --git a/src/pages/wallet/Wallet.module.scss b/src/pages/wallet/Wallet.module.scss index da81871..2858b0f 100644 --- a/src/pages/wallet/Wallet.module.scss +++ b/src/pages/wallet/Wallet.module.scss @@ -107,6 +107,7 @@ position: absolute; top: 2rem; left: 18px; + z-index: 99; svg path { fill: var(--text); diff --git a/src/pages/wallet/Wallet.tsx b/src/pages/wallet/Wallet.tsx index 2f03ccd..5f72a9f 100644 --- a/src/pages/wallet/Wallet.tsx +++ b/src/pages/wallet/Wallet.tsx @@ -26,16 +26,16 @@ type Route = | { path: Path.coin denom: string - previusPage: Route + previousPage: Route } | { path: Path.receive - previusPage: Route + previousPage: Route } | { path: Path.send denom?: string - previusPage: Route + previousPage: Route } // Handle routing inside Wallet @@ -51,24 +51,29 @@ export const isWalletBarOpen = atom({ default: true, }) +export const walletBarRoute = atom({ + key: "walletBarRoute", + default: { path: Path.wallet } as Route, +}) + const Wallet = () => { const [isOpen, setIsOpen] = useRecoilState(isWalletBarOpen) - const [route, setRoute] = useState({ path: Path.wallet }) + const [route, setRoute] = useRecoilState(walletBarRoute) - function BackButton() { + const BackButton = () => { if (route.path === Path.wallet) return null return ( ) } - function render() { + const render = () => { switch (route.path) { case Path.wallet: return ( diff --git a/src/styles/_customize.scss b/src/styles/_customize.scss index 6aa1915..d71e049 100644 --- a/src/styles/_customize.scss +++ b/src/styles/_customize.scss @@ -5,7 +5,7 @@ /* tooltip:default */ .tippy-box { background-color: var(--text); - border-radius: 4px; + border-radius: var(--border-radius); color: var(--card-bg); font-size: var(--font-size-small); @@ -15,7 +15,7 @@ ul { list-style: initial; - padding-left: 12px; + padding-left: 24px; } } diff --git a/src/styles/_theme.scss b/src/styles/_theme.scss index e391662..18012d5 100644 --- a/src/styles/_theme.scss +++ b/src/styles/_theme.scss @@ -40,22 +40,28 @@ --button-primary-bg-h: 218; --button-primary-bg-s: 94%; --button-primary-bg-l: 47%; - --button-primary-bg: hsl(var(--button-primary-bg-h), - var(--button-primary-bg-s), - var(--button-primary-bg-l)); + --button-primary-bg: hsl( + var(--button-primary-bg-h), + var(--button-primary-bg-s), + var(--button-primary-bg-l) + ); --button-danger-bg-h: 356; --button-danger-bg-s: 100%; --button-danger-bg-l: 67%; - --button-danger-bg: hsl(var(--button-danger-bg-h), - var(--button-danger-bg-s), - var(--button-danger-bg-l)); + --button-danger-bg: hsl( + var(--button-danger-bg-h), + var(--button-danger-bg-s), + var(--button-danger-bg-l) + ); --button-primary-text: hsl(0 0% 95%); --button-default-bg-h: 222; --button-default-bg-s: 77%; --button-default-bg-l: 95%; - --button-default-bg: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - var(--button-default-bg-l)); + --button-default-bg: hsl( + var(--button-default-bg-h), + var(--button-default-bg-s), + var(--button-default-bg-l) + ); --button-default-text: hsl(226 71% 43%); --menu-bg: hsl(215 100% 33%); @@ -96,160 +102,33 @@ --menu-border: var(--card-border); --menu-text: var(--text); } - - img[alt~="Station"] { - //filter: invert(100%) sepia(1%) saturate(0%) hue-rotate(208deg) brightness(106%) contrast(100%); - height: 48px; - width: 48px; - border-radius: 100%; - padding: 5px; - border: 0.15rem solid white; - } -} - -.lettuce { - --button-primary-bg-h: 218; - --button-primary-bg-s: 94%; - --button-primary-bg-l: 47%; - --button-primary-bg: hsl(var(--button-primary-bg-h), - var(--button-primary-bg-s), - var(--button-primary-bg-l)); - --button-danger-bg-h: 356; - --button-danger-bg-s: 100%; - --button-danger-bg-l: 67%; - --button-danger-bg: hsl(var(--button-danger-bg-h), - var(--button-danger-bg-s), - var(--button-danger-bg-l)); - --button-primary-text: hsl(0 0% 95%); - --button-default-bg-h: 222; - --button-default-bg-s: 77%; - --button-default-bg-l: 95%; - --button-default-bg: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - var(--button-default-bg-l)); - --button-default-text: hsl(226 71% 43%); - - --menu-bg: hsl(110, 71%, 50%); - --menu-border: hsla(0, 0%, 100%, 0.15); - --menu-text: hsl(0 0% 91%); - - --link: var(--button-primary-bg); - --text: hsl(226 70% 42%); - --text-muted: hsl(226deg 70% 42% / 85%); - --chart: hsl(215 90% 57%); - - --bg: hsl(91, 90%, 52%); - --bg-muted: hsl(229 73% 97%); - --card-bg: hsl(0 0% 100%); - --card-bg-muted: hsl(223, 47%, 97%); - --card-border: hsl(213, 16%, 89%); - --input-bg: var(--card-bg); - --input-border: hsl(220 39% 86%); - - --wallet-shadow: 1px 0px 10px 2px rgb(0 0 0 / 31%); - - --info: hsl(221, 91%, 59%); - --info-light: hsl(224 82% 60% / 0.1); - --warning: hsl(36 98% 50%); - --warning-light: hsl(36 98% 50% / 0.1); - --success: hsl(168 71% 39%); - --success-light: hsl(168 71% 39% / 0.1); - --danger: hsl(0, 83%, 60%); - --danger-light: hsl(0 83% 60% / 0.1); - - --extension-bg: hsl(227 62% 11%); - --extension-text: hsl(210 89% 61%); - - --wallet-shadow-color: rgb(0 0 0 / 31%); - - img[alt~="Station"] { - //filter: invert(100%) sepia(1%) saturate(0%) hue-rotate(208deg) brightness(106%) contrast(100%); - height: 48px; - width: 48px; - border-radius: 100%; - padding: 5px; - border: 0.15rem solid white; - } -} - -.toxic { - --button-primary-bg-h: 125; - --button-primary-bg-s: 90%; - --button-primary-bg-l: 21%; - --button-primary-bg: hsl(var(--button-primary-bg-h), - var(--button-primary-bg-s), - var(--button-primary-bg-l)); - --button-primary-text: hsl(0 0% 95%); - --button-default-bg-h: 240; - --button-default-bg-s: 5%; - --button-default-bg-l: 22%; - --button-default-bg: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - var(--button-default-bg-l)); - --button-default-text: hsl(0 0% 87%); - - --dark-button-hover-only: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - calc(var(--button-default-bg-l) - 2%)); - - --menu-bg: hsl(240, 6%, 21%); - --menu-border: hsl(240, 5%, 21%); - --menu-text: hsl(0, 0%, 91%); - - --link: var(--button-primary-bg); - --text: hsl(0, 0%, 95%); - --text-muted: hsl(0 0% 55%); - --chart: hsl(125 90% 21%); - - --bg: hsl(0, 0%, 12%); - --bg-muted: hsl(240 5% 22%); - --card-bg: hsl(239, 6%, 17%); - --card-bg-muted: hsl(240, 5%, 15%); - --card-border: hsl(240 5% 22%); - --input-bg: var(--card-bg); - --input-border: hsl(0 0% 30%); - - --wallet-shadow: 0 0 15px 3px #000000c7; - - --extension-bg: var(--card-bg); - --extension-text: var(--text); - - --wallet-shadow-color: #0000009c; - -#station { - background-image: url("mainBackground.png"); - background-size: 100%; - } - - img[alt~="Station"] { - // filter: brightness(0) saturate(100%) invert(21%) sepia(79%) saturate(1999%) hue-rotate(117deg) brightness(89%) contrast(103%); - height: 48px; - width: 48px; - border-radius: 100%; - padding: 5px; - border: 0.15rem solid white; - } } .dark { --button-primary-bg-h: 224; --button-primary-bg-s: 82%; --button-primary-bg-l: 60%; - --button-primary-bg: hsl(var(--button-primary-bg-h), - var(--button-primary-bg-s), - var(--button-primary-bg-l)); + --button-primary-bg: hsl( + var(--button-primary-bg-h), + var(--button-primary-bg-s), + var(--button-primary-bg-l) + ); --button-primary-text: hsl(0 0% 95%); --button-default-bg-h: 240; --button-default-bg-s: 5%; --button-default-bg-l: 22%; - --button-default-bg: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - var(--button-default-bg-l)); + --button-default-bg: hsl( + var(--button-default-bg-h), + var(--button-default-bg-s), + var(--button-default-bg-l) + ); --button-default-text: hsl(0 0% 87%); - --dark-button-hover-only: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - calc(var(--button-default-bg-l) - 2%)); + --dark-button-hover-only: hsl( + var(--button-default-bg-h), + var(--button-default-bg-s), + calc(var(--button-default-bg-l) - 2%) + ); --menu-bg: hsl(240, 6%, 17%); --menu-border: hsl(240, 5%, 22%); @@ -272,33 +151,28 @@ --extension-bg: var(--card-bg); --extension-text: var(--text); - + --wallet-shadow-color: #0000009c; - - img[alt~="Station"] { - //filter: invert(46%) sepia(60%) saturate(4927%) hue-rotate(203deg) brightness(102%) contrast(91%); - height: 48px; - width: 48px; - border-radius: 100%; - padding: 5px; - border: 0.15rem solid white; - } } -.toxicRose { +.blossom { --button-primary-bg-h: 341; --button-primary-bg-s: 100%; --button-primary-bg-l: 59%; - --button-primary-bg: hsl(var(--button-primary-bg-h), - var(--button-primary-bg-s), - var(--button-primary-bg-l)); + --button-primary-bg: hsl( + var(--button-primary-bg-h), + var(--button-primary-bg-s), + var(--button-primary-bg-l) + ); --button-primary-text: hsl(0 0% 95%); --button-default-bg-h: 331; --button-default-bg-s: 100%; --button-default-bg-l: 95%; - --button-default-bg: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - var(--button-default-bg-l)); + --button-default-bg: hsl( + var(--button-default-bg-h), + var(--button-default-bg-s), + var(--button-default-bg-l) + ); --button-default-text: hsl(342 83% 58%); --menu-bg: hsl(355 73% 53%); @@ -333,16 +207,20 @@ --button-primary-bg-h: 47; --button-primary-bg-s: 93%; --button-primary-bg-l: 67%; - --button-primary-bg: hsl(var(--button-primary-bg-h), - var(--button-primary-bg-s), - var(--button-primary-bg-l)); + --button-primary-bg: hsl( + var(--button-primary-bg-h), + var(--button-primary-bg-s), + var(--button-primary-bg-l) + ); --button-primary-text: hsl(248 55% 8%); --button-default-bg-h: 47; --button-default-bg-s: 93%; --button-default-bg-l: 67%; - --button-default-bg: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - var(--button-default-bg-l)); + --button-default-bg: hsl( + var(--button-default-bg-h), + var(--button-default-bg-s), + var(--button-default-bg-l) + ); --button-default-text: var(--button-primary-text); --menu-bg: var(--card-bg); @@ -367,31 +245,26 @@ --extension-text: hsl(46 100% 90%); --wallet-shadow-color: #000000c7; - - img[alt~="Station"] { - // filter: invert(82%) sepia(61%) saturate(489%) hue-rotate(339deg) brightness(105%) contrast(95%); - height: 48px; - width: 48px; - border-radius: 100%; - padding: 5px; - border: 0.15rem solid white; - } } .whale { --button-primary-bg-h: 0; --button-primary-bg-s: 0%; --button-primary-bg-l: 0%; - --button-primary-bg: hsl(var(--button-primary-bg-h), - var(--button-primary-bg-s), - var(--button-primary-bg-l)); + --button-primary-bg: hsl( + var(--button-primary-bg-h), + var(--button-primary-bg-s), + var(--button-primary-bg-l) + ); --button-primary-text: hsl(0 0% 100%); --button-default-bg-h: 0; --button-default-bg-s: 0%; --button-default-bg-l: 83%; - --button-default-bg: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - var(--button-default-bg-l)); + --button-default-bg: hsl( + var(--button-default-bg-h), + var(--button-default-bg-s), + var(--button-default-bg-l) + ); --button-default-text: hsl(0 0% 0%); --menu-bg: hsl(0 0% 0%); @@ -420,31 +293,26 @@ --warning: hsl(356 100% 50%); --warning-light: hsl(356 100% 50% / 0.1); - - img[alt~="Station"] { - // filter: invert(100%) sepia(1%) saturate(0%) hue-rotate(208deg) brightness(106%) contrast(100%); - height: 48px; - width: 48px; - border-radius: 100%; - padding: 5px; - border: 0.15rem solid white; - } } .madness { --button-primary-bg-h: 116; --button-primary-bg-s: 100%; --button-primary-bg-l: 54%; - --button-primary-bg: hsl(var(--button-primary-bg-h), - var(--button-primary-bg-s), - var(--button-primary-bg-l)); + --button-primary-bg: hsl( + var(--button-primary-bg-h), + var(--button-primary-bg-s), + var(--button-primary-bg-l) + ); --button-primary-text: hsl(0 0% 8%); --button-default-bg-h: 260; --button-default-bg-s: 86%; --button-default-bg-l: 56%; - --button-default-bg: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - var(--button-default-bg-l)); + --button-default-bg: hsl( + var(--button-default-bg-h), + var(--button-default-bg-s), + var(--button-default-bg-l) + ); --button-default-text: hsl(116 100% 54%); --menu-bg: hsl(260 66% 37%); @@ -481,168 +349,4 @@ --danger-light: hsl(333 100% 55% / 0.1); --border-width: 2px; - - img[alt~="Station"] { - // filter: invert(80%) sepia(22%) saturate(6192%) hue-rotate(64deg) brightness(102%) contrast(116%); - height: 48px; - width: 48px; - border-radius: 100%; - padding: 5px; - border: 0.15rem solid white; - } -} - -/* special ocassions */ - - - - -.valentines { - --button-primary-bg-h: 355; - --button-primary-bg-s: 99%; - --button-primary-bg-l: 46%; - --button-primary-bg: hsl(var(--button-primary-bg-h), - var(--button-primary-bg-s), - var(--button-primary-bg-l)); - --button-primary-text: hsl(0 0% 95%); - --button-default-bg-h: 0; - --button-default-bg-s: 100%; - --button-default-bg-l: 0%; - --button-default-bg: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - var(--button-default-bg-l)); - --button-default-text: hsl(355, 98%, 43%); - - //--menu-bg: hsl(355 73% 53%); - --menu-bg: hsl(0, 93%, 47%); - --menu-border: hsl(0 0% 100% / 0.1); - --menu-text: hsl(0 0% 91%); - - --link: hsl(321 100% 72%); - //--text: hsl(342 92% 57%); - --text: hsl(340, 33%, 93%); - --text-muted: hsl(356 100% 76%); - //--chart: hsl(345 99% 46%); - --chart: hsl(355, 98%, 43%); - --bg: hsl(355, 98%, 43%); - --bg-muted: hsl(321 100% 97%); - //--card-bg: hsl(300 100% 98%); - --card-bg: hsl(0, 100%, 2%); - --card-bg-muted: var(--button-default-bg); - --card-border: hsl(0, 97%, 50%); - --input-bg: var(--card-bg); - --input-border: hsl(344 100% 92%); - - --wallet-shadow: 1px 0px 13px 2px rgb(63 63 63 / 22%); - - --extension-bg: hsl(340 100% 90%); - --extension-text: hsl(355, 98%, 43%); - - --wallet-shadow-color: rgb(63 63 63 / 22%); - - /* - #station { - background-image: url("ValentinesDay.jpg"); - background-size: 100%; - } - */ - -} - -.christmas { - --button-primary-bg-h: 355; - --button-primary-bg-s: 99%; - --button-primary-bg-l: 46%; - --button-primary-bg: hsl(var(--button-primary-bg-h), - var(--button-primary-bg-s), - var(--button-primary-bg-l)); - --button-primary-text: hsl(0 0% 95%); - --button-default-bg-h: 0; - --button-default-bg-s: 100%; - --button-default-bg-l: 0%; - --button-default-bg: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - var(--button-default-bg-l)); - --button-default-text: hsl(355, 98%, 43%); - - //--menu-bg: hsl(355 73% 53%); - --menu-bg: hsl(0, 93%, 47%); - --menu-border: hsl(0 0% 100% / 0.1); - --menu-text: hsl(0 0% 91%); - - --link: hsl(321 100% 72%); - //--text: hsl(342 92% 57%); - --text: hsl(340, 33%, 93%); - --text-muted: hsl(356 100% 76%); - //--chart: hsl(345 99% 46%); - --chart: hsl(355, 98%, 43%); - --bg: hsl(355, 98%, 43%); - --bg-muted: hsl(321 100% 97%); - //--card-bg: hsl(300 100% 98%); - --card-bg: hsl(0, 100%, 2%); - --card-bg-muted: var(--button-default-bg); - --card-border: hsl(0, 97%, 50%); - --input-bg: var(--card-bg); - --input-border: hsl(344 100% 92%); - - --wallet-shadow: 1px 0px 13px 2px rgb(63 63 63 / 22%); - - --extension-bg: hsl(340 100% 90%); - --extension-text: hsl(355, 98%, 43%); - - --wallet-shadow-color: rgb(63 63 63 / 22%); - - #station { - background-image: url("ValentinesDay.jpg"); - background-size: 100%; - } -} - -.halloween { - --button-primary-bg-h: 355; - --button-primary-bg-s: 99%; - --button-primary-bg-l: 46%; - --button-primary-bg: hsl(var(--button-primary-bg-h), - var(--button-primary-bg-s), - var(--button-primary-bg-l)); - --button-primary-text: hsl(0 0% 95%); - --button-default-bg-h: 0; - --button-default-bg-s: 100%; - --button-default-bg-l: 0%; - --button-default-bg: hsl(var(--button-default-bg-h), - var(--button-default-bg-s), - var(--button-default-bg-l)); - --button-default-text: hsl(355, 98%, 43%); - - //--menu-bg: hsl(355 73% 53%); - --menu-bg: hsl(0, 93%, 47%); - --menu-border: hsl(0 0% 100% / 0.1); - --menu-text: hsl(0 0% 91%); - - --link: hsl(321 100% 72%); - //--text: hsl(342 92% 57%); - --text: hsl(340, 33%, 93%); - --text-muted: hsl(356 100% 76%); - //--chart: hsl(345 99% 46%); - --chart: hsl(355, 98%, 43%); - --bg: hsl(355, 98%, 43%); - --bg-muted: hsl(321 100% 97%); - //--card-bg: hsl(300 100% 98%); - --card-bg: hsl(0, 100%, 2%); - --card-bg-muted: var(--button-default-bg); - --card-border: hsl(0, 97%, 50%); - --input-bg: var(--card-bg); - --input-border: hsl(344 100% 92%); - - --wallet-shadow: 1px 0px 13px 2px rgb(63 63 63 / 22%); - - --extension-bg: hsl(340 100% 90%); - --extension-text: hsl(355, 98%, 43%); - - --wallet-shadow-color: rgb(63 63 63 / 22%); - - #station { - background-image: url("ValentinesDay.jpg"); - background-size: 100%; - } } diff --git a/src/styles/themes/Blossom/Broadcasting.png b/src/styles/themes/Blossom/Broadcasting.png new file mode 100644 index 0000000000000000000000000000000000000000..689e0b6c77e60480b6b559ededb5d2ae7ed31fe9 GIT binary patch literal 111371 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 B56&k#WIeAa)mzRY;qM1hDa>&tC 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 G<9`6M + + + diff --git a/src/styles/themes/Blossom/preview.svg b/src/styles/themes/Blossom/preview.svg new file mode 100644 index 0000000..8ac3e61 --- /dev/null +++ b/src/styles/themes/Blossom/preview.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/styles/themes/themes.tsx b/src/styles/themes/themes.tsx index be66280..af1f2cf 100644 --- a/src/styles/themes/themes.tsx +++ b/src/styles/themes/themes.tsx @@ -4,33 +4,26 @@ import { toAmount } from "@terra.kitchen/utils" /* animation */ import AnimationLight from "./Light/Broadcasting.png" import AnimationDark from "./Dark/Broadcasting.png" -import AnimationBlossom from "./ToxicRose/Broadcasting.png" +import AnimationBlossom from "./Blossom/Broadcasting.png" import AnimationMoon from "./Moon/Broadcasting.png" import AnimationWhale from "./Whale/Broadcasting.png" import AnimationMadness from "./Madness/Broadcasting.png" -import AnimationValentines from "./Valentinesday/Broadcasting.png" -import AnimationLettuce from "./Lettuce/Broadcasting.png" /* favicon */ import FaviconLight from "./Light/favicon.svg" import FaviconDark from "./Dark/favicon.svg" -import FaviconBlossom from "./ToxicRose/favicon.svg" +import FaviconBlossom from "./Blossom/favicon.svg" import FaviconMoon from "./Moon/favicon.svg" import FaviconWhale from "./Whale/favicon.svg" import FaviconMadness from "./Madness/favicon.svg" -import FaviconValentines from "./Valentinesday/favicon.svg" -import FaviconLettuce from "./Lettuce/favicon.svg" /* preview */ import { ReactComponent as PreviewLight } from "./Light/preview.svg" import { ReactComponent as PreviewDark } from "./Dark/preview.svg" -import { ReactComponent as PreviewBlossom } from "./ToxicRose/preview.svg" +import { ReactComponent as PreviewBlossom } from "./Blossom/preview.svg" import { ReactComponent as PreviewMoon } from "./Moon/preview.svg" import { ReactComponent as PreviewWhale } from "./Whale/preview.svg" import { ReactComponent as PreviewMadness } from "./Madness/preview.svg" -import { ReactComponent as PreviewToxic } from "./Toxic/preview.svg" -import { ReactComponent as PreviewValentinesday } from "./Valentinesday/preview.svg" -import { ReactComponent as PreviewLettuce } from "./Lettuce/preview.svg" export interface Theme { name: string @@ -41,144 +34,49 @@ export interface Theme { donutColors?: string[] } -//let easterDay: number = 0; -let easterMonth: number = 0; - - - -/* -function Easter(Y: number) { - var C = Math.floor(Y / 100); - var N = Y - 19 * Math.floor(Y / 19); - var K = Math.floor((C - 17) / 25); - var I = C - Math.floor(C / 4) - Math.floor((C - K) / 3) + 19 * N + 15; - I = I - 30 * Math.floor((I / 30)); - I = I - Math.floor(I / 28) * (1 - Math.floor(I / 28) * Math.floor(29 / (I + 1)) * Math.floor((21 - N) / 11)); - var J = Y + Math.floor(Y / 4) + I + 2 - C + Math.floor(C / 4); - J = J - 7 * Math.floor(J / 7); - var L = I - J; - var M = 3 + Math.floor((L + 40) / 44); - var D = L + 28 - 31 * Math.floor(M / 4); - easterDay = D; - easterMonth = M; - return padout(M) + '.' + padout(D); - -} - -function padout(number: number) { return (number < 10) ? '0' + number : number; } -*/ - - - -const getThemes = () => { - - let currentTheme = [ - { - name: "toxic", - unlock: toAmount("0"), - animation: AnimationMadness, - favicon: FaviconMadness, - preview: , - }, - - { - name: "light", - unlock: toAmount("0"), - animation: AnimationLight, - favicon: FaviconLight, - preview: , - }, - { - name: "dark", - unlock: toAmount("0"), - animation: AnimationDark, - favicon: FaviconDark, - preview: , - }, - { - name: "toxicRose", - unlock: toAmount("0"), - animation: AnimationBlossom, - favicon: FaviconBlossom, - preview: , - }, - { - name: "moon", - unlock: toAmount("0"), - animation: AnimationMoon, - favicon: FaviconMoon, - preview: , - }, - { - name: "whale", - unlock: toAmount("0"), - animation: AnimationWhale, - favicon: FaviconWhale, - preview: , - }, - { - name: "madness", - unlock: toAmount("0"), - animation: AnimationMadness, - favicon: FaviconMadness, - preview: , - }, - { - name: "lettuce", - unlock: toAmount("0"), - animation: AnimationLettuce, - favicon: FaviconLettuce, - preview: , - }, - ] - - - const today = new Date(); - const dd = String(today.getDate()).padStart(2, '0'); - const mm = String(today.getMonth() + 1).padStart(2, '0'); - const day: number = +dd; - const month: number = +mm; - //const curentYear = today.getFullYear(); - - //console.log("Easter 2023"+(Easter(curentYear))) - // console.log("easterDay:"+easterDay); - //console.log("easterMonth:"+easterMonth); - - const easterPlusOne = 0; - const weekBeforeEaster = 0; - if (month === 2 && day >= 7 && day < 15) { - currentTheme.unshift({ - name: "valentines", - unlock: toAmount("0"), - animation: AnimationValentines, - favicon: FaviconValentines, - preview: , - - }) - } else if (month === easterMonth && day >= weekBeforeEaster && day < easterPlusOne) { - // easter theme - } else if (month === 10 && day >= 24 && day <= 31) { - // halloween theme - } - else if (month === 12 && day >= 18 && day <= 25) { - // christmas theme - } - return currentTheme -} - -export const themes: Theme[] = getThemes() - +export const themes: Theme[] = [ + { + name: "light", + unlock: toAmount("0"), + animation: AnimationLight, + favicon: FaviconLight, + preview: , + }, + { + name: "dark", + unlock: toAmount("0"), + animation: AnimationDark, + favicon: FaviconDark, + preview: , + }, + { + name: "blossom", + unlock: toAmount("1"), + animation: AnimationBlossom, + favicon: FaviconBlossom, + preview: , + }, + { + name: "moon", + unlock: toAmount("10"), + animation: AnimationMoon, + favicon: FaviconMoon, + preview: , + }, + { + name: "whale", + unlock: toAmount("100"), + animation: AnimationWhale, + favicon: FaviconWhale, + preview: , + }, + { + name: "madness", + unlock: toAmount("1000"), + animation: AnimationMadness, + favicon: FaviconMadness, + preview: , + }, +] export default themes - - -/* - - - Top heading - Left Navigation Panel - - - - -*/ \ No newline at end of file diff --git a/src/txs/AddressBook/AddressBookList.tsx b/src/txs/AddressBook/AddressBookList.tsx index 6746dea..03bbc09 100644 --- a/src/txs/AddressBook/AddressBookList.tsx +++ b/src/txs/AddressBook/AddressBookList.tsx @@ -44,8 +44,8 @@ const AddressBookList = ({ onClick }: Props) => { > {networks[chain].name} {networks[chain].name} diff --git a/src/txs/Tx.tsx b/src/txs/Tx.tsx index cf17eac..4fae319 100644 --- a/src/txs/Tx.tsx +++ b/src/txs/Tx.tsx @@ -53,7 +53,7 @@ interface Props { coins?: CoinInput[] balance?: Amount gasAdjustment?: number - isTaxable: Boolean + /* tx simulation */ estimationTxValues?: TxValues createTx: (values: TxValues) => CreateTxOptions | undefined @@ -80,12 +80,9 @@ interface RenderProps { submit: { fn: (values: TxValues) => Promise; button: ReactNode } } - - - function Tx(props: Props) { - const { token, decimals, amount, balance, chain, } = props - const { estimationTxValues, createTx, gasAdjustment: txGasAdjustment, isTaxable } = props + const { token, decimals, amount, balance, chain } = props + const { estimationTxValues, createTx, gasAdjustment: txGasAdjustment,isTaxable } = props const { children, onChangeMax } = props const { onPost, redirectAfterTx, queryKeys, onSuccess } = props @@ -104,6 +101,8 @@ function Tx(props: Props) { const setLatestTx = useSetRecoilState(latestTxState) const isBroadcasting = useRecoilValue(isBroadcastingState) const readNativeDenom = useNativeDenoms() + + /* taxes */ const isClassic = networks[chain]?.isClassic const shouldTax = isClassic && getShouldTax(token, isClassic) const { data: taxRate = "0", ...taxRateState } = useTaxRate(!shouldTax) @@ -111,10 +110,10 @@ function Tx(props: Props) { const taxState = combineState(taxRateState, taxCapState) const taxes = isClassic ? calcTaxes( - props.coins ?? ([{ input: 0, denom: token }] as CoinInput[]), - { taxRate, taxCap }, - !!isClassic - ) + props.coins ?? ([{ input: 0, denom: token }] as CoinInput[]), + { taxRate, taxCap }, + !!isClassic + ) : undefined /* simulation: estimate gas */ @@ -184,8 +183,8 @@ function Tx(props: Props) { const max = !gasFee.amount ? undefined : isDenom(token) - ? getNativeMax() - : balance + ? getNativeMax() + : balance /* (effect): Call the onChangeMax function whenever the max changes */ useEffect(() => { @@ -197,6 +196,7 @@ function Tx(props: Props) { token && amount && shouldTax && isTaxable ? calcMinimumTaxAmount(amount, { rate: taxRate, cap: taxCap }) : undefined + /* (effect): Log error on console */ const failed = getErrorMessage(taxState.error ?? estimatedGasState.error) useEffect(() => { @@ -218,14 +218,14 @@ function Tx(props: Props) { const disabled = estimatedGasState.isLoading ? t("Estimating fee...") : taxState.isLoading - ? t("Loading tax data...") - : taxState.error - ? t("Failed to load tax data") - : estimatedGasState.error - ? t("Fee estimation failed") - : isBroadcasting - ? t("Broadcasting a tx...") - : props.disabled || "" + ? t("Loading tax data...") + : taxState.error + ? t("Failed to load tax data") + : estimatedGasState.error + ? t("Fee estimation failed") + : isBroadcasting + ? t("Broadcasting a tx...") + : props.disabled || "" const [submitting, setSubmitting] = useState(false) const [error, setError] = useState() @@ -254,28 +254,26 @@ function Tx(props: Props) { const feeCoins = taxCoins ? gasCoins.add(taxCoins) : gasCoins const fee = new Fee(estimatedGas, feeCoins) + const latestTxBase = { + queryKeys, + redirectAfterTx, + chainID: chain, + onSuccess: () => { + if (onSuccess) onSuccess() + setPassword("") // required for desktop form clear + }, + } + if (isWallet.multisig(wallet)) { // TODO: broadcast only to terra if wallet is multisig const unsignedTx = await auth.create({ ...tx, fee }) navigate(toPostMultisigTx(unsignedTx)) } else if (wallet) { - const result = await auth.post({ ...tx, fee }, password) - setLatestTx({ - txhash: result.txhash, - queryKeys, - redirectAfterTx, - chainID: chain, - onSuccess, - }) + const { txhash } = await auth.post({ ...tx, fee }, password) + setLatestTx({ txhash, ...latestTxBase }) } else { const { result } = await post({ ...tx, fee }) - setLatestTx({ - txhash: result.txhash, - queryKeys, - redirectAfterTx, - chainID: chain, - onSuccess, - }) + setLatestTx({ txhash: result.txhash, ...latestTxBase }) } onPost?.() @@ -393,10 +391,10 @@ function Tx(props: Props) { connectedWallet?.connectType === ConnectType.READONLY ? t("Wallet is connected as read-only mode") : !availableGasDenoms.length - ? t("Insufficient balance to pay transaction fee") - : isWalletEmpty - ? t("Coins required to post transactions") - : "" + ? t("Insufficient balance to pay transaction fee") + : isWalletEmpty + ? t("Coins required to post transactions") + : "" const submitButton = ( <> @@ -443,23 +441,23 @@ function Tx(props: Props) { const modal = !error ? undefined : { - title: - error instanceof UserDenied || + title: + error instanceof UserDenied || error?.toString().includes("UserDenied") - ? t("Transaction was denied by user") - : error instanceof CreateTxFailed + ? t("Transaction was denied by user") + : error instanceof CreateTxFailed ? t("Failed to create tx") : error instanceof TxFailed - ? t("Tx failed") - : t("Error"), - children: - error instanceof UserDenied || + ? t("Tx failed") + : t("Error"), + children: + error instanceof UserDenied || error?.toString().includes("UserDenied") ? null : ( -
-            {error?.message}
-          
- ), - } +
+              {error?.message}
+            
+ ), + } return ( <> diff --git a/src/txs/gov/SubmitProposalForm.tsx b/src/txs/gov/SubmitProposalForm.tsx index 9835ba4..940fa1d 100644 --- a/src/txs/gov/SubmitProposalForm.tsx +++ b/src/txs/gov/SubmitProposalForm.tsx @@ -397,7 +397,7 @@ const SubmitProposalForm = ({ chain }: { chain: string }) => { {({ max, fee, submit }) => ( - {networks[chain].chainID === "phoenix-1" && ( + {networks[chain]?.prefix === "terra" && ( Upload proposal only after forum discussion on{" "} @@ -405,14 +405,6 @@ const SubmitProposalForm = ({ chain }: { chain: string }) => { )} - {networks[chain].chainID === "columbus-5" && ( - - Upload proposal only after forum discussion on{" "} - - classic.agora.terra.money - - - )} {t( "Proposal deposits will not be refunded if the proposal is vetoed, fails to meet quorum, or does not meet the minimum deposit" diff --git a/src/txs/gov/VoteForm.tsx b/src/txs/gov/VoteForm.tsx index b1383cd..868ed08 100644 --- a/src/txs/gov/VoteForm.tsx +++ b/src/txs/gov/VoteForm.tsx @@ -56,7 +56,6 @@ const VoteForm = () => { estimationTxValues, createTx, chain, - isTaxable: false } return ( diff --git a/src/txs/stake/WithdrawRewardsForm.tsx b/src/txs/stake/WithdrawRewardsForm.tsx index b06d108..1f2b9c0 100644 --- a/src/txs/stake/WithdrawRewardsForm.tsx +++ b/src/txs/stake/WithdrawRewardsForm.tsx @@ -104,7 +104,7 @@ const WithdrawRewardsForm = ({ rewards, validators, chain }: Props) => { }) /* form */ - const { handleSubmit } = useForm({ mode: "onChange" }) + const { handleSubmit, reset } = useForm({ mode: "onChange" }) /* tx */ const createTx = useCallback(() => { @@ -126,7 +126,8 @@ const WithdrawRewardsForm = ({ rewards, validators, chain }: Props) => { createTx, querykeys: [queryKey.distribution.rewards], chain, - isTaxable: false + isTaxable: false, + onSuccess: () => reset(), } return ( diff --git a/src/txs/swap/SwapTx.tsx b/src/txs/swap/SwapTx.tsx index 4e57035..0fc23df 100644 --- a/src/txs/swap/SwapTx.tsx +++ b/src/txs/swap/SwapTx.tsx @@ -36,6 +36,7 @@ const SwapTx = () => { ) } + return ( }> diff --git a/src/utils/localStorage.ts b/src/utils/localStorage.ts index 99315b6..25e99e9 100644 --- a/src/utils/localStorage.ts +++ b/src/utils/localStorage.ts @@ -14,21 +14,20 @@ export enum SettingKey { ClassicGasAdjustment = "ClassicGasAdjustment", AddressBook = "AddressBook", // Send HideNonWhitelistTokens = "HideNonWhiteListTokens", - Network = "Network", + Chain = "Chain", CustomLCD = "CustomLCD", HideLowBalTokens = "HideLowBalTokens", CustomTokens = "CustomTokens", // Wallet MinimumValue = "MinimumValue", // Wallet (UST value to show on the list) WithdrawAs = "WithdrawAs", // Rewards (Preferred denom to withdraw rewards) + EnabledNetworks = "EnabledNetworks", + NetworkCacheTime = "NetworkCacheTime", } -/* + const isSystemDarkMode = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches -*/ - - -export const DefaultTheme = themes[0] +export const DefaultTheme = themes[Number(isSystemDarkMode)] export const DefaultCustomTokensItem = { cw20: [], @@ -54,10 +53,12 @@ export const DefaultSettings = { [SettingKey.AddressBook]: [] as AddressBook[], [SettingKey.CustomTokens]: DefaultCustomTokens as CustomTokens, [SettingKey.MinimumValue]: 0, + [SettingKey.NetworkCacheTime]: 0, [SettingKey.HideNonWhitelistTokens]: true, [SettingKey.HideLowBalTokens]: true, [SettingKey.WithdrawAs]: "", - [SettingKey.Network]: "", + [SettingKey.Chain]: "", + [SettingKey.EnabledNetworks]: { time: 0, networks: [] as string[] }, [SettingKey.CustomLCD]: {}, } @@ -88,9 +89,9 @@ export const hideLowBalTokenState = atom({ default: !!getLocalSetting(SettingKey.HideLowBalTokens), }) -export const savedNetworkState = atom({ +export const savedChainState = atom({ key: "savedNetwork", - default: getLocalSetting(SettingKey.Network) as string | undefined, + default: getLocalSetting(SettingKey.Chain) as string | undefined, }) export const customLCDState = atom({ @@ -100,16 +101,16 @@ export const customLCDState = atom({ ), }) -export const useSavedNetwork = () => { - const [savedNetwork, setSavedNetwork] = useRecoilState(savedNetworkState) - const changeSavedNetwork = useCallback( - (newNetwork: string | undefined) => { - setLocalSetting(SettingKey.Network, newNetwork) - setSavedNetwork(newNetwork) +export const useSavedChain = () => { + const [savedChain, setSavedChain] = useRecoilState(savedChainState) + const changeSavedChain = useCallback( + (newChain: string | undefined) => { + setLocalSetting(SettingKey.Chain, newChain) + setSavedChain(newChain) }, - [setSavedNetwork] + [setSavedChain] ) - return { savedNetwork, changeSavedNetwork } + return { savedChain, changeSavedChain } } export const useCustomLCDs = () => { diff --git a/tsconfig.json b/tsconfig.json index e444cfb..5452a6d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,6 @@ "compilerOptions": { "target": "es5", "lib": ["dom", "dom.iterable", "esnext"], - "rootDir":".", "allowJs": true, "skipLibCheck": true, "esModuleInterop": true,