From 8d639d2f802f7af9fbe4533da02e14d37e764e04 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 20 Dec 2023 15:40:49 -0700 Subject: [PATCH 01/40] update deploy workflow --- .github/workflows/testuideploy.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testuideploy.yaml b/.github/workflows/testuideploy.yaml index a5b305d62..3ef44a048 100644 --- a/.github/workflows/testuideploy.yaml +++ b/.github/workflows/testuideploy.yaml @@ -8,9 +8,12 @@ on: workflow_dispatch: permissions: - contents: read + contents: write pages: write id-token: write + actions: write + deployments: write + pull-requests: write concurrency: group: "pages" From 76cd03ea1cd1036cf1e7362cf8f2159961931b19 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 20 Dec 2023 15:45:29 -0700 Subject: [PATCH 02/40] update deploy workflow conditions --- .github/workflows/testuideploy.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/testuideploy.yaml b/.github/workflows/testuideploy.yaml index 3ef44a048..3e499ab9a 100644 --- a/.github/workflows/testuideploy.yaml +++ b/.github/workflows/testuideploy.yaml @@ -4,6 +4,9 @@ on: push: paths: - web-ui/** + pull_request: + paths: + - web-ui/** workflow_dispatch: From d00d7b25e76e593e85960b6adf76d071314027f7 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 20 Dec 2023 15:49:51 -0700 Subject: [PATCH 03/40] update homepage url to match pages deployment --- web-ui/next.config.js | 4 ++-- web-ui/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web-ui/next.config.js b/web-ui/next.config.js index 67dede20d..36d476a96 100644 --- a/web-ui/next.config.js +++ b/web-ui/next.config.js @@ -3,8 +3,8 @@ module.exports = { reactStrictMode: true, swcMinify: true, - basePath: '/quicksilver-app-v2', - assetPrefix: '/quicksilver-app-v2', + basePath: '/quicksilver', + assetPrefix: '/quicksilver', typescript: { // !! WARN !! // Dangerously allow production builds to successfully complete even if diff --git a/web-ui/package.json b/web-ui/package.json index 0dc16f181..ab33a6fd2 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -2,7 +2,7 @@ "name": "bun-qs", "version": "0.15.3", "private": true, - "homepage": "https://quicksilver-zone.github.io/quicksilver-app-v2/", + "homepage": "https://quicksilver-zone.github.io/quicksilver/", "scripts": { "build": "next build", "dev": "next dev", From 940b6d205b40c689746d7366682b070995810e17 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 20 Dec 2023 15:59:26 -0700 Subject: [PATCH 04/40] update deploy workflow to export proper directory --- .github/workflows/testuideploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testuideploy.yaml b/.github/workflows/testuideploy.yaml index 3e499ab9a..66575d808 100644 --- a/.github/workflows/testuideploy.yaml +++ b/.github/workflows/testuideploy.yaml @@ -53,4 +53,4 @@ jobs: uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./out + publish_dir: ./web-ui/out From e5e60c4706351c797acdee298ee8f2c6a5400951 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 20 Dec 2023 16:20:53 -0700 Subject: [PATCH 05/40] update img urls --- web-ui/components/react/sideHeader.tsx | 14 +++++++------- web-ui/pages/assets.tsx | 2 +- web-ui/pages/defi.tsx | 2 +- web-ui/pages/index.tsx | 2 +- web-ui/pages/staking.tsx | 4 ++-- web-ui/state/chains/prod.ts | 20 ++++++++++---------- web-ui/test/Staking.test.tsx | 20 ++++++++++---------- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/web-ui/components/react/sideHeader.tsx b/web-ui/components/react/sideHeader.tsx index 6fa2a617b..91376e6b8 100644 --- a/web-ui/components/react/sideHeader.tsx +++ b/web-ui/components/react/sideHeader.tsx @@ -33,7 +33,7 @@ export const SideHeader = () => { useEffect(() => { const handleRouteChange = (url: string) => { - const path = url.split('/quicksilver-app-v2/')[1]; + const path = url.split('/quicksilver/')[1]; setSelectedPage(path); }; @@ -93,7 +93,7 @@ export const SideHeader = () => { h="75px" w="75px" borderRadius="full" - src="/quicksilver-app-v2/img/networks/quicksilver.svg" + src="/quicksilver/img/networks/quicksilver.svg" onClick={handleLogoClick} cursor="pointer" _hover={{ @@ -116,7 +116,7 @@ export const SideHeader = () => { {['Staking', 'Governance', 'Defi', 'Assets'].map((item) => ( { }} alt="Staking" h="55px" - src="/quicksilver-app-v2/img/test.png" + src="/quicksilver/img/test.png" /> @@ -235,7 +235,7 @@ export const SideHeader = () => { alt="Governance" h="60px" w={'60px'} - src="/quicksilver-app-v2/img/test2.png" + src="/quicksilver/img/test2.png" /> @@ -262,7 +262,7 @@ export const SideHeader = () => { }} alt="Assets" h="55px" - src="/quicksilver-app-v2/img/test3.png" + src="/quicksilver/img/test3.png" /> @@ -289,7 +289,7 @@ export const SideHeader = () => { }} alt="DeFi" h="55px" - src="/quicksilver-app-v2/img/test4.png" + src="/quicksilver/img/test4.png" /> diff --git a/web-ui/pages/assets.tsx b/web-ui/pages/assets.tsx index cff5f41cc..10a1ae98c 100644 --- a/web-ui/pages/assets.tsx +++ b/web-ui/pages/assets.tsx @@ -123,7 +123,7 @@ function Home() { Assets - + {/* Quick box */} diff --git a/web-ui/pages/defi.tsx b/web-ui/pages/defi.tsx index fb5e4a8a0..54312fd99 100644 --- a/web-ui/pages/defi.tsx +++ b/web-ui/pages/defi.tsx @@ -8,7 +8,7 @@ export default function Home() { DeFi - + diff --git a/web-ui/pages/index.tsx b/web-ui/pages/index.tsx index a47cdc3f4..9c1c5c339 100644 --- a/web-ui/pages/index.tsx +++ b/web-ui/pages/index.tsx @@ -12,7 +12,7 @@ export default function Home() { Quicksilver - + diff --git a/web-ui/pages/staking.tsx b/web-ui/pages/staking.tsx index d57734602..5727b89a6 100644 --- a/web-ui/pages/staking.tsx +++ b/web-ui/pages/staking.tsx @@ -59,13 +59,13 @@ export default function Staking() { Staking - + {/* {''} Date: Wed, 20 Dec 2023 21:30:01 -0700 Subject: [PATCH 06/40] complete portfolio section(queries) --- web-ui/components/Assets/assetsGrid.tsx | 86 ++++---------------- web-ui/components/Assets/portfolio.tsx | 32 +++++--- web-ui/components/Assets/quickbox.tsx | 20 ++++- web-ui/pages/assets.tsx | 104 ++++++++++++++++++------ 4 files changed, 138 insertions(+), 104 deletions(-) diff --git a/web-ui/components/Assets/assetsGrid.tsx b/web-ui/components/Assets/assetsGrid.tsx index 2df225c59..e1aac53ca 100644 --- a/web-ui/components/Assets/assetsGrid.tsx +++ b/web-ui/components/Assets/assetsGrid.tsx @@ -1,13 +1,23 @@ +import { shiftDigits } from '@/utils'; import { Box, SimpleGrid, VStack, Text, Button, Divider, useColorModeValue, HStack, Flex, Grid, GridItem } from '@chakra-ui/react'; import React from 'react'; interface AssetCardProps { assetName: string; balance: string; - apy: string; + apy: number; nativeAssetName: string; } +interface AssetGridProps { + assets: Array<{ + name: string; + balance: string; + apy: number; + native: string; + }>; +} + const AssetCard: React.FC = ({ assetName, balance, apy, nativeAssetName }) => { return ( @@ -21,11 +31,11 @@ const AssetCard: React.FC = ({ assetName, balance, apy, nativeAs APY: - {apy} + {shiftDigits(apy.toFixed(2), 2)}% - + @@ -50,7 +60,7 @@ const AssetCard: React.FC = ({ assetName, balance, apy, nativeAs - + - - - - {nativeAssetName} - - - - - - - - - - - - ON QUICKSILVER: - - - - - {balance} - - - - - - - ); }; -const AssetsGrid = () => { - const assets = [ - { name: 'qATOM', balance: '0.123', apy: '12.34%', native: 'ATOM' }, - { name: 'qREGEN', balance: '0.123', apy: '12.34%', native: 'REGEN' }, - { name: 'qOSMO', balance: '0.123', apy: '12.34%', native: 'OSMO' }, - { name: 'qSTARS', balance: '0.123', apy: '12.34%', native: 'STARS' }, - { name: 'qSOMM', balance: '0.123', apy: '12.34%', native: 'SOMM' }, - ]; - +const AssetsGrid: React.FC = ({ assets }) => { return ( <> - Assets (qAssets + Native Balance) + qAssets diff --git a/web-ui/components/Assets/portfolio.tsx b/web-ui/components/Assets/portfolio.tsx index c3f85a62a..c99a1ee6e 100644 --- a/web-ui/components/Assets/portfolio.tsx +++ b/web-ui/components/Assets/portfolio.tsx @@ -1,14 +1,22 @@ -import { Box, Flex, Text, Icon, VStack, HStack, Heading, Spinner } from '@chakra-ui/react'; +import { shiftDigits } from '@/utils'; +import { Box, Flex, Text, Icon, VStack, HStack, Heading, Spinner, Tooltip } from '@chakra-ui/react'; -import { PortfolioItemInterface } from '@/pages/assets'; +interface PortfolioItemInterface { + title: string; + percentage: string; + progressBarColor: string; + amount: string; + qTokenPrice: number; +} interface MyPortfolioProps { portfolioItems: PortfolioItemInterface[]; isWalletConnected: boolean; totalValue: number; + averageApy: number; + totalYearlyYield: number; } - -const MyPortfolio: React.FC = ({ portfolioItems, isWalletConnected, totalValue }) => { +const MyPortfolio: React.FC = ({ portfolioItems, isWalletConnected, totalValue, averageApy, totalYearlyYield }) => { if (!isWalletConnected) { return ( = ({ portfolioItems, isWalletConne AVG APY: - 6.56% + {shiftDigits(averageApy.toFixed(2), 2)}% @@ -87,7 +95,7 @@ const MyPortfolio: React.FC = ({ portfolioItems, isWalletConne Yearly Yield:{' '} - $3,917 + ${totalYearlyYield.toFixed(2)} @@ -127,7 +135,9 @@ interface PortfolioItemProps { const PortfolioItem: React.FC = ({ title, percentage, progressBarColor, amount, qTokenPrice }) => ( - {Number(amount).toFixed(2).toString()} + + {Number(amount).toFixed(2).toString()} + {title} @@ -137,9 +147,11 @@ const PortfolioItem: React.FC = ({ title, percentage, progre - - {`${percentage * 100}%`} - + + + {`${percentage * 100}%`} + + ); diff --git a/web-ui/components/Assets/quickbox.tsx b/web-ui/components/Assets/quickbox.tsx index 9c619480d..2b8bf9a80 100644 --- a/web-ui/components/Assets/quickbox.tsx +++ b/web-ui/components/Assets/quickbox.tsx @@ -1,4 +1,4 @@ -import { Box, Flex, Text, Button, VStack, useColorModeValue, HStack, SkeletonCircle } from '@chakra-ui/react'; +import { Box, Flex, Text, Button, VStack, useColorModeValue, HStack, SkeletonCircle, Spinner } from '@chakra-ui/react'; import { useChain } from '@cosmos-kit/react'; import { defaultChainName } from '@/config'; @@ -25,6 +25,24 @@ const QuickBox = () => { ); } + if (!balance) { + return ( + + + + ); + } + return ( diff --git a/web-ui/pages/assets.tsx b/web-ui/pages/assets.tsx index 10a1ae98c..b2199cc37 100644 --- a/web-ui/pages/assets.tsx +++ b/web-ui/pages/assets.tsx @@ -10,8 +10,8 @@ import StakingIntent from '@/components/Assets/intents'; import MyPortfolio from '@/components/Assets/portfolio'; import QuickBox from '@/components/Assets/quickbox'; import UnbondingAssetsTable from '@/components/Assets/unbondingTable'; -import { useIntentQuery, useQBalanceQuery, useTokenPriceQuery, useZoneQuery } from '@/hooks/useQueries'; -import { shiftDigits } from '@/utils'; +import { useAPYQuery, useBalanceQuery, useIntentQuery, useQBalanceQuery, useTokenPriceQuery, useZoneQuery } from '@/hooks/useQueries'; +import { shiftDigits, toNumber } from '@/utils'; export interface PortfolioItemInterface { title: string; @@ -29,32 +29,56 @@ type BalanceRates = { [key: string]: string; }; +type APYRates = { + [key: string]: Number; +}; + function Home() { - const { address } = useChain('quicksilver'); const { address: qAddress, isWalletConnected } = useChain('quicksilver'); - - // Define a function to fetch token price data + const { address } = useChain('quicksilver'); + // Function to fetch token price from an API const fetchTokenPrice = async (token: any) => { try { const response = await axios.get(`https://api-osmosis.imperator.co/tokens/v2/price/${token}`); - return response.data.price; // Adjust this according to your API response structure + return response.data.price; } catch (error) { console.error('Error fetching token price:', error); return null; } }; + + // Retrieve balance for each token const { balance: qAtom, isLoading: qAtomIsLoading, isError: qAtomIsError } = useQBalanceQuery('quicksilver', qAddress ?? '', 'atom'); const { balance: qOsmo, isLoading: qOsmoIsLoading, isError: qOsmoIsError } = useQBalanceQuery('quicksilver', qAddress ?? '', 'osmo'); const { balance: qStars, isLoading: qStarsIsLoading, isError: qStarsIsError } = useQBalanceQuery('quicksilver', qAddress ?? '', 'stars'); const { balance: qRegen, isLoading: qRegenIsLoading, isError: qRegenIsError } = useQBalanceQuery('quicksilver', qAddress ?? '', 'regen'); const { balance: qSomm, isLoading: qSommIsLoading, isError: qSommIsError } = useQBalanceQuery('quicksilver', qAddress ?? '', 'somm'); + // Retrieve zone data for each token const { data: CosmosZone, isLoading: isCosmosZoneLoading, isError: isCosmosZoneError } = useZoneQuery('cosmoshub-4'); const { data: OsmoZone, isLoading: isOsmoZoneLoading, isError: isOsmoZoneError } = useZoneQuery('osmosis-1'); const { data: StarZone, isLoading: isStarZoneLoading, isError: isStarZoneError } = useZoneQuery('stargaze-1'); const { data: RegenZone, isLoading: isRegenZoneLoading, isError: isRegenZoneError } = useZoneQuery('regen-1'); const { data: SommZone, isLoading: isSommZoneLoading, isError: isSommZoneError } = useZoneQuery('sommelier-3'); - + // Retrieve APY data for each token + const { APY: cosmosAPY, isLoading: isCosmosAPYLoading, isError: isCosmosAPYError } = useAPYQuery('cosmoshub-4'); + const { APY: osmoAPY, isLoading: isOsmoAPYLoading, isError: isOsmoAPYError } = useAPYQuery('osmosis-1'); + const { APY: starsAPY, isLoading: isStarsAPYLoading, isError: isStarsAPYError } = useAPYQuery('stargaze-1'); + const { APY: regenAPY, isLoading: isRegenAPYLoading, isError: isRegenAPYError } = useAPYQuery('regen-1'); + const { APY: sommAPY, isLoading: isSommAPYLoading, isError: isSommAPYError } = useAPYQuery('sommelier-3'); + + // useMemo hook to cache APY data + const qAPYRates: APYRates = useMemo( + () => ({ + qAtom: cosmosAPY, + qOsmo: osmoAPY, + qStars: starsAPY, + qRegen: regenAPY, + qSomm: sommAPY, + }), + [cosmosAPY, osmoAPY, starsAPY, regenAPY, sommAPY], + ); + // useMemo hook to cache qBalance data const qBalances: BalanceRates = useMemo( () => ({ qAtom: shiftDigits(qAtom?.balance.amount ?? '', -6), @@ -66,9 +90,7 @@ function Home() { [qAtom, qOsmo, qStars, qRegen, qSomm], ); - const [portfolioItems, setPortfolioItems] = useState([]); - const [totalPortfolioValue, setTotalPortfolioValue] = useState(0); - + // useMemo hook to cache redemption rate data const redemptionRates: NumericRedemptionRates = useMemo( () => ({ atom: CosmosZone?.redemptionRate ? parseFloat(CosmosZone.redemptionRate) : 1, @@ -80,19 +102,32 @@ function Home() { [CosmosZone, OsmoZone, StarZone, RegenZone, SommZone], ); + // State hooks for portfolio items, total portfolio value, and other metrics + const [portfolioItems, setPortfolioItems] = useState([]); + const [totalPortfolioValue, setTotalPortfolioValue] = useState(0); + const [averageApy, setAverageAPY] = useState(0); + const [totalYearlyYield, setTotalYearlyYield] = useState(0); + // useEffect hook to compute portfolio metrics when dependencies change useEffect(() => { const updatePortfolioItems = async () => { let totalValue = 0; + let totalYearlyYield = 0; + let weightedAPY = 0; let updatedItems = []; - + // Loop through each token to compute value, APY, and yield for (const token of Object.keys(qBalances)) { const baseToken = token.replace('q', '').toLowerCase(); const price = await fetchTokenPrice(baseToken); const qTokenPrice = price * Number(redemptionRates[baseToken]); const qTokenBalance = qBalances[token]; - const itemValue = Number(qTokenBalance) * qTokenPrice; + + const qTokenAPY = qAPYRates[token] || 0; + const yearlyYield = itemValue * Number(qTokenAPY); + // Accumulate total values and compute weighted APY totalValue += itemValue; + totalYearlyYield += yearlyYield; + weightedAPY += (itemValue / totalValue) * Number(qTokenAPY); updatedItems.push({ title: token.toUpperCase(), @@ -102,19 +137,35 @@ function Home() { qTokenPrice: qTokenPrice || 0, }); } - - // Now, calculate the percentage of each item - updatedItems = updatedItems.map((item) => ({ - ...item, - percentage: ((((Number(item.amount) * item.qTokenPrice) / totalValue) * 100) / 100).toFixed(2), - })); - + // Recalculate percentages for each item based on total value + updatedItems = updatedItems.map((item) => { + const itemValue = Number(item.amount) * item.qTokenPrice; + return { + ...item, + percentage: (((itemValue / totalValue) * 100) / 100).toFixed(2), + }; + }); + // Update state with calculated data setPortfolioItems(updatedItems); setTotalPortfolioValue(totalValue); + setAverageAPY(weightedAPY); + setTotalYearlyYield(totalYearlyYield); }; updatePortfolioItems(); - }, [qBalances, CosmosZone, OsmoZone, StarZone, RegenZone, SommZone, redemptionRates]); + }, [qBalances, CosmosZone, OsmoZone, StarZone, RegenZone, SommZone, redemptionRates, qAPYRates]); + + // useMemo hook to prepare assets data for the AssetsGrid component + const assetsData = useMemo(() => { + return Object.keys(qBalances).map((token) => { + return { + name: token.toUpperCase().replace('Q', 'q'), + balance: toNumber(qBalances[token], 2).toString(), + apy: parseFloat(qAPYRates[token]?.toFixed(2)) || 0, + native: token.replace('q', '').toUpperCase(), + }; + }); + }, [qBalances, qAPYRates]); return ( <> @@ -152,7 +203,13 @@ function Home() { w="lg" h="sm" > - + {/* Intent box */} {/* Assets Grid */} - + {/* Unbonding Table */} @@ -182,10 +239,11 @@ function Home() { ); } - +// disable ssr in order to use useQuery hooks const DynamicAssetsPage = dynamic(() => Promise.resolve(Home), { ssr: false, }); + const AssetsWrapper = () => { return ; }; From f896775711ba4fb33e56a433e76f4682e2188d82 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Thu, 21 Dec 2023 15:11:08 -0700 Subject: [PATCH 07/40] add prod and dev env's for queries --- web-ui/.env | 2 +- web-ui/.env.development | 24 +++++ web-ui/.env.production | 13 +++ web-ui/bun.lockb | Bin 419315 -> 420225 bytes ...qckDepositModa.tsx => qckDepositModal.tsx} | 102 +++++++++++++----- .../Assets/modals/qckWithdrawModal.tsx | 24 ++--- web-ui/components/Assets/quickbox.tsx | 2 +- web-ui/hooks/useGrpcQueryClient.ts | 20 ++-- web-ui/hooks/useQueries.ts | 35 ++++++ web-ui/hooks/useRpcQueryClient.ts | 23 ++-- web-ui/hooks/useToaster.tsx | 15 +-- web-ui/package.json | 1 + web-ui/pages/_app.tsx | 5 +- web-ui/pages/assets.tsx | 2 +- web-ui/services/zone.ts | 2 +- web-ui/tx/ibcTransferTx.tsx | 98 +++++++++++++++++ web-ui/utils/ibc.ts | 81 ++++++++++++++ 17 files changed, 374 insertions(+), 75 deletions(-) create mode 100644 web-ui/.env.development create mode 100644 web-ui/.env.production rename web-ui/components/Assets/modals/{qckDepositModa.tsx => qckDepositModal.tsx} (55%) create mode 100644 web-ui/tx/ibcTransferTx.tsx create mode 100644 web-ui/utils/ibc.ts diff --git a/web-ui/.env b/web-ui/.env index ec7efd392..5677fc1e5 100644 --- a/web-ui/.env +++ b/web-ui/.env @@ -9,4 +9,4 @@ REACT_APP_ENABLE_CLAIMS="true" APY_ZONES_ENDPOINT = "https://chains.cosmos.directory" NEXT_PUBLIC_OSMOSIS_API="https://api.osmosis.zone" NEXT_PUBLIC_WHITELISTED_DENOM="uatom,ustars,uosmo,usomm,uregen" -NEXT_PUBLIC_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" \ No newline at end of file +NEXT_PUBLIC_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" diff --git a/web-ui/.env.development b/web-ui/.env.development new file mode 100644 index 000000000..c48665a31 --- /dev/null +++ b/web-ui/.env.development @@ -0,0 +1,24 @@ +NEXT_PUBLIC_CHAIN_ENV="testnet" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_QUICKSILVER="http://lcd.quicksilver.zone/" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_QUICKSILVER="http://rpc.quicksilver.zone/" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB=http://lcd.cosmoshub-4.quicksilver.zone +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_COSMOSHUB=http://rpc.cosmoshub-4.quicksilver.zone +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS="http://lcd.osmosis-1.quicksilver.zone" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_OSMOSIS="http://rpc.osmosis-1.quicksilver.zone" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_STARGAZE="http://lcd.stargaze-1.quicksilver.zone" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_STARGAZE="http://rpc.stargaze-1.quicksilver.zone" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_REGEN="http://lcd.regen-1.quicksilver.zone" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_REGEN="http://rpc.regen-1.quicksilver.zone" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_SOMMELIER="http://lcd.sommelier-3.quicksilver.zone" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_SOMMELIER="http://rpc.sommelier-3.quicksilver.zone" +NEXT_PUBLIC_QUICKSILVER_API="http://lcd.quicksilver.zone" +NEXT_PUBLIC_QUICKSILVER_DATA_API="http://data.quicksilver.zone" +ZONE_URL="quicksilver.zone" +REACT_APP_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" +REACT_APP_ENABLE_UNBONDING="true" +REACT_APP_ENABLE_SET_INTENT="true" +REACT_APP_ENABLE_CLAIMS="true" +APY_ZONES_ENDPOINT = "https://chains.cosmos.directory" +NEXT_PUBLIC_OSMOSIS_API="https://api.osmosis.zone" +NEXT_PUBLIC_WHITELISTED_DENOM="uatom,ustars,uosmo,usomm,uregen" +NEXT_PUBLIC_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" \ No newline at end of file diff --git a/web-ui/.env.production b/web-ui/.env.production new file mode 100644 index 000000000..c06f0c5cf --- /dev/null +++ b/web-ui/.env.production @@ -0,0 +1,13 @@ +NEXT_PUBLIC_CHAIN_ENV="mainnet" +MAINNET_LCD_ENDPOINT_QUICKSILVER="https://lcd.quicksilver.zone" +MAINNET_RPC_ENDPOINT_QUICKSILVER="https://rpc.quicksilver.zone" +MAINNET_LCD_ENDPOINT_COSMOSHUB="https://lcd.cosmoshub-4.quicskilver.zone" +MAINNET_RPC_ENDPOINT_COSMOSHUB="https://rpc.cosmoshub-4.quicskilver.zone" +MAINNET_LCD_ENDPOINT_OSMOSIS="https://lcd.osmosis-1.quicskilver.zone" +MAINNET_RPC_ENDPOINT_OSMOSIS="https://rpc.osmosis-1.quicskilver.zone" +MAINNET_LCD_ENDPOINT_STARGAZE="https://lcd.stargaze-1.quicskilver.zone" +MAINNET_RPC_ENDPOINT_STARGAZE="https://rpc.stargaze-1.quicskilver.zone" +MAINNET_LCD_ENDPOINT_REGEN="https://lcd.regen-1.quicskilver.zone" +MAINNET_RPC_ENDPOINT_REGEN="https://rpc.regen-1.quicskilver.zone" +MAINNET_LCD_ENDPOINT_SOMMELIER="https://lcd.sommelier-3.quicskilver.zone" +MAINNET_RPC_ENDPOINT_SOMMELIER="https://rpc.sommelier-3.quicskilver.zone" \ No newline at end of file diff --git a/web-ui/bun.lockb b/web-ui/bun.lockb index 2c4ddd2e8b2eeb5a4e64c1e7ea49dd6590132a1a..436599ac950022588e32dc4aebfb82b5fde4a76a 100755 GIT binary patch delta 80405 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

=05@sv5K0#Q*y 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 delta 79354 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 R`Hw8Go^9$>$T^_y{{d&6vKs&Z diff --git a/web-ui/components/Assets/modals/qckDepositModa.tsx b/web-ui/components/Assets/modals/qckDepositModal.tsx similarity index 55% rename from web-ui/components/Assets/modals/qckDepositModa.tsx rename to web-ui/components/Assets/modals/qckDepositModal.tsx index 5f1ee1dbb..2d7e0d9ff 100644 --- a/web-ui/components/Assets/modals/qckDepositModa.tsx +++ b/web-ui/components/Assets/modals/qckDepositModal.tsx @@ -15,34 +15,41 @@ import { useToast, } from '@chakra-ui/react'; import { ChainName } from '@cosmos-kit/core'; -import { useManager } from '@cosmos-kit/react'; +import { useChain, useManager } from '@cosmos-kit/react'; import { useState, useMemo, useEffect } from 'react'; import { ChooseChain } from '@/components/react/choose-chain'; import { handleSelectChainDropdown, ChainOption } from '@/components/types'; +import { ibc } from 'interchain-query'; +import { useBalanceQuery, useIbcBalanceQuery } from '@/hooks/useQueries'; +import { useTx } from '@/hooks'; +import BigNumber from 'bignumber.js'; +import { getCoin, getIbcInfo } from '@/utils'; +import { StdFee, coins } from '@cosmjs/stargate'; +import { store } from '@interchain-ui/react'; export function DepositModal() { const { isOpen, onOpen, onClose } = useDisclosure(); const toast = useToast(); - const [chainName, setChainName] = useState('akash'); + const [chainName, setChainName] = useState('osmosis'); const { chainRecords, getChainLogo } = useManager(); + const [amount, setAmount] = useState(''); + const [isLoading, setIsLoading] = useState(false); - const chainOptions = useMemo( - () => - chainRecords.map((chainRecord) => { - return { - chainName: chainRecord?.name, - label: chainRecord?.chain.pretty_name, - value: chainRecord?.name, - icon: getChainLogo(chainRecord.name), - }; - }), - [chainRecords, getChainLogo], - ); + const chainOptions = useMemo(() => { + return chainRecords + .filter((chainRecord) => chainRecord.name === 'osmosis') + .map((chainRecord) => ({ + chainName: chainRecord?.name, + label: chainRecord?.chain.pretty_name, + value: chainRecord?.name, + icon: getChainLogo(chainRecord.name), + })); + }, [chainRecords, getChainLogo]); useEffect(() => { - setChainName(window.localStorage.getItem('selected-chain') || 'akash'); + setChainName(window.localStorage.getItem('selected-chain') || 'osmosis'); }, []); const onChainChange: handleSelectChainDropdown = async (selectedValue: ChainOption | null) => { @@ -56,16 +63,59 @@ export function DepositModal() { const chooseChain = ; - const handleDeposit = () => { - // Implement deposit logic here - // Show toast on success or error - toast({ - title: 'Deposit Successful', - status: 'success', - duration: 9000, - isClosable: true, + const fromChain = chainName; + const toChain = 'quicksilver'; + + const { transfer } = ibc.applications.transfer.v1.MessageComposer.withTypeUrl; + const { address, connect, status, message, wallet } = useChain(fromChain ?? ''); + const { address: qAddress } = useChain('quicksilver'); + const { balance } = useIbcBalanceQuery(fromChain ?? '', address ?? ''); + const { tx } = useTx(fromChain ?? ''); + const qckBalance = + balance?.balances.find((b) => b.denom === 'ibc/635CB83EF1DFE598B10A3E90485306FD0D47D34217A4BE5FD9977FA010A5367D')?.amount ?? ''; + + const onSubmitClick = async () => { + setIsLoading(true); + + const coin = getCoin(fromChain ?? ''); + const transferAmount = new BigNumber(amount).shiftedBy(6).toString(); + + const fee: StdFee = { + amount: coins('1000', coin.base), + gas: '300000', + }; + + const sourcePort = 'transfer'; + const sourceChannel = 'channel-0'; + + const token = { + denom: 'ibc/635CB83EF1DFE598B10A3E90485306FD0D47D34217A4BE5FD9977FA010A5367D', + amount: transferAmount, + }; + + const stamp = Date.now(); + const timeoutInNanos = (stamp + 1.2e6) * 1e6; + + const msg = transfer({ + sourcePort, + sourceChannel, + sender: address ?? '', + receiver: qAddress ?? '', + token, + timeoutHeight: undefined, + //@ts-ignore + timeoutTimestamp: timeoutInNanos, + memo: '', }); - onClose(); // Close modal after deposit + + await tx([msg], { + fee, + onSuccess: () => { + setAmount(''); + }, + }); + + setIsLoading(false); }; return ( @@ -102,7 +152,7 @@ export function DepositModal() { {/* Amount Input */} Amount - + setAmount(e.target.value)} color={'white'} placeholder="Enter amount" /> @@ -117,7 +167,7 @@ export function DepositModal() { color: 'complimentary.300', }} mr={3} - onClick={handleDeposit} + onClick={onSubmitClick} > Deposit diff --git a/web-ui/components/Assets/modals/qckWithdrawModal.tsx b/web-ui/components/Assets/modals/qckWithdrawModal.tsx index 0116ab15c..c26d770e7 100644 --- a/web-ui/components/Assets/modals/qckWithdrawModal.tsx +++ b/web-ui/components/Assets/modals/qckWithdrawModal.tsx @@ -26,21 +26,19 @@ export function WithdrawModal() { const { isOpen, onOpen, onClose } = useDisclosure(); const toast = useToast(); - const [chainName, setChainName] = useState('akash'); + const [chainName, setChainName] = useState('osmosis'); const { chainRecords, getChainLogo } = useManager(); - const chainOptions = useMemo( - () => - chainRecords.map((chainRecord) => { - return { - chainName: chainRecord?.name, - label: chainRecord?.chain.pretty_name, - value: chainRecord?.name, - icon: getChainLogo(chainRecord.name), - }; - }), - [chainRecords, getChainLogo], - ); + const chainOptions = useMemo(() => { + return chainRecords + .filter((chainRecord) => chainRecord.name === 'osmosis') + .map((chainRecord) => ({ + chainName: chainRecord?.name, + label: chainRecord?.chain.pretty_name, + value: chainRecord?.name, + icon: getChainLogo(chainRecord.name), + })); + }, [chainRecords, getChainLogo]); useEffect(() => { setChainName(window.localStorage.getItem('selected-chain') || 'akash'); diff --git a/web-ui/components/Assets/quickbox.tsx b/web-ui/components/Assets/quickbox.tsx index 2b8bf9a80..a02f08e83 100644 --- a/web-ui/components/Assets/quickbox.tsx +++ b/web-ui/components/Assets/quickbox.tsx @@ -5,7 +5,7 @@ import { defaultChainName } from '@/config'; import { useAPYQuery, useBalanceQuery, useZoneQuery } from '@/hooks/useQueries'; import { shiftDigits } from '@/utils'; -import { DepositModal } from './modals/qckDepositModa'; +import { DepositModal } from './modals/qckDepositModal'; import { WithdrawModal } from './modals/qckWithdrawModal'; const QuickBox = () => { diff --git a/web-ui/hooks/useGrpcQueryClient.ts b/web-ui/hooks/useGrpcQueryClient.ts index 58e66a959..768e0c596 100644 --- a/web-ui/hooks/useGrpcQueryClient.ts +++ b/web-ui/hooks/useGrpcQueryClient.ts @@ -8,18 +8,20 @@ const createGrpcGateWayClient = quicksilver.ClientFactory.createGrpcGateWayClien export const useGrpcQueryClient = (chainName: string) => { let grpcEndpoint: string | HttpEndpoint | undefined; + const env = process.env.NEXT_PUBLIC_CHAIN_ENV; const solution = useQueryHooks(chainName); - // Custom logic for setting rpcEndpoint based on the chain name - if (chainName === 'quicksilver') { - grpcEndpoint = 'http://135.181.140.225:1317'; - } else if (chainName === 'cosmoshub') { - grpcEndpoint = 'https://rest.sentry-01.theta-testnet.polypore.xyz'; - } else { - grpcEndpoint = solution.rpcEndpoint; - } - grpcEndpoint = solution.rpcEndpoint; + const endpoints: { [key: string]: string | undefined } = { + + cosmoshub: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_COSMOSHUB, + sommelier: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_SOMMELIER : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_SOMMELIER, + stargaze: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_STARGAZE : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_STARGAZE, + regen: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_REGEN : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_REGEN, + osmosis: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_OSMOSIS, + }; + + grpcEndpoint = endpoints[chainName] || solution.rpcEndpoint; const grpcQueryClientQuery = useQuery({ queryKey: ['grpcQueryClient', grpcEndpoint], diff --git a/web-ui/hooks/useQueries.ts b/web-ui/hooks/useQueries.ts index db237cb93..970f82f3a 100644 --- a/web-ui/hooks/useQueries.ts +++ b/web-ui/hooks/useQueries.ts @@ -43,6 +43,41 @@ export const useBalanceQuery = (chainName: string, address: string) => { }; }; +export const useIbcBalanceQuery = (chainName: string, address: string) => { + const { grpcQueryClient } = useGrpcQueryClient(chainName); + const balanceQuery = useQuery( + ['balance', address], + async () => { + if (!grpcQueryClient) { + throw new Error('RPC Client not ready'); + } + const nextKey = new Uint8Array() + const balance = await grpcQueryClient.cosmos.bank.v1beta1.allBalances({ + address: address || '', + pagination: { + key: nextKey, + offset: Long.fromNumber(0), + limit: Long.fromNumber(100), + countTotal: true, + reverse: false, + }, + }); + + return balance; + }, + { + enabled: !!grpcQueryClient, + staleTime: Infinity, + }, + ); + + return { + balance: balanceQuery.data, + isLoading: balanceQuery.isLoading, + isError: balanceQuery.isError, + }; +}; + export const useTokenPriceQuery = (tokenSymbol: string) => { const fetchTokenPrice = async () => { diff --git a/web-ui/hooks/useRpcQueryClient.ts b/web-ui/hooks/useRpcQueryClient.ts index 0d2ab6eb5..ed5e68eef 100644 --- a/web-ui/hooks/useRpcQueryClient.ts +++ b/web-ui/hooks/useRpcQueryClient.ts @@ -8,16 +8,19 @@ const createRPCQueryClient = cosmos.ClientFactory.createRPCQueryClient; export const useRpcQueryClient = (chainName: string) => { let rpcEndpoint: string | HttpEndpoint | undefined; - const solution = useQueryHooks(chainName); - - // Custom logic for setting rpcEndpoint based on the chain name - if (chainName === 'quicksilver') { - rpcEndpoint = 'https://rpc.quicksilver.zone'; - } else if (chainName === 'cosmoshub') { - rpcEndpoint = 'https://rpc.sentry-01.theta-testnet.polypore.xyz'; - } else { - rpcEndpoint = solution.rpcEndpoint; - } + + const env = process.env.NEXT_PUBLIC_CHAIN_ENV; + + const endpoints: { [key: string]: string | undefined } = { + quicksilver: env === 'testnet' ? process.env.TESTNET_RPC_ENDPOINT_QUICKSILVER : process.env.MAINNET_RPC_ENDPOINT_QUICKSILVER, + cosmoshub: env === 'testnet' ? process.env.TESTNET_RPC_ENDPOINT_COSMOSHUB : process.env.MAINNET_RPC_ENDPOINT_COSMOSHUB, + sommelier: env === 'testnet' ? process.env.TESTNET_RPC_ENDPOINT_SOMMELIER : process.env.MAINNET_RPC_ENDPOINT_SOMMELIER, + stargaze: env === 'testnet' ? process.env.TESTNET_RPC_ENDPOINT_STARGAZE : process.env.MAINNET_RP_ENDPOINTC_STARGAZE, + regen: env === 'testnet' ? process.env.TESTNET_RPC_ENDPOINT_REGEN : process.env.MAINNET_RPC_ENDPOINT_REGEN, + osmosis: env === 'testnet' ? process.env.TESTNET_RPC_ENDPOINT_OSMOSIS : process.env.MAINNET_RPC_ENDPOINT_OSMOSIS, + }; + + rpcEndpoint = endpoints[chainName]; const rpcQueryClientQuery = useQuery({ queryKey: ['rpcQueryClient', rpcEndpoint], diff --git a/web-ui/hooks/useToaster.tsx b/web-ui/hooks/useToaster.tsx index 4f1595b0f..7f3c56cfc 100644 --- a/web-ui/hooks/useToaster.tsx +++ b/web-ui/hooks/useToaster.tsx @@ -1,8 +1,4 @@ -import { - useToast, - Text, - Box, -} from '@chakra-ui/react'; +import { useToast, Text, Box } from '@chakra-ui/react'; export enum ToastType { Info = 'info', @@ -27,14 +23,9 @@ export const useToaster = () => { }, }); - const customToast = ({ - type, - title, - message, - closable = true, - duration = 5000, - }: CustomToast) => { + const customToast = ({ type, title, message, closable = true, duration = 5000 }: CustomToast) => { return toast({ + position: 'bottom-right', title, duration, status: type, diff --git a/web-ui/package.json b/web-ui/package.json index ab33a6fd2..cdd1f937f 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -11,6 +11,7 @@ "export": "next export" }, "dependencies": { + "@chain-registry/assets": "^1.26.0", "@chakra-ui/icons": "^2.0.12", "@chakra-ui/react": "2.5.1", "@chakra-ui/system": "^2.1.3", diff --git a/web-ui/pages/_app.tsx b/web-ui/pages/_app.tsx index afa9cdc7e..2ea164dab 100644 --- a/web-ui/pages/_app.tsx +++ b/web-ui/pages/_app.tsx @@ -14,6 +14,7 @@ import { chains, assets } from 'chain-registry'; import { cosmosAminoConverters, cosmosProtoRegistry } from 'interchain-query'; import type { AppProps } from 'next/app'; import { quicksilverProtoRegistry, quicksilverAminoConverters } from 'quicksilverjs'; +import { ibcAminoConverters, ibcProtoRegistry } from 'interchain-query'; import { Header, SideHeader } from '@/components'; import { defaultTheme } from '@/config'; @@ -23,12 +24,14 @@ import '@interchain-ui/react/styles'; function CreateCosmosApp({ Component, pageProps }: AppProps) { const signerOptions: SignerOptions = { + //@ts-ignore signingStargate: (chain: Chain): SigningStargateClientOptions | undefined => { - const mergedRegistry = new Registry([...cosmosProtoRegistry, ...quicksilverProtoRegistry]); + const mergedRegistry = new Registry([...cosmosProtoRegistry, ...quicksilverProtoRegistry, ...ibcProtoRegistry]); const mergedAminoTypes = new AminoTypes({ ...cosmosAminoConverters, ...quicksilverAminoConverters, + ...ibcAminoConverters, }); return { diff --git a/web-ui/pages/assets.tsx b/web-ui/pages/assets.tsx index b2199cc37..b72503429 100644 --- a/web-ui/pages/assets.tsx +++ b/web-ui/pages/assets.tsx @@ -200,7 +200,7 @@ function Home() { bgColor="rgba(255,255,255,0.1)" borderRadius="10px" p={5} - w="lg" + w="2xl" h="sm" > { export const getAPY = async (chainId: string) => { try { - const res = await axios.get(`https://data.quicksilver.zone/apr`) + const res = await axios.get(`${process.env.NEXT_PUBLIC_QUICKSILVER_DATA_API}/apr`) const { chains } = res.data if (!chains) { return 0 diff --git a/web-ui/tx/ibcTransferTx.tsx b/web-ui/tx/ibcTransferTx.tsx new file mode 100644 index 000000000..1be3e93c4 --- /dev/null +++ b/web-ui/tx/ibcTransferTx.tsx @@ -0,0 +1,98 @@ +import { Box, Link, useToast, Text } from '@chakra-ui/react'; +import { SigningStargateClient, Coin, StdFee } from '@cosmjs/stargate'; +import { ChainName } from '@cosmos-kit/core'; +import { quicksilver } from 'quicksilverjs'; +import { Dispatch, SetStateAction } from 'react'; +import { cosmos } from '@chalabi/quicksilverjs'; + +const showSuccessToast = (toast: ReturnType, txHash: string, chainName: ChainName) => { + const mintscanUrl = `https://www.mintscan.io/${chainName}/txs/${txHash}`; + toast({ + position: 'bottom-right', + duration: 5000, + isClosable: true, + render: () => ( + + + Transaction Successful + + + View on Mintscan: {mintscanUrl} + + + ), + }); +}; + +const showErrorToast = (toast: ReturnType, errorMsg: string) => { + toast({ + title: 'Transaction Failed', + description: `Error: ${errorMsg}`, + status: 'error', + duration: 5000, + isClosable: true, + position: 'bottom-right', + }); +}; + +export const ibcWithdrawlTx = async ( + dstAddress: string, + fromAddress: string, + getSigningStargateClient: () => Promise, + setResp: Dispatch>, + toast: ReturnType, + setIsError: Dispatch>, + setIsSigning: Dispatch>, + chainName: ChainName, +) => { + setIsError(false); + setIsSigning(true); + + try { + const stargateClient = await getSigningStargateClient(); + + if (!stargateClient || !fromAddress) { + console.error('Stargate client undefined or fromAddress undefined.'); + return; + } + +const { transfer } = + + const value: Coin = { amount: unbondAmount.toFixed(0), denom: local_denom }; + const msgRequestRedemption = requestRedemption({ + value: value, + fromAddress: fromAddress, + destinationAddress: dstAddress, + }); + + const fee: StdFee = { + amount: [ + { + denom: 'uqck', + amount: '7500', + }, + ], + gas: '500000', + }; + + const response = await stargateClient.signAndBroadcast(fromAddress, [msgRequestRedemption], fee); + + // Handle response + setResp(JSON.stringify(response, null, 2)); + setIsSigning(false); + + if (response.code === 0) { + showSuccessToast(toast, response.transactionHash, chainName); + } else { + setIsError(true); + showErrorToast(toast, 'Transaction failed'); + } + } catch (error) { + console.error('Error in unbonding transaction:', error); + if (error instanceof Error) { + setIsSigning(false); + setIsError(true); + showErrorToast(toast, error.message); + } + } +}; diff --git a/web-ui/utils/ibc.ts b/web-ui/utils/ibc.ts new file mode 100644 index 000000000..ff67e6480 --- /dev/null +++ b/web-ui/utils/ibc.ts @@ -0,0 +1,81 @@ +import { Asset, AssetList } from '@chain-registry/types'; +import { asset_lists as assetLists } from '@chain-registry/assets'; +import { Coin } from 'interchain-query/cosmos/base/v1beta1/coin'; +import { assets, ibc } from 'chain-registry'; +import { shiftDigits } from './maths'; + +export const truncateDenom = (denom: string) => { + return denom.slice(0, 10) + '...' + denom.slice(-6); +}; + + + + + + +const filterAssets = (chainName: string, assetList: AssetList[]): Asset[] => { + return ( + assetList + .find(({ chain_name }) => chain_name === chainName) + ?.assets?.filter(({ type_asset }) => type_asset !== 'ics20') || [] + ); +}; + +const getAllAssets = (chainName: string) => { + const nativeAssets = filterAssets(chainName, assets); + const ibcAssets = filterAssets(chainName, assetLists); + + return [...nativeAssets, ...ibcAssets]; +}; + +export const denomToAsset = (chainName: string, denom: string) => { + return getAllAssets(chainName).find((asset) => asset.base === denom); +}; + +export const denomToExponent = (chainName: string, denom: string) => { + const asset = denomToAsset(chainName, denom); + const unit = asset?.denom_units.find(({ denom }) => denom === asset.display); + return unit?.exponent || 6; +}; + +export const prettyBalance = (chainName: string, balance: Coin) => { + const { amount, denom } = balance; + const asset = denomToAsset(chainName, denom); + const symbol = asset?.symbol || truncateDenom(denom); + const exponent = denomToExponent(chainName, denom); + const displayAmount = shiftDigits(amount, -exponent); + const logoUrl = Object.values(asset?.logo_URIs || {}).find((url) => url); + + return { denom, symbol, amount, displayAmount, logoUrl, exponent }; +}; + +export type PrettyBalance = ReturnType; + +export const getIbcInfo = (fromChainName: string, toChainName: string) => { + let flipped = false; + + let ibcInfo = ibc.find( + (i) => + i.chain_1.chain_name === fromChainName && + i.chain_2.chain_name === toChainName + ); + + if (!ibcInfo) { + ibcInfo = ibc.find( + (i) => + i.chain_1.chain_name === toChainName && + i.chain_2.chain_name === fromChainName + ); + flipped = true; + } + + if (!ibcInfo) { + throw new Error('cannot find IBC info'); + } + + const key = flipped ? 'chain_2' : 'chain_1'; + const sourcePort = ibcInfo.channels[0][key].port_id; + const sourceChannel = ibcInfo.channels[0][key].channel_id; + + return { sourcePort, sourceChannel }; +}; \ No newline at end of file From 6612d76006dbeb384c0b4ccfb52ff88f9b320fda Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Thu, 21 Dec 2023 15:47:45 -0700 Subject: [PATCH 08/40] - make prod ready - ibc transactions --- web-ui/.env.production | 35 +++-- .../Assets/modals/qckDepositModal.tsx | 25 +++- .../Assets/modals/qckWithdrawModal.tsx | 98 +++++++++++-- web-ui/components/react/chain-dropdown.tsx | 54 ++++++- web-ui/hooks/useToaster.tsx | 2 +- web-ui/services/zone.ts | 134 ------------------ web-ui/tx/ibcTransferTx.tsx | 26 ++-- web-ui/utils/index.ts | 1 + 8 files changed, 202 insertions(+), 173 deletions(-) diff --git a/web-ui/.env.production b/web-ui/.env.production index c06f0c5cf..3e583b454 100644 --- a/web-ui/.env.production +++ b/web-ui/.env.production @@ -1,13 +1,24 @@ NEXT_PUBLIC_CHAIN_ENV="mainnet" -MAINNET_LCD_ENDPOINT_QUICKSILVER="https://lcd.quicksilver.zone" -MAINNET_RPC_ENDPOINT_QUICKSILVER="https://rpc.quicksilver.zone" -MAINNET_LCD_ENDPOINT_COSMOSHUB="https://lcd.cosmoshub-4.quicskilver.zone" -MAINNET_RPC_ENDPOINT_COSMOSHUB="https://rpc.cosmoshub-4.quicskilver.zone" -MAINNET_LCD_ENDPOINT_OSMOSIS="https://lcd.osmosis-1.quicskilver.zone" -MAINNET_RPC_ENDPOINT_OSMOSIS="https://rpc.osmosis-1.quicskilver.zone" -MAINNET_LCD_ENDPOINT_STARGAZE="https://lcd.stargaze-1.quicskilver.zone" -MAINNET_RPC_ENDPOINT_STARGAZE="https://rpc.stargaze-1.quicskilver.zone" -MAINNET_LCD_ENDPOINT_REGEN="https://lcd.regen-1.quicskilver.zone" -MAINNET_RPC_ENDPOINT_REGEN="https://rpc.regen-1.quicskilver.zone" -MAINNET_LCD_ENDPOINT_SOMMELIER="https://lcd.sommelier-3.quicskilver.zone" -MAINNET_RPC_ENDPOINT_SOMMELIER="https://rpc.sommelier-3.quicskilver.zone" \ No newline at end of file +NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_QUICKSILVER="http://lcd.quicksilver.zone/" +NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_QUICKSILVER="http://rpc.quicksilver.zone/" +NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_COSMOSHUB=http://lcd.cosmoshub-4.quicksilver.zone +NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_COSMOSHUB=http://rpc.cosmoshub-4.quicksilver.zone +NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_OSMOSIS="http://lcd.osmosis-1.quicksilver.zone" +NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_OSMOSIS="http://rpc.osmosis-1.quicksilver.zone" +NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_STARGAZE="http://lcd.stargaze-1.quicksilver.zone" +NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_STARGAZE="http://rpc.stargaze-1.quicksilver.zone" +NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_REGEN="http://lcd.regen-1.quicksilver.zone" +NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_REGEN="http://rpc.regen-1.quicksilver.zone" +NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_SOMMELIER="http://lcd.sommelier-3.quicksilver.zone" +NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_SOMMELIER="http://rpc.sommelier-3.quicksilver.zone" +NEXT_PUBLIC_QUICKSILVER_API="http://lcd.quicksilver.zone" +NEXT_PUBLIC_QUICKSILVER_DATA_API="http://data.quicksilver.zone" +ZONE_URL="quicksilver.zone" +REACT_APP_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" +REACT_APP_ENABLE_UNBONDING="true" +REACT_APP_ENABLE_SET_INTENT="true" +REACT_APP_ENABLE_CLAIMS="true" +APY_ZONES_ENDPOINT = "https://chains.cosmos.directory" +NEXT_PUBLIC_OSMOSIS_API="https://api.osmosis.zone" +NEXT_PUBLIC_WHITELISTED_DENOM="uatom,ustars,uosmo,usomm,uregen" +NEXT_PUBLIC_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" \ No newline at end of file diff --git a/web-ui/components/Assets/modals/qckDepositModal.tsx b/web-ui/components/Assets/modals/qckDepositModal.tsx index 2d7e0d9ff..d97027390 100644 --- a/web-ui/components/Assets/modals/qckDepositModal.tsx +++ b/web-ui/components/Assets/modals/qckDepositModal.tsx @@ -13,6 +13,7 @@ import { Select, useDisclosure, useToast, + Spinner, } from '@chakra-ui/react'; import { ChainName } from '@cosmos-kit/core'; import { useChain, useManager } from '@cosmos-kit/react'; @@ -152,7 +153,25 @@ export function DepositModal() { {/* Amount Input */} Amount - setAmount(e.target.value)} color={'white'} placeholder="Enter amount" /> + setAmount(e.target.value)} + color={'white'} + placeholder="Enter amount" + /> @@ -166,10 +185,12 @@ export function DepositModal() { bgColor: 'rgba(255,128,0, 0.25)', color: 'complimentary.300', }} + minW="100px" mr={3} onClick={onSubmitClick} > - Deposit + {isLoading === true && } + {isLoading === false && 'Deposit'} - + + ); diff --git a/web-ui/components/Assets/index.ts b/web-ui/components/Assets/index.ts new file mode 100644 index 000000000..72ef2eeb9 --- /dev/null +++ b/web-ui/components/Assets/index.ts @@ -0,0 +1,6 @@ +export * from './modals' +export * from './assetsGrid' +export * from './portfolio' +export * from './intents' +export * from './quickbox' +export * from './unbondingTable' diff --git a/web-ui/components/Assets/modals/index.ts b/web-ui/components/Assets/modals/index.ts new file mode 100644 index 000000000..1fc5c7fd3 --- /dev/null +++ b/web-ui/components/Assets/modals/index.ts @@ -0,0 +1,4 @@ +export * from './qTokenDepositModal'; +export * from './qTokenWithdrawlModal'; +export * from './qckDepositModal'; +export * from './qckWithdrawModal'; \ No newline at end of file diff --git a/web-ui/components/Assets/modals/qTokenDepositModal.tsx b/web-ui/components/Assets/modals/qTokenDepositModal.tsx new file mode 100644 index 000000000..44ea4f4d8 --- /dev/null +++ b/web-ui/components/Assets/modals/qTokenDepositModal.tsx @@ -0,0 +1,224 @@ +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, + Button, + FormControl, + FormLabel, + Input, + Select, + useDisclosure, + useToast, + Spinner, +} from '@chakra-ui/react'; +import { ChainName } from '@cosmos-kit/core'; +import { useChain, useManager } from '@cosmos-kit/react'; +import { useState, useMemo, useEffect } from 'react'; + +import { ChooseChain } from '@/components/react/choose-chain'; +import { handleSelectChainDropdown, ChainOption } from '@/components/types'; +import { ibc } from 'interchain-query'; +import { useBalanceQuery, useIbcBalanceQuery } from '@/hooks/useQueries'; +import { useTx } from '@/hooks'; +import BigNumber from 'bignumber.js'; +import { getCoin, getIbcInfo } from '@/utils'; +import { StdFee, coins } from '@cosmjs/stargate'; +import { store } from '@interchain-ui/react'; + +export interface QDepositModalProps { + token: string; +} + +const QDepositModal: React.FC = ({ token }) => { + const { isOpen, onOpen, onClose } = useDisclosure(); + const toast = useToast(); + + const [chainName, setChainName] = useState('osmosis'); + const { chainRecords, getChainLogo } = useManager(); + const [amount, setAmount] = useState(''); + const [isLoading, setIsLoading] = useState(false); + + const chainOptions = useMemo(() => { + const desiredChains = ['osmosis', 'secretnetwork', 'umee']; + return chainRecords + .filter((chainRecord) => desiredChains.includes(chainRecord.name)) + .map((chainRecord) => ({ + chainName: chainRecord?.name, + label: chainRecord?.chain.pretty_name, + value: chainRecord?.name, + icon: getChainLogo(chainRecord.name), + })); + }, [chainRecords, getChainLogo]); + + useEffect(() => { + setChainName(window.localStorage.getItem('selected-chain') || 'osmosis'); + }, []); + + const onChainChange: handleSelectChainDropdown = async (selectedValue: ChainOption | null) => { + setChainName(selectedValue?.chainName); + if (selectedValue?.chainName) { + window?.localStorage.setItem('selected-chain', selectedValue?.chainName); + } else { + window?.localStorage.removeItem('selected-chain'); + } + }; + + const chooseChain = ; + + const fromChain = chainName; + const toChain = 'quicksilver'; + + const { transfer } = ibc.applications.transfer.v1.MessageComposer.withTypeUrl; + const { address, connect, status, message, wallet } = useChain(fromChain ?? ''); + const { address: qAddress } = useChain('quicksilver'); + const { balance } = useIbcBalanceQuery(fromChain ?? '', address ?? ''); + const { tx } = useTx(fromChain ?? ''); + const qckBalance = + balance?.balances.find((b) => b.denom === 'ibc/635CB83EF1DFE598B10A3E90485306FD0D47D34217A4BE5FD9977FA010A5367D')?.amount ?? ''; + + const onSubmitClick = async () => { + setIsLoading(true); + + const coin = getCoin(fromChain ?? ''); + const transferAmount = new BigNumber(amount).shiftedBy(6).toString(); + + const fee: StdFee = { + amount: coins('1000', coin.base), + gas: '300000', + }; + + const sourcePort = 'transfer'; + const sourceChannel = 'channel-0'; + + const token = { + denom: 'ibc/635CB83EF1DFE598B10A3E90485306FD0D47D34217A4BE5FD9977FA010A5367D', + amount: transferAmount, + }; + + const stamp = Date.now(); + const timeoutInNanos = (stamp + 1.2e6) * 1e6; + + const msg = transfer({ + sourcePort, + sourceChannel, + sender: address ?? '', + receiver: qAddress ?? '', + token, + timeoutHeight: undefined, + //@ts-ignore + timeoutTimestamp: timeoutInNanos, + memo: '', + }); + + await tx([msg], { + fee, + onSuccess: () => { + setAmount(''); + }, + }); + + setIsLoading(false); + }; + + return ( + <> + + + + + + Deposit {token} Tokens + + + {/* Chain Selection Dropdown */} + + From Chain + {chooseChain} + + + {/* Amount Input */} + + Amount + setAmount(e.target.value)} + color={'white'} + placeholder="Enter amount" + /> + + + + + + + + + + + ); +}; + +export default QDepositModal; diff --git a/web-ui/components/Assets/modals/qTokenWithdrawlModal.tsx b/web-ui/components/Assets/modals/qTokenWithdrawlModal.tsx new file mode 100644 index 000000000..a96dcae25 --- /dev/null +++ b/web-ui/components/Assets/modals/qTokenWithdrawlModal.tsx @@ -0,0 +1,224 @@ +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, + Button, + FormControl, + FormLabel, + Input, + Select, + useDisclosure, + useToast, + Spinner, +} from '@chakra-ui/react'; +import { ChainName } from '@cosmos-kit/core'; +import { useChain, useManager } from '@cosmos-kit/react'; +import { useState, useMemo, useEffect } from 'react'; + +import { ChooseChain } from '@/components/react/choose-chain'; +import { handleSelectChainDropdown, ChainOption } from '@/components/types'; +import { ibc } from 'interchain-query'; +import { useBalanceQuery, useIbcBalanceQuery } from '@/hooks/useQueries'; +import { useTx } from '@/hooks'; +import BigNumber from 'bignumber.js'; +import { getCoin, getIbcInfo } from '@/utils'; +import { StdFee, coins } from '@cosmjs/stargate'; +import { store } from '@interchain-ui/react'; + +interface QDepositModalProps { + token: string; +} + +const QWithdrawModal: React.FC = ({ token }) => { + const { isOpen, onOpen, onClose } = useDisclosure(); + const toast = useToast(); + + const [chainName, setChainName] = useState('osmosis'); + const { chainRecords, getChainLogo } = useManager(); + const [amount, setAmount] = useState(''); + const [isLoading, setIsLoading] = useState(false); + + const chainOptions = useMemo(() => { + const desiredChains = ['osmosis', 'secretnetwork', 'umee']; + return chainRecords + .filter((chainRecord) => desiredChains.includes(chainRecord.name)) + .map((chainRecord) => ({ + chainName: chainRecord?.name, + label: chainRecord?.chain.pretty_name, + value: chainRecord?.name, + icon: getChainLogo(chainRecord.name), + })); + }, [chainRecords, getChainLogo]); + + useEffect(() => { + setChainName(window.localStorage.getItem('selected-chain') || 'osmosis'); + }, []); + + const onChainChange: handleSelectChainDropdown = async (selectedValue: ChainOption | null) => { + setChainName(selectedValue?.chainName); + if (selectedValue?.chainName) { + window?.localStorage.setItem('selected-chain', selectedValue?.chainName); + } else { + window?.localStorage.removeItem('selected-chain'); + } + }; + + const chooseChain = ; + + const fromChain = chainName; + const toChain = 'quicksilver'; + + const { transfer } = ibc.applications.transfer.v1.MessageComposer.withTypeUrl; + const { address, connect, status, message, wallet } = useChain(fromChain ?? ''); + const { address: qAddress } = useChain('quicksilver'); + const { balance } = useIbcBalanceQuery(fromChain ?? '', address ?? ''); + const { tx } = useTx(fromChain ?? ''); + const qckBalance = + balance?.balances.find((b) => b.denom === 'ibc/635CB83EF1DFE598B10A3E90485306FD0D47D34217A4BE5FD9977FA010A5367D')?.amount ?? ''; + + const onSubmitClick = async () => { + setIsLoading(true); + + const coin = getCoin(fromChain ?? ''); + const transferAmount = new BigNumber(amount).shiftedBy(6).toString(); + + const fee: StdFee = { + amount: coins('1000', coin.base), + gas: '300000', + }; + + const sourcePort = 'transfer'; + const sourceChannel = 'channel-0'; + + const token = { + denom: 'ibc/635CB83EF1DFE598B10A3E90485306FD0D47D34217A4BE5FD9977FA010A5367D', + amount: transferAmount, + }; + + const stamp = Date.now(); + const timeoutInNanos = (stamp + 1.2e6) * 1e6; + + const msg = transfer({ + sourcePort, + sourceChannel, + sender: address ?? '', + receiver: qAddress ?? '', + token, + timeoutHeight: undefined, + //@ts-ignore + timeoutTimestamp: timeoutInNanos, + memo: '', + }); + + await tx([msg], { + fee, + onSuccess: () => { + setAmount(''); + }, + }); + + setIsLoading(false); + }; + + return ( + <> + + + + + + Withdraw {token} Tokens + + + {/* Chain Selection Dropdown */} + + To Chain + {chooseChain} + + + {/* Amount Input */} + + Amount + setAmount(e.target.value)} + color={'white'} + placeholder="Enter amount" + /> + + + + + + + + + + + ); +}; + +export default QWithdrawModal; From fb4037c2f2e339c47363bacd6d0008cd63785d92 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Fri, 22 Dec 2023 00:37:28 -0700 Subject: [PATCH 11/40] Assets Page WIP --- web-ui/components/Assets/assetsGrid.tsx | 43 ++++++- web-ui/components/Assets/intents.tsx | 33 ++++- web-ui/components/Assets/unbondingTable.tsx | 10 +- .../components/ThreeJS/liquidMetalSphere.tsx | 115 ++++++++++++------ web-ui/hooks/useGrpcQueryClient.ts | 6 +- web-ui/hooks/useQueries.ts | 40 ++++++ web-ui/hooks/useQueryHooks2.ts | 9 +- web-ui/pages/assets.tsx | 6 +- 8 files changed, 207 insertions(+), 55 deletions(-) diff --git a/web-ui/components/Assets/assetsGrid.tsx b/web-ui/components/Assets/assetsGrid.tsx index 05f7e262a..2b4fcb876 100644 --- a/web-ui/components/Assets/assetsGrid.tsx +++ b/web-ui/components/Assets/assetsGrid.tsx @@ -1,5 +1,5 @@ import { shiftDigits } from '@/utils'; -import { Box, SimpleGrid, VStack, Text, Button, Divider, useColorModeValue, HStack, Flex, Grid, GridItem } from '@chakra-ui/react'; +import { Box, SimpleGrid, VStack, Text, Button, Divider, useColorModeValue, HStack, Flex, Grid, GridItem, Spinner } from '@chakra-ui/react'; import React from 'react'; import QDepositModal from './modals/qTokenDepositModal'; import QWithdrawModal from './modals/qTokenWithdrawlModal'; @@ -8,9 +8,11 @@ interface AssetCardProps { balance: string; apy: number; nativeAssetName: string; + isWalletConnected: boolean; } interface AssetGridProps { + isWalletConnected: boolean; assets: Array<{ name: string; balance: string; @@ -19,7 +21,34 @@ interface AssetGridProps { }>; } -const AssetCard: React.FC = ({ assetName, balance, apy, nativeAssetName }) => { +const AssetCard: React.FC = ({ assetName, balance, apy, nativeAssetName, isWalletConnected }) => { + if (!isWalletConnected) { + return ( + + + Wallet is not connected. Please connect your wallet to interact with your QCK tokens. + + + ); + } + + if (!balance || !apy) { + return ( + + + + ); + } return ( @@ -69,7 +98,7 @@ const AssetCard: React.FC = ({ assetName, balance, apy, nativeAs ); }; -const AssetsGrid: React.FC = ({ assets }) => { +const AssetsGrid: React.FC = ({ assets, isWalletConnected }) => { return ( <> @@ -80,7 +109,13 @@ const AssetsGrid: React.FC = ({ assets }) => { {assets.map((asset, index) => ( {' '} - + ))} diff --git a/web-ui/components/Assets/intents.tsx b/web-ui/components/Assets/intents.tsx index 32f32304f..5933984bb 100644 --- a/web-ui/components/Assets/intents.tsx +++ b/web-ui/components/Assets/intents.tsx @@ -1,5 +1,5 @@ import { ChevronLeftIcon, ChevronRightIcon } from '@chakra-ui/icons'; -import { Box, Flex, Text, Button, IconButton, VStack, Image, Heading, SlideFade } from '@chakra-ui/react'; +import { Box, Flex, Text, Button, IconButton, VStack, Image, Heading, SlideFade, Spinner } from '@chakra-ui/react'; import { color } from 'framer-motion'; import { useState } from 'react'; @@ -7,9 +7,10 @@ import { useIntentQuery } from '@/hooks/useQueries'; export interface StakingIntentProps { address: string; + isWalletConnected: boolean; } -const StakingIntent: React.FC = ({ address }) => { +const StakingIntent: React.FC = ({ address, isWalletConnected }) => { const { intent, isLoading, isError } = useIntentQuery('cosmoshub', address ?? ''); const validators = [ @@ -28,6 +29,34 @@ const StakingIntent: React.FC = ({ address }) => { setCurrentChainIndex((prevIndex) => (prevIndex === chains.length - 1 ? 0 : prevIndex + 1)); }; + if (!isWalletConnected) { + return ( + + + Wallet is not connected. Please connect your wallet to interact with your QCK tokens. + + + ); + } + + if (!intent) { + return ( + + + + ); + } + return ( diff --git a/web-ui/components/Assets/unbondingTable.tsx b/web-ui/components/Assets/unbondingTable.tsx index d1989508f..5bf42b026 100644 --- a/web-ui/components/Assets/unbondingTable.tsx +++ b/web-ui/components/Assets/unbondingTable.tsx @@ -1,6 +1,12 @@ +import { useUnbondingQuery } from '@/hooks/useQueries'; import { Table, Thead, Tbody, Tr, Th, Td, TableContainer, Text, Box } from '@chakra-ui/react'; -const UnbondingAssetsTable = () => { +interface UnbondingAssetsTableProps { + address: string; + chainName: string; +} + +const UnbondingAssetsTable: React.FC = ({ address, chainName }) => { const unbondingAssets = [ { asset: '10 ATOM', @@ -31,7 +37,7 @@ const UnbondingAssetsTable = () => { completionTime: '2023-01-14', }, ]; - + const { unbondingData } = useUnbondingQuery(chainName, address); return ( <> diff --git a/web-ui/components/ThreeJS/liquidMetalSphere.tsx b/web-ui/components/ThreeJS/liquidMetalSphere.tsx index 75b1a0d1e..411398285 100644 --- a/web-ui/components/ThreeJS/liquidMetalSphere.tsx +++ b/web-ui/components/ThreeJS/liquidMetalSphere.tsx @@ -1,55 +1,92 @@ import { useRef, useEffect } from 'react'; import * as THREE from 'three'; +import { ImprovedNoise } from 'three/examples/jsm/math/ImprovedNoise.js'; const LiquidMetalSphere = () => { - const mountRef = useRef( - null, - ); + const mountRef = useRef(null); useEffect(() => { if (!mountRef.current) return; - + const mouse = new THREE.Vector2(); const scene = new THREE.Scene(); - const camera = new THREE.PerspectiveCamera( - 75, - window.innerWidth / window.innerHeight, - 1, - 10, - ); - const renderer = new THREE.WebGLRenderer({ - antialias: true, - }); + const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 100); + const renderer = new THREE.WebGLRenderer({ antialias: true }); + renderer.setSize(window.innerWidth, window.innerHeight); + mountRef.current.appendChild(renderer.domElement); - renderer.setSize( - window.innerWidth, - window.innerHeight, - ); - mountRef.current.appendChild( - renderer.domElement, - ); + // Increase the radius to make the sphere larger + const geometry = new THREE.SphereGeometry(4, 64, 64); // Radius increased to 3 + const vertexShader = ` + varying vec3 vNormal; + varying vec3 vPosition; + varying vec2 vUv; + void main() { + vNormal = normalize(normalMatrix * normal); + vPosition = position; + vec4 modelViewPosition = modelViewMatrix * vec4(position, 1.0); + vUv = vec2(modelViewPosition.x, modelViewPosition.y) / 10.0 + 0.5; + gl_Position = projectionMatrix * modelViewPosition; + } + `; + const fragmentShader = ` + uniform float time; + uniform vec2 mousePos; + uniform vec2 resolution; + varying vec3 vNormal; + varying vec3 vPosition; + varying vec2 vUv; + void main() { + vec3 orange = vec3(1.0, 0.55, 0.0); + vec3 darkArea = vec3(0.1, 0.1, 0.1); + float dist = distance(gl_PointCoord.xy, mousePos); + float ripple = sin(dist * 10.0 - time * 5.0) * 0.5 + 0.5; + vec3 color = mix(orange, darkArea, ripple); + gl_FragColor = vec4(color, 64.0); + } + `; + const material = new THREE.ShaderMaterial({ + uniforms: { + time: { value: 1.0 }, + mousePos: { value: new THREE.Vector2(-1, -1) }, // Initialize outside the screen + resolution: { value: new THREE.Vector2(window.innerWidth, window.innerHeight) }, + }, + vertexShader, + fragmentShader, + }); - const geometry = new THREE.SphereGeometry( - 1, - 32, - 32, - ); - const material = new THREE.MeshBasicMaterial({ - color: 'orange', - wireframe: true, - }); - const sphere = new THREE.Mesh( - geometry, - material, - ); + const sphere = new THREE.Mesh(geometry, material); scene.add(sphere); + camera.position.z = 10; // Adjust camera distance to fit the larger sphere - camera.position.z = 5; + const noise = new ImprovedNoise(); + const positionAttribute = geometry.getAttribute('position'); + const originalPosition: any[] = []; + for (let i = 0; i < positionAttribute.count; i++) { + originalPosition.push(new THREE.Vector3().fromBufferAttribute(positionAttribute, i)); + } + const onMouseMove = (event: { clientX: number; clientY: number }) => { + // Normalize mouse coordinates and update uniform + material.uniforms.mousePos.value.set((event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window.innerHeight) * 2 + 1); + }; + + window.addEventListener('mousemove', onMouseMove); const animate = () => { requestAnimationFrame(animate); - sphere.rotation.x += 0.001; - sphere.rotation.y += 0.001; + const time = Date.now() * 0.001; + sphere.material.uniforms.time.value = time; + + for (let i = 0; i < positionAttribute.count; i++) { + const vertex = originalPosition[i]; + const offset = noise.noise(vertex.x + time, vertex.y, vertex.z); + const newPosition = vertex.clone().multiplyScalar(1 + offset * 0.03); + positionAttribute.setXYZ(i, newPosition.x, newPosition.y, newPosition.z); + } + positionAttribute.needsUpdate = true; + + sphere.rotation.x += 0.005; + sphere.rotation.y += 0.005; renderer.render(scene, camera); }; @@ -57,10 +94,8 @@ const LiquidMetalSphere = () => { return () => { renderer.dispose(); - window.removeEventListener( - 'resize', - () => {}, - ); + window.removeEventListener('mousemove', onMouseMove); + window.removeEventListener('resize', () => {}); }; }, []); diff --git a/web-ui/hooks/useGrpcQueryClient.ts b/web-ui/hooks/useGrpcQueryClient.ts index 768e0c596..4bc0e805e 100644 --- a/web-ui/hooks/useGrpcQueryClient.ts +++ b/web-ui/hooks/useGrpcQueryClient.ts @@ -13,7 +13,7 @@ export const useGrpcQueryClient = (chainName: string) => { const endpoints: { [key: string]: string | undefined } = { - + quicksilver: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_QUICKSILVER : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_QUICKSILVER, cosmoshub: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_COSMOSHUB, sommelier: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_SOMMELIER : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_SOMMELIER, stargaze: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_STARGAZE : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_STARGAZE, @@ -21,8 +21,12 @@ export const useGrpcQueryClient = (chainName: string) => { osmosis: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_OSMOSIS, }; + + grpcEndpoint = endpoints[chainName] || solution.rpcEndpoint; + + const grpcQueryClientQuery = useQuery({ queryKey: ['grpcQueryClient', grpcEndpoint], queryFn: () => diff --git a/web-ui/hooks/useQueries.ts b/web-ui/hooks/useQueries.ts index 970f82f3a..0dc8ab3c7 100644 --- a/web-ui/hooks/useQueries.ts +++ b/web-ui/hooks/useQueries.ts @@ -152,6 +152,46 @@ export const useIntentQuery = (chainName: string, address: string) => { }; }; +export const useUnbondingQuery = (chainName: string, address: string) => { + const { grpcQueryClient } = useGrpcQueryClient('quicksilver'); + const { chain } = useChain(chainName); + const chainId = chain.chain_id; + const unbondingQuery = useQuery( + ['unbond', chainName], + async () => { + if (!grpcQueryClient) { + throw new Error('RPC Client not ready'); + } + const nextKey = new Uint8Array() + const unbonding = await grpcQueryClient.quicksilver.interchainstaking.v1.withdrawalRecords({ + delegatorAddress: address, + chainId: chainId, + pagination: { + key: nextKey, + offset: Long.fromNumber(0), + limit: Long.fromNumber(100), + countTotal: true, + reverse: false, + }, + + }); + + return unbonding; + + }, + { + enabled: !!grpcQueryClient, + staleTime: Infinity, + }, + ); + + return { + unbondingData: unbondingQuery.data, + isLoading: unbondingQuery.isLoading, + isError: unbondingQuery.isError, + }; +}; + export const useValidatorsQuery = (chainName: string) => { const { grpcQueryClient } = useGrpcQueryClient(chainName); diff --git a/web-ui/hooks/useQueryHooks2.ts b/web-ui/hooks/useQueryHooks2.ts index 22f3f0452..98cdccbef 100644 --- a/web-ui/hooks/useQueryHooks2.ts +++ b/web-ui/hooks/useQueryHooks2.ts @@ -24,10 +24,13 @@ export const useQueryHooks = ( }, }); + + const rpcEndpoint = chainName === 'quicksilver' ? 'https://rpc.quicksilver.zone' : rpcEndpointQuery.data; + const rpcClientQuery = useRpcClient({ - rpcEndpoint: rpcEndpointQuery.data || '', + rpcEndpoint: rpcEndpoint || '', options: { - enabled: !!rpcEndpointQuery.data, + enabled: !!rpcEndpoint, staleTime: Infinity, queryKeyHashFn: (queryKey) => { return JSON.stringify( @@ -53,6 +56,6 @@ export const useQueryHooks = ( cosmosQuery, isReady, isFetching, - rpcEndpoint: rpcEndpointQuery.data, + rpcEndpoint: rpcEndpoint, }; }; \ No newline at end of file diff --git a/web-ui/pages/assets.tsx b/web-ui/pages/assets.tsx index b72503429..31e96cfb0 100644 --- a/web-ui/pages/assets.tsx +++ b/web-ui/pages/assets.tsx @@ -222,16 +222,16 @@ function Home() { w="lg" h="sm" > - + {/* Assets Grid */} - + {/* Unbonding Table */} - + From 5044b403da4865ffefd9d1de32ee6d0faccd20b3 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Fri, 22 Dec 2023 15:47:15 -0700 Subject: [PATCH 12/40] DEFI Page WIP --- web-ui/components/Defi/defiBox.tsx | 203 +++++++++++++++++++++++++ web-ui/components/react/sideHeader.tsx | 26 ++++ web-ui/pages/defi.tsx | 33 +++- web-ui/pages/governance.tsx | 37 ++--- web-ui/pages/staking.tsx | 10 +- 5 files changed, 276 insertions(+), 33 deletions(-) create mode 100644 web-ui/components/Defi/defiBox.tsx diff --git a/web-ui/components/Defi/defiBox.tsx b/web-ui/components/Defi/defiBox.tsx new file mode 100644 index 000000000..bf423ecae --- /dev/null +++ b/web-ui/components/Defi/defiBox.tsx @@ -0,0 +1,203 @@ +import React, { useState } from 'react'; +import { + Box, + Button, + Flex, + Heading, + Table, + Thead, + Tbody, + Tr, + Th, + Td, + Text, + Select, + Stack, + useColorModeValue, + ButtonGroup, + HStack, +} from '@chakra-ui/react'; +import { ChevronDownIcon, ExternalLinkIcon } from '@chakra-ui/icons'; +type ActionButtonTitle = 'Add Liquidity' | 'Borrow' | 'Lend' | 'Mint Stablecoin' | 'Vaults'; +interface DefiAsset { + id: string; + assetPair: string; + apy: number; + tvl: string; + provider: string; + action: string; +} + +const fakeData: DefiAsset[] = [ + { + id: '1', + assetPair: 'qATOM - ATOM', + apy: 0.56, + tvl: '$416.87', + provider: 'Radiyum', + action: 'Add Liquidity', + }, + { + id: '1', + assetPair: 'qATOM - ATOM', + apy: 10, + tvl: '$20006.87', + provider: 'Osmosis', + action: 'Mint Stablecoin', + }, + { + id: '1', + assetPair: 'qATOM - ATOM', + apy: 10, + tvl: '$20006.87', + provider: 'Osmosis', + action: 'Lend', + }, + { + id: '1', + assetPair: 'qATOM - ATOM', + apy: 0.56, + tvl: '$416.87', + provider: 'Radiyum', + action: 'Borrow', + }, + { + id: '1', + assetPair: 'qATOM - ATOM', + apy: 0.56, + tvl: '$416.87', + provider: 'Radiyum', + action: 'add-liquidity', + }, + { + id: '1', + assetPair: 'qATOM - ATOM', + apy: 0.56, + tvl: '$416.87', + provider: 'Radiyum', + action: 'add-liquidity', + }, + { + id: '1', + assetPair: 'qATOM - ATOM', + apy: 0.56, + tvl: '$416.87', + provider: 'Radiyum', + action: 'Vaults', + }, + { + id: '1', + assetPair: 'qATOM - ATOM', + apy: 0.56, + tvl: '$416.87', + provider: 'Radiyum', + action: 'add-liquidity', + }, + { + id: '1', + assetPair: 'qATOM - ATOM', + apy: 0.56, + tvl: '$416.87', + provider: 'Radiyum', + action: 'add-liquidity', + }, +]; + +const actionTitles: Record = { + 'add-liquidity': 'Add Liquidity', + borrow: 'Borrow', + lend: 'Lend', + 'mint-stablecoin': 'Mint Stablecoin', + vaults: 'Vaults', +}; + +const filterCategories = { + All: () => true, + 'Borrowing & Lending': (asset: DefiAsset) => asset.action === 'Borrow' || asset.action === 'Lend', + Vaults: (asset: DefiAsset) => asset.action === 'Vaults', + 'Liquidity Providers': (asset: DefiAsset) => asset.action === 'Add Liquidity', + 'Mint Stable Coins': (asset: DefiAsset) => asset.action === 'Mint Stablecoin', +}; + +const DefiTable = () => { + const [activeFilter, setActiveFilter] = useState('All'); + + // Function to handle filter button clicks + const handleFilterClick = (filter: string) => { + setActiveFilter(filter); + }; + + const filteredData = fakeData.filter(filterCategories[activeFilter]); + + return ( + + + {Object.keys(filterCategories).map((filter) => ( + + ))} + + + + + + + + + + + + + + {filteredData.map((asset, index) => ( + + + + + + + + ))} + +
+ Asset Pair + + APY + + TVL + ProviderAction
+ + + {asset.assetPair} + + + {asset.apy}% + + {asset.tvl} + {asset.provider} + +
+
+
+ ); +}; + +export default DefiTable; diff --git a/web-ui/components/react/sideHeader.tsx b/web-ui/components/react/sideHeader.tsx index 91376e6b8..de38b5573 100644 --- a/web-ui/components/react/sideHeader.tsx +++ b/web-ui/components/react/sideHeader.tsx @@ -266,6 +266,32 @@ export const SideHeader = () => { />
+ + router.push('/airdrop')} + cursor="pointer" + borderRadius="100px" + boxShadow={ + selectedPage === 'aidrop' ? `0 0 15px 5px ${commonBoxShadowColor}, inset 0 0 50px 5px ${commonBoxShadowColor}` : '' + } + _hover={{ + boxShadow: `0 0 15px 5px ${commonBoxShadowColor}, inset 0 0 50px 5px ${commonBoxShadowColor}`, + transition: transitionStyle, + }} + > + DeFi + + - - - DeFi - - - - + + + + DeFi + + + + + DeFi Opportunities + + + + ); } diff --git a/web-ui/pages/governance.tsx b/web-ui/pages/governance.tsx index 4d0169c7e..38819f1ec 100644 --- a/web-ui/pages/governance.tsx +++ b/web-ui/pages/governance.tsx @@ -14,30 +14,19 @@ export default function Home() { return ( <> - - - - Governance - - - - - - Proposals - - {chainName && } - - - + + + Governance + + + + + + Proposals + + {chainName && } + + ); diff --git a/web-ui/pages/staking.tsx b/web-ui/pages/staking.tsx index 5727b89a6..31293e44d 100644 --- a/web-ui/pages/staking.tsx +++ b/web-ui/pages/staking.tsx @@ -17,7 +17,7 @@ import { } from '@chakra-ui/react'; import dynamic from 'next/dynamic'; import Head from 'next/head'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { Header, NetworkSelect, SideHeader } from '@/components'; import { StakingBox } from '@/components'; @@ -25,6 +25,7 @@ import { InfoBox } from '@/components'; import { AssetsAccordian } from '@/components'; import { useAPYQuery } from '@/hooks/useQueries'; import { networks } from '@/state/chains/prod'; +import { useChain } from '@cosmos-kit/react'; const DynamicStakingBox = dynamic(() => Promise.resolve(StakingBox), { ssr: false, @@ -52,6 +53,13 @@ export default function Staking() { displayApr = 'Error'; } + const { connect, isWalletConnected } = useChain(selectedNetwork.chainName); + + useEffect(() => { + if (!isWalletConnected) connect(); + else if (isWalletConnected) return; + }, [selectedNetwork]); + const flexDirection = useBreakpointValue({ base: 'column', md: 'row' }); return ( From fab43932e0ed517dee69117a7f0689e07412634e Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Fri, 22 Dec 2023 15:59:08 -0700 Subject: [PATCH 13/40] Begin Airdrop page --- web-ui/components/Airdrop/airdropSection.tsx | 80 ++++++++++++++++++++ web-ui/components/Defi/defiBox.tsx | 3 +- web-ui/pages/airdrop.tsx | 34 +++++++++ web-ui/pages/assets.tsx | 3 + 4 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 web-ui/components/Airdrop/airdropSection.tsx create mode 100644 web-ui/pages/airdrop.tsx diff --git a/web-ui/components/Airdrop/airdropSection.tsx b/web-ui/components/Airdrop/airdropSection.tsx new file mode 100644 index 000000000..56f3d5ab3 --- /dev/null +++ b/web-ui/components/Airdrop/airdropSection.tsx @@ -0,0 +1,80 @@ +import { + Accordion, + AccordionItem, + AccordionButton, + AccordionPanel, + AccordionIcon, + Box, + Button, + Flex, + Text, + Progress, + Tooltip, + VStack, + HStack, + useColorModeValue, + Icon, +} from '@chakra-ui/react'; +import { CheckIcon, ChevronRightIcon, InfoOutlineIcon } from '@chakra-ui/icons'; + +const AirdropSection = () => { + const bgColor = useColorModeValue('white', 'gray.800'); + const textColor = useColorModeValue('gray.600', 'gray.200'); + + return ( + + + + + Cosmos Hub Active Airdrop + + + + + + + + {Array.from({ length: 5 }).map((_, index) => ( + +

+ + + Step {index + 1}: {index === 0 ? 'CLAIM INITIAL QCK AIRDROP' : 'ACTION DESCRIPTION'} + + + +

+ + {/* Replace this with actual content */} + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + ))} + +
+ + + + Participate in Other Airdrops + + + + {/* Replace these with actual chain data */} + {['OSMOSIS', 'JUNO', 'STARGAZE', 'REGEN', 'COSMOS'].map((chain) => ( + + + + {chain} + + + + ))} + + + + ); +}; + +export default AirdropSection; diff --git a/web-ui/components/Defi/defiBox.tsx b/web-ui/components/Defi/defiBox.tsx index bf423ecae..70a20a0ec 100644 --- a/web-ui/components/Defi/defiBox.tsx +++ b/web-ui/components/Defi/defiBox.tsx @@ -111,7 +111,7 @@ const actionTitles: Record = { vaults: 'Vaults', }; -const filterCategories = { +const filterCategories: Record boolean> = { All: () => true, 'Borrowing & Lending': (asset: DefiAsset) => asset.action === 'Borrow' || asset.action === 'Lend', Vaults: (asset: DefiAsset) => asset.action === 'Vaults', @@ -122,7 +122,6 @@ const filterCategories = { const DefiTable = () => { const [activeFilter, setActiveFilter] = useState('All'); - // Function to handle filter button clicks const handleFilterClick = (filter: string) => { setActiveFilter(filter); }; diff --git a/web-ui/pages/airdrop.tsx b/web-ui/pages/airdrop.tsx new file mode 100644 index 000000000..cd7e14063 --- /dev/null +++ b/web-ui/pages/airdrop.tsx @@ -0,0 +1,34 @@ +import AirdropSection from '@/components/Airdrop/airdropSection'; +import DefiTable from '@/components/Defi/defiBox'; +import { ExternalLinkIcon } from '@chakra-ui/icons'; +import { Box, Button, Container, Flex, Stack, Table, Tbody, Td, Th, Thead, Tr, Text, SlideFade } from '@chakra-ui/react'; +import Head from 'next/head'; + +export default function Home() { + return ( + <> + + + + Airdrop + + + + + Airdrop + + + + + + ); +} diff --git a/web-ui/pages/assets.tsx b/web-ui/pages/assets.tsx index 31e96cfb0..8b99c29ab 100644 --- a/web-ui/pages/assets.tsx +++ b/web-ui/pages/assets.tsx @@ -176,6 +176,9 @@ function Home() { + + Assets + {/* Quick box */} Date: Sat, 23 Dec 2023 00:46:57 -0700 Subject: [PATCH 14/40] Update Airdrop page --- web-ui/components/Airdrop/airdropSection.tsx | 77 ++++++++++++++------ 1 file changed, 54 insertions(+), 23 deletions(-) diff --git a/web-ui/components/Airdrop/airdropSection.tsx b/web-ui/components/Airdrop/airdropSection.tsx index 56f3d5ab3..6dd10f012 100644 --- a/web-ui/components/Airdrop/airdropSection.tsx +++ b/web-ui/components/Airdrop/airdropSection.tsx @@ -14,16 +14,62 @@ import { HStack, useColorModeValue, Icon, + Badge, + useDisclosure, } from '@chakra-ui/react'; -import { CheckIcon, ChevronRightIcon, InfoOutlineIcon } from '@chakra-ui/icons'; +import { CheckIcon, ChevronDownIcon, ChevronRightIcon, InfoOutlineIcon } from '@chakra-ui/icons'; +import { useAccordionStyles } from '@chakra-ui/accordion'; +import { useState } from 'react'; + +interface AirdropAccordionItemProps { + index: number; + defaultIsOpen?: boolean; +} + +const AirdropAccordionItem: React.FC = ({ index, defaultIsOpen }) => { + const { isOpen, onToggle } = useDisclosure({ defaultIsOpen }); + + return ( + +

+ + + {index + 1} + + + {index === 0 ? 'CLAIM INITIAL QCK AIRDROP' : 'ACTION DESCRIPTION'} + + + +

+ {isOpen && ( + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + )} +
+ ); +}; const AirdropSection = () => { - const bgColor = useColorModeValue('white', 'gray.800'); - const textColor = useColorModeValue('gray.600', 'gray.200'); + const { isOpen, onToggle } = useDisclosure(); return ( - + Cosmos Hub Active Airdrop @@ -33,26 +79,13 @@ const AirdropSection = () => { - + {Array.from({ length: 5 }).map((_, index) => ( - -

- - - Step {index + 1}: {index === 0 ? 'CLAIM INITIAL QCK AIRDROP' : 'ACTION DESCRIPTION'} - - - -

- - {/* Replace this with actual content */} - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - -
+ ))}
- + Participate in Other Airdrops @@ -63,9 +96,7 @@ const AirdropSection = () => { {['OSMOSIS', 'JUNO', 'STARGAZE', 'REGEN', 'COSMOS'].map((chain) => ( - - {chain} - + {chain} From 8c024da39d4d7e3367fe9fb6d677920b34f97e14 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Mon, 25 Dec 2023 00:42:11 -0700 Subject: [PATCH 15/40] Add more testnet endpoints --- web-ui/.env.development | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/web-ui/.env.development b/web-ui/.env.development index c48665a31..16be390d1 100644 --- a/web-ui/.env.development +++ b/web-ui/.env.development @@ -1,17 +1,17 @@ NEXT_PUBLIC_CHAIN_ENV="testnet" -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_QUICKSILVER="http://lcd.quicksilver.zone/" -NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_QUICKSILVER="http://rpc.quicksilver.zone/" -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB=http://lcd.cosmoshub-4.quicksilver.zone +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_QUICKSILVER="http://lcd.test.quicksilver.zone/" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_QUICKSILVER="http://rpc.test.quicksilver.zone/" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB=http://lcd.provider.test.quicksilver.zone NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_COSMOSHUB=http://rpc.cosmoshub-4.quicksilver.zone NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS="http://lcd.osmosis-1.quicksilver.zone" NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_OSMOSIS="http://rpc.osmosis-1.quicksilver.zone" -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_STARGAZE="http://lcd.stargaze-1.quicksilver.zone" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_STARGAZE="http://lcd.elgafar-1.test.quicksilver.zone" NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_STARGAZE="http://rpc.stargaze-1.quicksilver.zone" -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_REGEN="http://lcd.regen-1.quicksilver.zone" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_REGEN="http://lcd.regen-redwood-1.test.quicksilver.zone" NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_REGEN="http://rpc.regen-1.quicksilver.zone" NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_SOMMELIER="http://lcd.sommelier-3.quicksilver.zone" NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_SOMMELIER="http://rpc.sommelier-3.quicksilver.zone" -NEXT_PUBLIC_QUICKSILVER_API="http://lcd.quicksilver.zone" +NEXT_PUBLIC_QUICKSILVER_API="http://lcd.test.quicksilver.zone" NEXT_PUBLIC_QUICKSILVER_DATA_API="http://data.quicksilver.zone" ZONE_URL="quicksilver.zone" REACT_APP_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" From 65f30afcbc1ccb51d6cc42f6e7e8171352e78d94 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 26 Dec 2023 13:26:13 -0700 Subject: [PATCH 16/40] - Add osmosis testnet, - Add validaotr logos to stkaing box --- web-ui/.env.development | 28 +++++------ .../modals/validatorSelectionModal.tsx | 3 ++ .../Staking/modals/validatorTable.tsx | 47 +++++++++++++++++-- web-ui/hooks/useValidatorData.ts | 16 +++++++ web-ui/utils/staking.ts | 2 +- 5 files changed, 77 insertions(+), 19 deletions(-) diff --git a/web-ui/.env.development b/web-ui/.env.development index 16be390d1..4e70807c1 100644 --- a/web-ui/.env.development +++ b/web-ui/.env.development @@ -1,18 +1,18 @@ NEXT_PUBLIC_CHAIN_ENV="testnet" -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_QUICKSILVER="http://lcd.test.quicksilver.zone/" -NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_QUICKSILVER="http://rpc.test.quicksilver.zone/" -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB=http://lcd.provider.test.quicksilver.zone -NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_COSMOSHUB=http://rpc.cosmoshub-4.quicksilver.zone -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS="http://lcd.osmosis-1.quicksilver.zone" -NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_OSMOSIS="http://rpc.osmosis-1.quicksilver.zone" -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_STARGAZE="http://lcd.elgafar-1.test.quicksilver.zone" -NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_STARGAZE="http://rpc.stargaze-1.quicksilver.zone" -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_REGEN="http://lcd.regen-redwood-1.test.quicksilver.zone" -NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_REGEN="http://rpc.regen-1.quicksilver.zone" -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_SOMMELIER="http://lcd.sommelier-3.quicksilver.zone" -NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_SOMMELIER="http://rpc.sommelier-3.quicksilver.zone" -NEXT_PUBLIC_QUICKSILVER_API="http://lcd.test.quicksilver.zone" -NEXT_PUBLIC_QUICKSILVER_DATA_API="http://data.quicksilver.zone" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_QUICKSILVER="https://lcd.test.quicksilver.zone/" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_QUICKSILVER="https://rpc.test.quicksilver.zone/" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB=https://lcd.cosmoshub-4.quicksilver.zone +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_COSMOSHUB=https://rpc.provider.test.quicksilver.zone +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS="https://lcd.osmo-test-5.test.quicksilver.zone/" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_OSMOSIS="https://rpc.osmo-test-5.test.quicksilver.zone/" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_STARGAZE="https://lcd.elgafar-1.test.quicksilver.zone" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_STARGAZE="https://rpc.elgafar-1.test.quicksilver.zone" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_REGEN="https://lcd.regen-redwood-1.test.quicksilver.zone" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_REGEN="https://rpc.regen-redwood-1.test.quicksilver.zone" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_SOMMELIER="https://lcd.sommelier-3.quicksilver.zone" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_SOMMELIER="https://rpc.sommelier-3.quicksilver.zone" +NEXT_PUBLIC_QUICKSILVER_API="https://lcd.test.quicksilver.zone" +NEXT_PUBLIC_QUICKSILVER_DATA_API="https://data.test.quicksilver.zone" ZONE_URL="quicksilver.zone" REACT_APP_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" REACT_APP_ENABLE_UNBONDING="true" diff --git a/web-ui/components/Staking/modals/validatorSelectionModal.tsx b/web-ui/components/Staking/modals/validatorSelectionModal.tsx index 46f99ee9b..7e6b15c19 100644 --- a/web-ui/components/Staking/modals/validatorSelectionModal.tsx +++ b/web-ui/components/Staking/modals/validatorSelectionModal.tsx @@ -26,6 +26,7 @@ import { FaSearch } from 'react-icons/fa'; import { ValidatorsTable } from './validatorTable'; import { useValidatorsQuery, useZoneQuery } from '@/hooks/useQueries'; +import { useValidatorLogos } from '@/hooks'; interface MultiModalProps { isOpen: boolean; @@ -48,6 +49,7 @@ export const MultiModal: React.FC = ({ const [searchTerm, setSearchTerm] = React.useState(''); const { validatorsData, isLoading, isError } = useValidatorsQuery(selectedChainName); + const { data: logos, isLoading: isFetchingLogos } = useValidatorLogos(selectedChainName, validatorsData || []); const validators = validatorsData; const handleValidatorClick = (validator: { name: string; operatorAddress: string }) => { @@ -184,6 +186,7 @@ export const MultiModal: React.FC = ({ { const isSelected = selectedValidators.some((v) => v.name === validator.name); diff --git a/web-ui/components/Staking/modals/validatorTable.tsx b/web-ui/components/Staking/modals/validatorTable.tsx index 9be9e24da..19701ad00 100644 --- a/web-ui/components/Staking/modals/validatorTable.tsx +++ b/web-ui/components/Staking/modals/validatorTable.tsx @@ -1,4 +1,18 @@ -import { Box, Table, TableCaption, Tbody, Td, Th, Thead, Tr, Flex, TableContainer } from '@chakra-ui/react'; +import { + Box, + Table, + TableCaption, + Tbody, + Td, + Th, + Thead, + Tr, + Flex, + TableContainer, + Image, + SkeletonText, + SkeletonCircle, +} from '@chakra-ui/react'; import React from 'react'; import { ParsedValidator as Validator } from '@/utils'; @@ -8,7 +22,8 @@ export const ValidatorsTable: React.FC<{ onValidatorClick: (validator: { name: string; operatorAddress: string }) => void; selectedValidators: { name: string; operatorAddress: string }[]; searchTerm?: string; -}> = ({ validators, onValidatorClick, selectedValidators, searchTerm }) => { + logos: any; +}> = ({ validators, onValidatorClick, selectedValidators, searchTerm, logos }) => { const [sortedValidators, setSortedValidators] = React.useState([]); const [sortBy, setSortBy] = React.useState(null); const [sortOrder, setSortOrder] = React.useState<'asc' | 'desc'>('asc'); @@ -149,7 +164,7 @@ export const ValidatorsTable: React.FC<{ {sortedValidators.map((validator, index) => { const votingPowerPercentage = totalVotingPower > 0 ? ((validator.votingPower || 0) / totalVotingPower) * 100 : 0; - + const validatorLogo = logos[validator.address]; return ( + {!validatorLogo && ( + + )} + {validatorLogo && ( + {validator.name} + )} {(validator.name.length || 0) > 20 ? validator.name.substring(0, 14) || '' + '...' : validator.name || ''} diff --git a/web-ui/hooks/useValidatorData.ts b/web-ui/hooks/useValidatorData.ts index b3821e4e9..64987dddd 100644 --- a/web-ui/hooks/useValidatorData.ts +++ b/web-ui/hooks/useValidatorData.ts @@ -3,9 +3,11 @@ import { cosmos } from 'interchain-query'; import { useEffect, useMemo, useState } from 'react'; import { parseValidators } from '@/utils/staking'; +import { ExtendedValidator, getLogoUrls } from '@/utils'; import { useQueryHooks } from './useQueryHooks'; import { useRpcQueryClient } from './useRpcQueryClient'; +import { useQuery } from '@tanstack/react-query'; (BigInt.prototype as any).toJSON = function () { return this.toString(); @@ -73,3 +75,17 @@ export const useValidatorData = (chainName: string) => { refetch, }; }; + +export const useValidatorLogos = ( + chainName: string, + validators: ExtendedValidator[] +) => { + const { data, isLoading } = useQuery({ + queryKey: ['validatorLogos', chainName], + queryFn: () => getLogoUrls(validators, chainName), + enabled: validators.length > 0, + staleTime: Infinity, + }); + + return { data, isLoading }; +}; \ No newline at end of file diff --git a/web-ui/utils/staking.ts b/web-ui/utils/staking.ts index 71b94fbeb..5f368033c 100644 --- a/web-ui/utils/staking.ts +++ b/web-ui/utils/staking.ts @@ -76,7 +76,7 @@ export const extendValidators = (validators: ParsedValidator[] = [], chainMetada return { ...validator, - apr, + }; }); }; From df452bdf1690f464298b24f409348ed2343b0aa8 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 27 Dec 2023 13:36:42 -0700 Subject: [PATCH 17/40] add missed blocks counter query --- web-ui/bun.lockb | Bin 420225 -> 420988 bytes .../modals/validatorSelectionModal.tsx | 18 +- .../Staking/modals/validatorTable.tsx | 166 +++++++++++------- web-ui/hooks/index.ts | 2 +- web-ui/hooks/useQueries.ts | 64 ++++++- web-ui/hooks/useValidatorData.ts | 91 ---------- web-ui/package.json | 2 + web-ui/utils/staking.ts | 45 ++++- 8 files changed, 217 insertions(+), 171 deletions(-) delete mode 100644 web-ui/hooks/useValidatorData.ts diff --git a/web-ui/bun.lockb b/web-ui/bun.lockb index 436599ac950022588e32dc4aebfb82b5fde4a76a..e47e0f751c03847fd11218f1d262ab6ee025c621 100755 GIT binary patch delta 89519 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 Mh$K1VZa?M!0J4b)+5i9m diff --git a/web-ui/components/Staking/modals/validatorSelectionModal.tsx b/web-ui/components/Staking/modals/validatorSelectionModal.tsx index 7e6b15c19..16cbb1d73 100644 --- a/web-ui/components/Staking/modals/validatorSelectionModal.tsx +++ b/web-ui/components/Staking/modals/validatorSelectionModal.tsx @@ -19,6 +19,7 @@ import { Spinner, InputGroup, InputLeftElement, + Link, } from '@chakra-ui/react'; import React, { useEffect } from 'react'; import { FaSearch } from 'react-icons/fa'; @@ -26,7 +27,7 @@ import { FaSearch } from 'react-icons/fa'; import { ValidatorsTable } from './validatorTable'; import { useValidatorsQuery, useZoneQuery } from '@/hooks/useQueries'; -import { useValidatorLogos } from '@/hooks'; +import { useMissedBlocks, useValidatorLogos } from '@/hooks/useQueries'; interface MultiModalProps { isOpen: boolean; @@ -49,6 +50,9 @@ export const MultiModal: React.FC = ({ const [searchTerm, setSearchTerm] = React.useState(''); const { validatorsData, isLoading, isError } = useValidatorsQuery(selectedChainName); + console.log(validatorsData); + const { missedBlocksData } = useMissedBlocks(selectedChainName); + console.log(missedBlocksData); const { data: logos, isLoading: isFetchingLogos } = useValidatorLogos(selectedChainName, validatorsData || []); const validators = validatorsData; @@ -106,7 +110,8 @@ export const MultiModal: React.FC = ({ Choose which validator(s) you would like to liquid stake to. You can select from the list below or utilize the quick - select to pick the highest ranked validators. To learn more about rainkings click here. + select to pick the highest ranked validators. To learn more about rankings read the{' '} + Validator Selection Doc. @@ -116,7 +121,7 @@ export const MultiModal: React.FC = ({ {isLoading ? ( - + ) : ( @@ -212,7 +217,12 @@ export const MultiModal: React.FC = ({ )} - {selectedValidators.length} / 8 Validators Selected + <> + + {selectedValidators.length} + + {' / 8 Validators Selected'} + diff --git a/web-ui/components/Staking/modals/validatorTable.tsx b/web-ui/components/Staking/modals/validatorTable.tsx index 19701ad00..747fe1987 100644 --- a/web-ui/components/Staking/modals/validatorTable.tsx +++ b/web-ui/components/Staking/modals/validatorTable.tsx @@ -12,6 +12,7 @@ import { Image, SkeletonText, SkeletonCircle, + Tooltip, } from '@chakra-ui/react'; import React from 'react'; @@ -130,7 +131,9 @@ export const ValidatorsTable: React.FC<{ cursor: 'pointer', }} > - Moniker + + Moniker + - Commission + + Commission + - Missed + + Missed + + - VP + + VP + - {sortedValidators.map((validator, index) => { - const votingPowerPercentage = totalVotingPower > 0 ? ((validator.votingPower || 0) / totalVotingPower) * 100 : 0; - const validatorLogo = logos[validator.address]; - return ( - - onValidatorClick({ - name: validator.name || '', - operatorAddress: validator.address || '', - }) - } - backgroundColor={selectedValidators.some((v) => v.name === validator.name) ? 'rgba(255, 128, 0, 0.25)' : 'transparent'} - style={{ maxHeight: '50px' }} - > - - {!validatorLogo && ( - - )} - {validatorLogo && ( - {validator.name} - )} - {(validator.name.length || 0) > 20 ? validator.name.substring(0, 14) || '' + '...' : validator.name || ''} - - - {validator.commission ? validator.commission : 'N/A'} - - {} - - {`${votingPowerPercentage.toFixed(2)}%`} - - - ); - })} + {sortedValidators.length === 0 + ? Array.from({ length: 5 }).map((_, index) => ( + + + + + + + + + + + + + + + + )) + : sortedValidators.map((validator, index) => { + const votingPowerPercentage = totalVotingPower > 0 ? ((validator.votingPower || 0) / totalVotingPower) * 100 : 0; + const validatorLogo = logos[validator.address]; + return ( + + onValidatorClick({ + name: validator.name || '', + operatorAddress: validator.address || '', + }) + } + backgroundColor={ + selectedValidators.some((v) => v.name === validator.name) ? 'rgba(255, 128, 0, 0.25)' : 'transparent' + } + style={{ maxHeight: '50px' }} + > + + {!validatorLogo && ( + + )} + {validatorLogo && ( + {validator.name} + )} + {(validator.name.length || 0) > 20 ? validator.name.substring(0, 14) || '' + '...' : validator.name || ''} + + + {validator.commission ? validator.commission : 'N/A'} + + {} + + {`${votingPowerPercentage.toFixed(2)}%`} + + + ); + })} diff --git a/web-ui/hooks/index.ts b/web-ui/hooks/index.ts index fb75baa60..1db3f723b 100644 --- a/web-ui/hooks/index.ts +++ b/web-ui/hooks/index.ts @@ -3,4 +3,4 @@ export * from './useToaster'; export * from './useQueryHooks'; export * from './useVotingData'; export * from './useRpcQueryClient'; -export * from './useValidatorData'; + diff --git a/web-ui/hooks/useQueries.ts b/web-ui/hooks/useQueries.ts index 0dc8ab3c7..3b1731f91 100644 --- a/web-ui/hooks/useQueries.ts +++ b/web-ui/hooks/useQueries.ts @@ -6,8 +6,8 @@ import { cosmos } from 'interchain-query'; import { useGrpcQueryClient } from './useGrpcQueryClient'; -import { getCoin } from '@/utils'; -import { parseValidators } from '@/utils/staking'; +import { getCoin, getLogoUrls } from '@/utils'; +import { ExtendedValidator, parseValidators } from '@/utils/staking'; const BigNumber = require('bignumber.js'); @@ -318,3 +318,63 @@ export const useZoneQuery = (chainId: string) => { } ); }; + +export const useValidatorLogos = ( + chainName: string, + validators: ExtendedValidator[] +) => { + const { data, isLoading } = useQuery({ + queryKey: ['validatorLogos', chainName], + queryFn: () => getLogoUrls(validators, chainName), + enabled: validators.length > 0, + staleTime: Infinity, + }); + + return { data, isLoading }; +}; + +export const useMissedBlocks = (chainName: string) => { + const { grpcQueryClient } = useGrpcQueryClient(chainName); + + const fetchMissedBlocks = async () => { + if (!grpcQueryClient) { + throw new Error('RPC Client not ready'); + } + + let allMissedBlocks: any[] = []; + let nextKey = new Uint8Array(); + + do { + const response = await grpcQueryClient.cosmos.slashing.v1beta1.signingInfos({ + pagination: { + key: nextKey, + offset: Long.fromNumber(0), + limit: Long.fromNumber(100), + countTotal: true, + reverse: false, + }, + }); + + allMissedBlocks = allMissedBlocks.concat(response.info); + nextKey = response.pagination.next_key; + } while (nextKey && nextKey.length > 0); + + return allMissedBlocks; + }; + + const missedBlocksQuery = useQuery({ + queryKey: ['missedBlocks', chainName], + queryFn: fetchMissedBlocks, + enabled: !!grpcQueryClient, + staleTime: Infinity, + onError: (error) => { + console.error('Error in fetching Missed Blocks:', error); + }, + }); + + return { + missedBlocksData: missedBlocksQuery.data, + isLoading: missedBlocksQuery.isLoading, + isError: missedBlocksQuery.isError, + }; +}; \ No newline at end of file diff --git a/web-ui/hooks/useValidatorData.ts b/web-ui/hooks/useValidatorData.ts deleted file mode 100644 index 64987dddd..000000000 --- a/web-ui/hooks/useValidatorData.ts +++ /dev/null @@ -1,91 +0,0 @@ -import BigNumber from 'bignumber.js'; -import { cosmos } from 'interchain-query'; -import { useEffect, useMemo, useState } from 'react'; - -import { parseValidators } from '@/utils/staking'; -import { ExtendedValidator, getLogoUrls } from '@/utils'; - -import { useQueryHooks } from './useQueryHooks'; -import { useRpcQueryClient } from './useRpcQueryClient'; -import { useQuery } from '@tanstack/react-query'; - -(BigInt.prototype as any).toJSON = function () { - return this.toString(); -}; - -export const useValidatorData = (chainName: string) => { - const [isLoading, setIsLoading] = useState(false); - - const { rpcQueryClient } = useRpcQueryClient(chainName); - - const { cosmosQuery, isReady } = useQueryHooks(chainName); - - const validatorsQuery = cosmosQuery.staking.v1beta1.useValidators({ - request: { - status: cosmos.staking.v1beta1.bondStatusToJSON(cosmos.staking.v1beta1.BondStatus.BOND_STATUS_BONDED), - pagination: { - key: new Uint8Array(), - offset: 0n, - limit: 200n, - countTotal: true, - reverse: false, - }, - }, - options: { - queryKey: ['validators', chainName], - enabled: !!rpcQueryClient?.cosmos?.staking?.v1beta1.validator, - select: ({ validators }) => { - const sorted = validators.sort((a, b) => new BigNumber(b.tokens).minus(a.tokens).toNumber()); - return parseValidators(sorted); - }, - onError: (error) => { - console.error('Error fetching validators:', error); - validatorsQuery.remove(); - validatorsQuery.refetch(); - }, - }, - }); - - const loading = validatorsQuery.isFetching || !isReady; - - useEffect(() => { - setIsLoading(loading); - }, [loading]); - - type SingleQueriesData = { - validators: NonNullable<(typeof validatorsQuery)['data']>; - }; - - const singleQueriesData = useMemo(() => { - if (validatorsQuery.isFetching || !isReady) return; - return { - validators: validatorsQuery.data, - } as SingleQueriesData; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [validatorsQuery.isFetching, isReady]); - - const refetch = () => { - validatorsQuery.remove(); - validatorsQuery.refetch(); - }; - - return { - data: singleQueriesData, - isLoading, - refetch, - }; -}; - -export const useValidatorLogos = ( - chainName: string, - validators: ExtendedValidator[] -) => { - const { data, isLoading } = useQuery({ - queryKey: ['validatorLogos', chainName], - queryFn: () => getLogoUrls(validators, chainName), - enabled: validators.length > 0, - staleTime: Infinity, - }); - - return { data, isLoading }; -}; \ No newline at end of file diff --git a/web-ui/package.json b/web-ui/package.json index cdd1f937f..af664f6e2 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -33,12 +33,14 @@ "@radix-ui/react-icons": "^1.3.0", "@tanstack/react-query": "^4.29.12", "@tanstack/react-query-devtools": "^4.35.0", + "@types/crypto-js": "^4.2.1", "bech32": "^2.0.0", "bun": "^1.0.3", "bun-framework-next": "latest", "chain-registry": "1.19.0", "chakra-react-select": "^4.7.6", "cosmjs-types": "0.5.0", + "crypto-js": "^4.2.0", "dayjs": "^1.11.9", "fast-fuzzy": "^1.12.0", "framer-motion": "9.0.7", diff --git a/web-ui/utils/staking.ts b/web-ui/utils/staking.ts index 5f368033c..f3cc71c78 100644 --- a/web-ui/utils/staking.ts +++ b/web-ui/utils/staking.ts @@ -4,8 +4,17 @@ import { QueryDelegationTotalRewardsResponse } from 'interchain-query/cosmos/dis import { QueryAnnualProvisionsResponse } from 'interchain-query/cosmos/mint/v1beta1/query'; import { QueryDelegatorDelegationsResponse, QueryParamsResponse } from 'interchain-query/cosmos/staking/v1beta1/query'; import { Pool, Validator } from 'interchain-query/cosmos/staking/v1beta1/staking'; +import * as bech32 from 'bech32'; +import * as CryptoJS from 'crypto-js'; import { decodeUint8Arr, isGreaterThanZero, shiftDigits, toNumber } from '.'; +import { Any } from 'interchain-query/google/protobuf/any'; + +interface ConsensusPubkey { + '@type': string; + key: string; +} + const DAY_TO_SECONDS = 24 * 60 * 60; const ZERO = '0'; @@ -30,27 +39,53 @@ export const calcStakingApr = ({ pool, commission, communityTax, annualProvision export type ParsedValidator = ReturnType[0]; +function extractValconsPrefix(operatorAddress: string): string { + const prefixEndIndex = operatorAddress.indexOf('valoper'); + const chainPrefix = operatorAddress.substring(0, prefixEndIndex); + return `${chainPrefix}valcons`; +} + + export const parseValidators = (validators: Validator[]) => { return validators.map((validator) => { - const commissionRate = validator.commission?.commission_rates?.rate || ZERO; - - - // If you need to convert to percentage, for example const commissionPercentage = parseFloat(commissionRate) * 100; + const valconsPrefix = extractValconsPrefix(validator.operator_address); + const valconsAddress = getValconsAddress(validator.consensus_pubkey, valconsPrefix); return { + consensusPubkey: validator.consensus_pubkey || '', + valconsAddress, description: validator.description?.details || '', name: validator.description?.moniker || '', identity: validator.description?.identity || '', address: validator.operator_address || '', - commission: commissionPercentage.toFixed() + '%', // Assuming you want to display as percentage + commission: commissionPercentage.toFixed() + '%', votingPower: toNumber(shiftDigits(validator.tokens, -6, 0), 0), }; }); }; + +function getValconsAddress(consensusPubkeyAny: any, valconsPrefix: string) { + const consensusPubkey = consensusPubkeyAny as ConsensusPubkey; + + if (!consensusPubkey || !consensusPubkey.key) { + return ''; + } + + const consensusPubkeyBytes = new Uint8Array(consensusPubkeyAny!.value); + const decoded = Buffer.from(consensusPubkeyBytes).toString('base64'); + + const bytes = CryptoJS.enc.Base64.parse(decoded); + + const valconsWords: number[] = bech32.bech32.toWords(Array.from(new Uint8Array(bytes.words))); + const valconsAddress: string = bech32.bech32.encode(valconsPrefix, valconsWords); + + return valconsAddress; +} + export type ExtendedValidator = ReturnType[0]; export type ChainMetaData = { From f2dd4dfe5efe3f58919535c9f3530b63c6cb0b81 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Thu, 28 Dec 2023 12:48:11 -0700 Subject: [PATCH 18/40] remove missed blocks from validator table --- web-ui/components/Assets/assetsGrid.tsx | 59 +++++---- web-ui/components/Assets/unbondingTable.tsx | 99 ++++++++++----- .../modals/validatorSelectionModal.tsx | 2 +- .../Staking/modals/validatorTable.tsx | 11 +- web-ui/hooks/useQueries.ts | 20 ++- web-ui/pages/assets.tsx | 117 +++++++++++------- web-ui/utils/staking.ts | 51 +++++--- 7 files changed, 222 insertions(+), 137 deletions(-) diff --git a/web-ui/components/Assets/assetsGrid.tsx b/web-ui/components/Assets/assetsGrid.tsx index 2b4fcb876..459d12ac6 100644 --- a/web-ui/components/Assets/assetsGrid.tsx +++ b/web-ui/components/Assets/assetsGrid.tsx @@ -22,16 +22,6 @@ interface AssetGridProps { } const AssetCard: React.FC = ({ assetName, balance, apy, nativeAssetName, isWalletConnected }) => { - if (!isWalletConnected) { - return ( - - - Wallet is not connected. Please connect your wallet to interact with your QCK tokens. - - - ); - } - if (!balance || !apy) { return ( = ({ assets, isWalletConnected }) => qAssets - - - {assets.map((asset, index) => ( - - {' '} - - - ))} + {!isWalletConnected && ( + + + Wallet is not connected! Please connect your wallet to interact with your qAssets. + - + )} + {isWalletConnected && ( + + + {assets.map((asset, index) => ( + + {' '} + + + ))} + + + )} ); }; diff --git a/web-ui/components/Assets/unbondingTable.tsx b/web-ui/components/Assets/unbondingTable.tsx index 5bf42b026..6f1f019a3 100644 --- a/web-ui/components/Assets/unbondingTable.tsx +++ b/web-ui/components/Assets/unbondingTable.tsx @@ -1,12 +1,13 @@ import { useUnbondingQuery } from '@/hooks/useQueries'; -import { Table, Thead, Tbody, Tr, Th, Td, TableContainer, Text, Box } from '@chakra-ui/react'; +import { Table, Thead, Tbody, Tr, Th, Td, TableContainer, Text, Box, Flex } from '@chakra-ui/react'; interface UnbondingAssetsTableProps { address: string; chainName: string; + isWalletConnected: boolean; } -const UnbondingAssetsTable: React.FC = ({ address, chainName }) => { +const UnbondingAssetsTable: React.FC = ({ address, chainName, isWalletConnected }) => { const unbondingAssets = [ { asset: '10 ATOM', @@ -43,34 +44,74 @@ const UnbondingAssetsTable: React.FC = ({ address, ch Current Unbonding Assets - - - - - - - - - - - - - - {unbondingAssets.map((asset, index) => ( - - - - - - + {!isWalletConnected && ( + + + Wallet is not connected! Please connect your wallet to view your unbondng assets. + + + )} + {unbondingData?.withdrawals.length === 0 && ( + + + You have no unbonding assets. + + + )} + {isWalletConnected && ( + + +
AssetStatusRedemption AmountUnstaked OnCompletion Time
- {asset.asset} - {asset.status}{asset.redemptionAmount}{asset.unstakedOn}{asset.completionTime}
+ + + + + + + - ))} - -
AssetStatusRedemption AmountUnstaked OnCompletion Time
-
-
+ + + {unbondingAssets.map((asset, index) => ( + + + {asset.asset} + + {asset.status} + {asset.redemptionAmount} + {asset.unstakedOn} + {asset.completionTime} + + ))} + + + +
+ )} ); }; diff --git a/web-ui/components/Staking/modals/validatorSelectionModal.tsx b/web-ui/components/Staking/modals/validatorSelectionModal.tsx index 16cbb1d73..0122d169c 100644 --- a/web-ui/components/Staking/modals/validatorSelectionModal.tsx +++ b/web-ui/components/Staking/modals/validatorSelectionModal.tsx @@ -50,7 +50,7 @@ export const MultiModal: React.FC = ({ const [searchTerm, setSearchTerm] = React.useState(''); const { validatorsData, isLoading, isError } = useValidatorsQuery(selectedChainName); - console.log(validatorsData); + const { missedBlocksData } = useMissedBlocks(selectedChainName); console.log(missedBlocksData); const { data: logos, isLoading: isFetchingLogos } = useValidatorLogos(selectedChainName, validatorsData || []); diff --git a/web-ui/components/Staking/modals/validatorTable.tsx b/web-ui/components/Staking/modals/validatorTable.tsx index 747fe1987..0e02884cd 100644 --- a/web-ui/components/Staking/modals/validatorTable.tsx +++ b/web-ui/components/Staking/modals/validatorTable.tsx @@ -149,11 +149,6 @@ export const ValidatorsTable: React.FC<{ Commission - - - Missed - - - - - + @@ -249,7 +242,7 @@ export const ValidatorsTable: React.FC<{ {validator.commission ? validator.commission : 'N/A'} - {} + {`${votingPowerPercentage.toFixed(2)}%`} diff --git a/web-ui/hooks/useQueries.ts b/web-ui/hooks/useQueries.ts index 3b1731f91..f1d7474ef 100644 --- a/web-ui/hooks/useQueries.ts +++ b/web-ui/hooks/useQueries.ts @@ -340,10 +340,10 @@ export const useMissedBlocks = (chainName: string) => { if (!grpcQueryClient) { throw new Error('RPC Client not ready'); } - + let allMissedBlocks: any[] = []; let nextKey = new Uint8Array(); - + do { const response = await grpcQueryClient.cosmos.slashing.v1beta1.signingInfos({ pagination: { @@ -354,14 +354,22 @@ export const useMissedBlocks = (chainName: string) => { reverse: false, }, }); - - allMissedBlocks = allMissedBlocks.concat(response.info); + + // Filter out entries without an address + const filteredMissedBlocks = response.info.filter(block => { + const hasAddress = block.address && block.address.trim() !== ''; + const notTombstoned = !block.tombstoned; + const notJailed = new Date(block.jailed_until) <= new Date(); // Check if jailed_until is in the past + return hasAddress && notTombstoned && notJailed; + }); + + allMissedBlocks = allMissedBlocks.concat(filteredMissedBlocks); nextKey = response.pagination.next_key; } while (nextKey && nextKey.length > 0); - + return allMissedBlocks; }; - + const missedBlocksQuery = useQuery({ queryKey: ['missedBlocks', chainName], queryFn: fetchMissedBlocks, diff --git a/web-ui/pages/assets.tsx b/web-ui/pages/assets.tsx index 8b99c29ab..98637badc 100644 --- a/web-ui/pages/assets.tsx +++ b/web-ui/pages/assets.tsx @@ -180,53 +180,74 @@ function Home() { Assets - {/* Quick box */} - - - - {/* Portfolio box */} - - - - {/* Intent box */} - - - + {!isWalletConnected && ( + + + Wallet is not connected! Please connect your wallet to view the Assets Section. + + + )} + {isWalletConnected && ( + <> + + + + + + + + + + + + )} {/* Assets Grid */} @@ -234,7 +255,7 @@ function Home() { {/* Unbonding Table */} - +
diff --git a/web-ui/utils/staking.ts b/web-ui/utils/staking.ts index f3cc71c78..b6c912618 100644 --- a/web-ui/utils/staking.ts +++ b/web-ui/utils/staking.ts @@ -8,12 +8,8 @@ import * as bech32 from 'bech32'; import * as CryptoJS from 'crypto-js'; import { decodeUint8Arr, isGreaterThanZero, shiftDigits, toNumber } from '.'; -import { Any } from 'interchain-query/google/protobuf/any'; - -interface ConsensusPubkey { - '@type': string; - key: string; -} +import { Any } from 'cosmjs-types/google/protobuf/any'; +import { AnySDKType } from 'interchain-query/google/protobuf/any'; const DAY_TO_SECONDS = 24 * 60 * 60; @@ -67,25 +63,30 @@ export const parseValidators = (validators: Validator[]) => { }); }; - -function getValconsAddress(consensusPubkeyAny: any, valconsPrefix: string) { - const consensusPubkey = consensusPubkeyAny as ConsensusPubkey; - - if (!consensusPubkey || !consensusPubkey.key) { - return ''; +function getValconsAddress(consensus_pubkey: any, valconsPrefix: string) { + if (!consensus_pubkey || typeof consensus_pubkey.key !== 'string') { + console.error('Invalid or missing consensus public key'); + return ''; } - const consensusPubkeyBytes = new Uint8Array(consensusPubkeyAny!.value); - const decoded = Buffer.from(consensusPubkeyBytes).toString('base64'); + try { + // Decode the Base64 key directly to bytes + const decoded = Buffer.from(consensus_pubkey.key, 'base64'); + + // Convert bytes to Bech32 words + const valconsWords = bech32.bech32.toWords(new Uint8Array(decoded)); - const bytes = CryptoJS.enc.Base64.parse(decoded); - - const valconsWords: number[] = bech32.bech32.toWords(Array.from(new Uint8Array(bytes.words))); - const valconsAddress: string = bech32.bech32.encode(valconsPrefix, valconsWords); + // Encode to Bech32 with the given prefix + const valconsAddress = bech32.bech32.encode(valconsPrefix, valconsWords); - return valconsAddress; + return valconsAddress; + } catch (error) { + console.error('Error in generating valcons address:', error); + return ''; + } } + export type ExtendedValidator = ReturnType[0]; export type ChainMetaData = { @@ -163,3 +164,15 @@ export const parseAnnualProvisions = (data: QueryAnnualProvisionsResponse) => { const res = shiftDigits(decodeUint8Arr(data?.annualProvisions), -18); return isGreaterThanZero(res) ? res : null; }; +function wordArrayToUint8Array(wordArray: CryptoJS.lib.WordArray) { + const words = wordArray.words; + const sigBytes = wordArray.sigBytes; + const u8 = new Uint8Array(sigBytes); + + for (let i = 0; i < sigBytes; i++) { + const byte = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + u8[i] = byte; + } + + return u8; +} \ No newline at end of file From ff4b54568bc314439ce85a871af926a9889f893b Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Thu, 28 Dec 2023 13:15:40 -0700 Subject: [PATCH 19/40] rough dev mode --- web-ui/.env.development | 9 +++- web-ui/.env.production | 7 ++- .../modals/validatorSelectionModal.tsx | 1 - .../Staking/networkSelectButton.tsx | 4 +- web-ui/pages/assets.tsx | 41 +++++++++-------- web-ui/pages/staking.tsx | 4 +- web-ui/state/chains/prod.ts | 44 +++++++++++++++++++ 7 files changed, 86 insertions(+), 24 deletions(-) diff --git a/web-ui/.env.development b/web-ui/.env.development index 4e70807c1..f6315424c 100644 --- a/web-ui/.env.development +++ b/web-ui/.env.development @@ -1,7 +1,7 @@ NEXT_PUBLIC_CHAIN_ENV="testnet" NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_QUICKSILVER="https://lcd.test.quicksilver.zone/" NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_QUICKSILVER="https://rpc.test.quicksilver.zone/" -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB=https://lcd.cosmoshub-4.quicksilver.zone +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB=https://lcd.provider.test.quicksilver.zone NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_COSMOSHUB=https://rpc.provider.test.quicksilver.zone NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS="https://lcd.osmo-test-5.test.quicksilver.zone/" NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_OSMOSIS="https://rpc.osmo-test-5.test.quicksilver.zone/" @@ -21,4 +21,9 @@ REACT_APP_ENABLE_CLAIMS="true" APY_ZONES_ENDPOINT = "https://chains.cosmos.directory" NEXT_PUBLIC_OSMOSIS_API="https://api.osmosis.zone" NEXT_PUBLIC_WHITELISTED_DENOM="uatom,ustars,uosmo,usomm,uregen" -NEXT_PUBLIC_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" \ No newline at end of file +NEXT_PUBLIC_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" +NEXT_PUBLIC_COSMOSHUB_CHAIN_ID=provider +NEXT_PUBLIC_OSMOSIS_CHAIN_ID=osmo-test-5 +NEXT_PUBLIC_STARGAZE_CHAIN_ID=elgafar-1 +NEXT_PUBLIC_REGEN_CHAIN_ID=regen-redwood-1 +NEXT_PUBLIC_SOMMELIER_CHAIN_ID=sommelier-3 \ No newline at end of file diff --git a/web-ui/.env.production b/web-ui/.env.production index a41eed525..b4428c9da 100644 --- a/web-ui/.env.production +++ b/web-ui/.env.production @@ -21,4 +21,9 @@ REACT_APP_ENABLE_CLAIMS="true" APY_ZONES_ENDPOINT = "https://chains.cosmos.directory" NEXT_PUBLIC_OSMOSIS_API="https://api.osmosis.zone" NEXT_PUBLIC_WHITELISTED_DENOM="uatom,ustars,uosmo,usomm,uregen" -NEXT_PUBLIC_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" \ No newline at end of file +NEXT_PUBLIC_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" +NEXT_PUBLIC_COSMOSHUB_CHAIN_ID=cosmoshub-4 +NEXT_PUBLIC_OSMOSIS_CHAIN_ID=osmosis-1 +NEXT_PUBLIC_STARGAZE_CHAIN_ID=stargaze-1 +NEXT_PUBLIC_REGEN_CHAIN_ID=regen-1 +NEXT_PUBLIC_SOMMELIER_CHAIN_ID=sommelier-3 \ No newline at end of file diff --git a/web-ui/components/Staking/modals/validatorSelectionModal.tsx b/web-ui/components/Staking/modals/validatorSelectionModal.tsx index 0122d169c..d70cabbde 100644 --- a/web-ui/components/Staking/modals/validatorSelectionModal.tsx +++ b/web-ui/components/Staking/modals/validatorSelectionModal.tsx @@ -52,7 +52,6 @@ export const MultiModal: React.FC = ({ const { validatorsData, isLoading, isError } = useValidatorsQuery(selectedChainName); const { missedBlocksData } = useMissedBlocks(selectedChainName); - console.log(missedBlocksData); const { data: logos, isLoading: isFetchingLogos } = useValidatorLogos(selectedChainName, validatorsData || []); const validators = validatorsData; diff --git a/web-ui/components/Staking/networkSelectButton.tsx b/web-ui/components/Staking/networkSelectButton.tsx index f01e1ad38..e173b2230 100644 --- a/web-ui/components/Staking/networkSelectButton.tsx +++ b/web-ui/components/Staking/networkSelectButton.tsx @@ -5,7 +5,9 @@ import { Menu, MenuButton, MenuList, MenuItem, Button, Flex, Image, Text, useDis import React, { Dispatch, SetStateAction, useState } from 'react'; import { BsArrowDown } from 'react-icons/bs'; -import { networks } from '@/state/chains/prod'; +import { networks as prodNetworks, testNetworks as devNetworks } from '@/state/chains/prod'; + +const networks = process.env.NEXT_PUBLIC_CHAIN_ENV === 'mainnet' ? prodNetworks : devNetworks; interface CustomMenuProps { buttonTextColor?: string; diff --git a/web-ui/pages/assets.tsx b/web-ui/pages/assets.tsx index 98637badc..1456691a3 100644 --- a/web-ui/pages/assets.tsx +++ b/web-ui/pages/assets.tsx @@ -34,8 +34,7 @@ type APYRates = { }; function Home() { - const { address: qAddress, isWalletConnected } = useChain('quicksilver'); - const { address } = useChain('quicksilver'); + const { address, isWalletConnected } = useChain('quicksilver'); // Function to fetch token price from an API const fetchTokenPrice = async (token: any) => { try { @@ -47,25 +46,31 @@ function Home() { } }; + const COSMOSHUB_CHAIN_ID = process.env.NEXT_PUBLIC_COSMOSHUB_CHAIN_ID; + const OSMOSIS_CHAIN_ID = process.env.NEXT_PUBLIC_OSMOSIS_CHAIN_ID; + const STARGAZE_CHAIN_ID = process.env.NEXT_PUBLIC_STARGAZE_CHAIN_ID; + const REGEN_CHAIN_ID = process.env.NEXT_PUBLIC_REGEN_CHAIN_ID; + const SOMMELIER_CHAIN_ID = process.env.NEXT_PUBLIC_SOMMELIER_CHAIN_ID; + // Retrieve balance for each token - const { balance: qAtom, isLoading: qAtomIsLoading, isError: qAtomIsError } = useQBalanceQuery('quicksilver', qAddress ?? '', 'atom'); - const { balance: qOsmo, isLoading: qOsmoIsLoading, isError: qOsmoIsError } = useQBalanceQuery('quicksilver', qAddress ?? '', 'osmo'); - const { balance: qStars, isLoading: qStarsIsLoading, isError: qStarsIsError } = useQBalanceQuery('quicksilver', qAddress ?? '', 'stars'); - const { balance: qRegen, isLoading: qRegenIsLoading, isError: qRegenIsError } = useQBalanceQuery('quicksilver', qAddress ?? '', 'regen'); - const { balance: qSomm, isLoading: qSommIsLoading, isError: qSommIsError } = useQBalanceQuery('quicksilver', qAddress ?? '', 'somm'); + const { balance: qAtom, isLoading: qAtomIsLoading, isError: qAtomIsError } = useQBalanceQuery('quicksilver', address ?? '', 'atom'); + const { balance: qOsmo, isLoading: qOsmoIsLoading, isError: qOsmoIsError } = useQBalanceQuery('quicksilver', address ?? '', 'osmo'); + const { balance: qStars, isLoading: qStarsIsLoading, isError: qStarsIsError } = useQBalanceQuery('quicksilver', address ?? '', 'stars'); + const { balance: qRegen, isLoading: qRegenIsLoading, isError: qRegenIsError } = useQBalanceQuery('quicksilver', address ?? '', 'regen'); + const { balance: qSomm, isLoading: qSommIsLoading, isError: qSommIsError } = useQBalanceQuery('quicksilver', address ?? '', 'somm'); // Retrieve zone data for each token - const { data: CosmosZone, isLoading: isCosmosZoneLoading, isError: isCosmosZoneError } = useZoneQuery('cosmoshub-4'); - const { data: OsmoZone, isLoading: isOsmoZoneLoading, isError: isOsmoZoneError } = useZoneQuery('osmosis-1'); - const { data: StarZone, isLoading: isStarZoneLoading, isError: isStarZoneError } = useZoneQuery('stargaze-1'); - const { data: RegenZone, isLoading: isRegenZoneLoading, isError: isRegenZoneError } = useZoneQuery('regen-1'); - const { data: SommZone, isLoading: isSommZoneLoading, isError: isSommZoneError } = useZoneQuery('sommelier-3'); + const { data: CosmosZone, isLoading: isCosmosZoneLoading, isError: isCosmosZoneError } = useZoneQuery(COSMOSHUB_CHAIN_ID ?? ''); + const { data: OsmoZone, isLoading: isOsmoZoneLoading, isError: isOsmoZoneError } = useZoneQuery(OSMOSIS_CHAIN_ID ?? ''); + const { data: StarZone, isLoading: isStarZoneLoading, isError: isStarZoneError } = useZoneQuery(STARGAZE_CHAIN_ID ?? ''); + const { data: RegenZone, isLoading: isRegenZoneLoading, isError: isRegenZoneError } = useZoneQuery(REGEN_CHAIN_ID ?? ''); + const { data: SommZone, isLoading: isSommZoneLoading, isError: isSommZoneError } = useZoneQuery(SOMMELIER_CHAIN_ID ?? ''); // Retrieve APY data for each token - const { APY: cosmosAPY, isLoading: isCosmosAPYLoading, isError: isCosmosAPYError } = useAPYQuery('cosmoshub-4'); - const { APY: osmoAPY, isLoading: isOsmoAPYLoading, isError: isOsmoAPYError } = useAPYQuery('osmosis-1'); - const { APY: starsAPY, isLoading: isStarsAPYLoading, isError: isStarsAPYError } = useAPYQuery('stargaze-1'); - const { APY: regenAPY, isLoading: isRegenAPYLoading, isError: isRegenAPYError } = useAPYQuery('regen-1'); - const { APY: sommAPY, isLoading: isSommAPYLoading, isError: isSommAPYError } = useAPYQuery('sommelier-3'); + const { APY: cosmosAPY, isLoading: isCosmosAPYLoading, isError: isCosmosAPYError } = useAPYQuery(COSMOSHUB_CHAIN_ID); + const { APY: osmoAPY, isLoading: isOsmoAPYLoading, isError: isOsmoAPYError } = useAPYQuery(OSMOSIS_CHAIN_ID); + const { APY: starsAPY, isLoading: isStarsAPYLoading, isError: isStarsAPYError } = useAPYQuery(STARGAZE_CHAIN_ID); + const { APY: regenAPY, isLoading: isRegenAPYLoading, isError: isRegenAPYError } = useAPYQuery(REGEN_CHAIN_ID); + const { APY: sommAPY, isLoading: isSommAPYLoading, isError: isSommAPYError } = useAPYQuery(SOMMELIER_CHAIN_ID); // useMemo hook to cache APY data const qAPYRates: APYRates = useMemo( @@ -255,7 +260,7 @@ function Home() { {/* Unbonding Table */} - + diff --git a/web-ui/pages/staking.tsx b/web-ui/pages/staking.tsx index 31293e44d..a06874b2f 100644 --- a/web-ui/pages/staking.tsx +++ b/web-ui/pages/staking.tsx @@ -24,7 +24,7 @@ import { StakingBox } from '@/components'; import { InfoBox } from '@/components'; import { AssetsAccordian } from '@/components'; import { useAPYQuery } from '@/hooks/useQueries'; -import { networks } from '@/state/chains/prod'; +import { networks as prodNetworks, testNetworks as devNetworks } from '@/state/chains/prod'; import { useChain } from '@cosmos-kit/react'; const DynamicStakingBox = dynamic(() => Promise.resolve(StakingBox), { @@ -39,6 +39,8 @@ const DynamicAssetBox = dynamic(() => Promise.resolve(AssetsAccordian), { ssr: false, }); +const networks = process.env.NEXT_PUBLIC_CHAIN_ENV === 'mainnet' ? prodNetworks : devNetworks; + export default function Staking() { const [selectedNetwork, setSelectedNetwork] = useState(networks[0]); const [isModalOpen, setModalOpen] = useState(false); diff --git a/web-ui/state/chains/prod.ts b/web-ui/state/chains/prod.ts index ca91a3887..08a342175 100644 --- a/web-ui/state/chains/prod.ts +++ b/web-ui/state/chains/prod.ts @@ -41,6 +41,50 @@ export const networks = [ }, ]; + export const testNetworks = [ + { + value: 'ATOM', + logo: '/quicksilver/img/networks/atom.svg', + qlogo: '/quicksilver/img/networks/qatom.svg', + name: 'Cosmos Hub', + chainName: 'cosmoshub', + chainId: 'provider', + }, + { + value: 'OSMO', + logo: '/quicksilver/img/networks/osmosis.svg', + qlogo: '/quicksilver/img/networks/qosmo.svg', + name: 'Osmosis', + chainName: 'osmosis', + chainId: 'osmo-test-5', + }, + { + value: 'STARS', + logo: '/quicksilver/img/networks/stargaze.svg', + qlogo: '/quicksilver/img/networks/qstars.svg', + name: 'Stargaze', + chainName: 'stargaze', + chainId: 'elgafar-1', + }, + { + value: 'REGEN', + logo: '/quicksilver/img/networks/regen.svg', + qlogo: '/quicksilver/img/networks/regen.svg', + name: 'Regen', + chainName: 'regen', + chainId: 'regen-redwood-1', + }, + { + value: 'SOMM', + logo: '/quicksilver/img/networks/sommelier.png', + qlogo: '/quicksilver/img/networks/sommelier.png', + name: 'Sommelier', + chainName: 'sommelier', + chainId: 'sommelier-3', + }, + ]; + + export const ProdQuickSilverChainInfo = { chainId: "quicksilver-2", chainName: "Quicksilver Protocol", From 0f049acb0cd3433d44102c629c56bc6a29cfd68e Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Thu, 28 Dec 2023 15:02:38 -0700 Subject: [PATCH 20/40] add else if switcher for APR chain-id in staking box --- web-ui/pages/assets.tsx | 10 +++++----- web-ui/pages/staking.tsx | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/web-ui/pages/assets.tsx b/web-ui/pages/assets.tsx index 1456691a3..262a41a3d 100644 --- a/web-ui/pages/assets.tsx +++ b/web-ui/pages/assets.tsx @@ -66,11 +66,11 @@ function Home() { const { data: RegenZone, isLoading: isRegenZoneLoading, isError: isRegenZoneError } = useZoneQuery(REGEN_CHAIN_ID ?? ''); const { data: SommZone, isLoading: isSommZoneLoading, isError: isSommZoneError } = useZoneQuery(SOMMELIER_CHAIN_ID ?? ''); // Retrieve APY data for each token - const { APY: cosmosAPY, isLoading: isCosmosAPYLoading, isError: isCosmosAPYError } = useAPYQuery(COSMOSHUB_CHAIN_ID); - const { APY: osmoAPY, isLoading: isOsmoAPYLoading, isError: isOsmoAPYError } = useAPYQuery(OSMOSIS_CHAIN_ID); - const { APY: starsAPY, isLoading: isStarsAPYLoading, isError: isStarsAPYError } = useAPYQuery(STARGAZE_CHAIN_ID); - const { APY: regenAPY, isLoading: isRegenAPYLoading, isError: isRegenAPYError } = useAPYQuery(REGEN_CHAIN_ID); - const { APY: sommAPY, isLoading: isSommAPYLoading, isError: isSommAPYError } = useAPYQuery(SOMMELIER_CHAIN_ID); + const { APY: cosmosAPY, isLoading: isCosmosAPYLoading, isError: isCosmosAPYError } = useAPYQuery('cosmoshub-4'); + const { APY: osmoAPY, isLoading: isOsmoAPYLoading, isError: isOsmoAPYError } = useAPYQuery('osmosis-1'); + const { APY: starsAPY, isLoading: isStarsAPYLoading, isError: isStarsAPYError } = useAPYQuery('stargaze-1'); + const { APY: regenAPY, isLoading: isRegenAPYLoading, isError: isRegenAPYError } = useAPYQuery('regen-1'); + const { APY: sommAPY, isLoading: isSommAPYLoading, isError: isSommAPYError } = useAPYQuery('sommelier-3'); // useMemo hook to cache APY data const qAPYRates: APYRates = useMemo( diff --git a/web-ui/pages/staking.tsx b/web-ui/pages/staking.tsx index a06874b2f..5d9f41438 100644 --- a/web-ui/pages/staking.tsx +++ b/web-ui/pages/staking.tsx @@ -44,7 +44,20 @@ const networks = process.env.NEXT_PUBLIC_CHAIN_ENV === 'mainnet' ? prodNetworks export default function Staking() { const [selectedNetwork, setSelectedNetwork] = useState(networks[0]); const [isModalOpen, setModalOpen] = useState(false); - const { APY, isLoading, isError } = useAPYQuery(selectedNetwork.chainId); + let newChainId; + if (selectedNetwork.chainId === 'provider') { + newChainId = 'cosmoshub-4'; + } else if (selectedNetwork.chainId === 'elgafar-1') { + newChainId = 'stargaze-1'; + } else if (selectedNetwork.chainId === 'osmo-test-5') { + newChainId = 'osmosis-1'; + } else if (selectedNetwork.chainId === 'regen-redwood-1') { + newChainId = 'regen-1'; + } else { + // Default case + newChainId = selectedNetwork.chainId; + } + const { APY, isLoading, isError } = useAPYQuery(newChainId); const [balance, setBalance] = useState(''); const [qBalance, setQBalance] = useState(''); From 2ad620907c700ed647cbd02891ab2a66e3508250 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Thu, 28 Dec 2023 18:14:29 -0700 Subject: [PATCH 21/40] rename dev deploy file | prep for prod deploy file --- ...{testuideploy.yaml => devWebUiDeploy.yaml} | 8 +++-- web-ui/.env.production | 29 ------------------- 2 files changed, 6 insertions(+), 31 deletions(-) rename .github/workflows/{testuideploy.yaml => devWebUiDeploy.yaml} (86%) delete mode 100644 web-ui/.env.production diff --git a/.github/workflows/testuideploy.yaml b/.github/workflows/devWebUiDeploy.yaml similarity index 86% rename from .github/workflows/testuideploy.yaml rename to .github/workflows/devWebUiDeploy.yaml index 66575d808..1f958402b 100644 --- a/.github/workflows/testuideploy.yaml +++ b/.github/workflows/devWebUiDeploy.yaml @@ -1,10 +1,14 @@ -name: Test Deploy to GitHub Pages +name: Build & Deploy web-ui with dev environment to Github Pages on: push: + branches: + - bunDev paths: - web-ui/** pull_request: + branches: + - bunDev paths: - web-ui/** @@ -32,7 +36,7 @@ jobs: - name: Setup Bun uses: oven-sh/setup-bun@v1 with: - bun-version: latest # or specify a version + bun-version: latest - name: Install Dependencies run: | diff --git a/web-ui/.env.production b/web-ui/.env.production deleted file mode 100644 index b4428c9da..000000000 --- a/web-ui/.env.production +++ /dev/null @@ -1,29 +0,0 @@ -NEXT_PUBLIC_CHAIN_ENV="mainnet" -NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_QUICKSILVER="https://lcd.quicksilver.zone/" -NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_QUICKSILVER="https://rpc.quicksilver.zone/" -NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_COSMOSHUB=https://lcd.cosmoshub-4.quicksilver.zone -NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_COSMOSHUB=https://rpc.cosmoshub-4.quicksilver.zone -NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_OSMOSIS="https://lcd.osmosis-1.quicksilver.zone" -NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_OSMOSIS="https://rpc.osmosis-1.quicksilver.zone" -NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_STARGAZE="https://lcd.stargaze-1.quicksilver.zone" -NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_STARGAZE="https://rpc.stargaze-1.quicksilver.zone" -NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_REGEN="https://lcd.regen-1.quicksilver.zone" -NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_REGEN="https://rpc.regen-1.quicksilver.zone" -NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_SOMMELIER="https://lcd.sommelier-3.quicksilver.zone" -NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_SOMMELIER="https://rpc.sommelier-3.quicksilver.zone" -NEXT_PUBLIC_QUICKSILVER_API="https://lcd.quicksilver.zone" -NEXT_PUBLIC_QUICKSILVER_DATA_API="https://data.quicksilver.zone" -ZONE_URL="quicksilver.zone" -REACT_APP_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" -REACT_APP_ENABLE_UNBONDING="true" -REACT_APP_ENABLE_SET_INTENT="true" -REACT_APP_ENABLE_CLAIMS="true" -APY_ZONES_ENDPOINT = "https://chains.cosmos.directory" -NEXT_PUBLIC_OSMOSIS_API="https://api.osmosis.zone" -NEXT_PUBLIC_WHITELISTED_DENOM="uatom,ustars,uosmo,usomm,uregen" -NEXT_PUBLIC_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" -NEXT_PUBLIC_COSMOSHUB_CHAIN_ID=cosmoshub-4 -NEXT_PUBLIC_OSMOSIS_CHAIN_ID=osmosis-1 -NEXT_PUBLIC_STARGAZE_CHAIN_ID=stargaze-1 -NEXT_PUBLIC_REGEN_CHAIN_ID=regen-1 -NEXT_PUBLIC_SOMMELIER_CHAIN_ID=sommelier-3 \ No newline at end of file From 57951a8d400622571490c9c1ce88a9092a56e785 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Thu, 28 Dec 2023 18:21:37 -0700 Subject: [PATCH 22/40] fix dev deploy file environment --- .github/workflows/devWebUiDeploy.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/devWebUiDeploy.yaml b/.github/workflows/devWebUiDeploy.yaml index 1f958402b..20c46e83e 100644 --- a/.github/workflows/devWebUiDeploy.yaml +++ b/.github/workflows/devWebUiDeploy.yaml @@ -38,6 +38,11 @@ jobs: with: bun-version: latest + - name: Setup Environment File + run: | + cd web-ui + cp .env.development .env + - name: Install Dependencies run: | cd web-ui From d4db56f1b2124d9026eae53856840fbfff4d26d5 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Fri, 29 Dec 2023 01:36:59 -0700 Subject: [PATCH 23/40] semi working testnet tx's --- .../Staking/modals/stakingProcessModal.tsx | 20 +++++- web-ui/components/Staking/stakingBox.tsx | 17 ++++- web-ui/hooks/useQueries.ts | 2 +- web-ui/pages/_app.tsx | 72 +++++++++++++++++++ web-ui/tx/liquidStakeTx.tsx | 1 + 5 files changed, 106 insertions(+), 6 deletions(-) diff --git a/web-ui/components/Staking/modals/stakingProcessModal.tsx b/web-ui/components/Staking/modals/stakingProcessModal.tsx index 714f45b59..abf69ecea 100644 --- a/web-ui/components/Staking/modals/stakingProcessModal.tsx +++ b/web-ui/components/Staking/modals/stakingProcessModal.tsx @@ -26,7 +26,7 @@ import React, { useEffect, useState } from 'react'; import { MultiModal } from './validatorSelectionModal'; -import { useQueryHooks } from '@/hooks'; +import { useQueryHooks, useTx } from '@/hooks'; import { useZoneQuery } from '@/hooks/useQueries'; import { liquidStakeTx, unbondLiquidStakeTx } from '@/tx/liquidStakeTx'; @@ -83,7 +83,21 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo const [isSigning, setIsSigning] = useState(false); const [isError, setIsError] = useState(false); - const { address, getSigningStargateClient } = useChain(selectedOption?.chainName || ''); + let newChainName: string | undefined; + if (selectedOption?.chainId === 'provider') { + newChainName = 'cosmoshubtestnet'; + } else if (selectedOption?.chainId === 'elgafar-1') { + newChainName = 'stargazetestnet'; + } else if (selectedOption?.chainId === 'osmo-test-5') { + newChainName = 'osmosistestnet'; + } else if (selectedOption?.chainId === 'regen-redwood-1') { + newChainName = 'regen'; + } else { + // Default case + newChainName = selectedOption?.chainName; + } + + const { address, getSigningStargateClient } = useChain(newChainName || ''); const labels = ['Choose validators', `Set weights`, `Sign & Submit`, `Receive q${selectedOption?.value}`]; const [isModalOpen, setModalOpen] = useState(false); @@ -168,7 +182,7 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo const response = await liquidStakeTx( getSigningStargateClient, setResp, - selectedOption?.chainName || '', + newChainName || '', selectedOption?.chainId || '', address, toast, diff --git a/web-ui/components/Staking/stakingBox.tsx b/web-ui/components/Staking/stakingBox.tsx index 7c005f516..0cf7b2bbd 100644 --- a/web-ui/components/Staking/stakingBox.tsx +++ b/web-ui/components/Staking/stakingBox.tsx @@ -48,7 +48,20 @@ type StakingBoxProps = { export const StakingBox = ({ selectedOption, isModalOpen, setModalOpen, setBalance, setQBalance }: StakingBoxProps) => { const [activeTabIndex, setActiveTabIndex] = useState(0); const [tokenAmount, setTokenAmount] = useState('0'); - const { address } = useChain(selectedOption.chainName); + let newChainName: string | undefined; + if (selectedOption?.chainId === 'provider') { + newChainName = 'cosmoshubtestnet'; + } else if (selectedOption?.chainId === 'elgafar-1') { + newChainName = 'stargazetestnet'; + } else if (selectedOption?.chainId === 'osmo-test-5') { + newChainName = 'osmosistestnet'; + } else if (selectedOption?.chainId === 'regen-redwood-1') { + newChainName = 'regen'; + } else { + // Default case + newChainName = selectedOption?.chainName; + } + const { address } = useChain(newChainName); const { address: qAddress } = useChain('quicksilver'); const exp = getExponent(selectedOption.chainName); const { balance, isLoading } = useBalanceQuery(selectedOption.chainName, address ?? ''); @@ -103,7 +116,7 @@ export const StakingBox = ({ selectedOption, isModalOpen, setModalOpen, setBalan const [isError, setIsError] = useState(false); const [transactionStatus, setTransactionStatus] = useState('Pending'); - const { getSigningStargateClient } = useChain('quicksilver'); + const { getSigningStargateClient } = useChain('quicksilvertestnet'); const isCalculationDataLoaded = tokenAmount && !isNaN(Number(tokenAmount)) && zone && !isNaN(Number(zone.redemptionRate)); diff --git a/web-ui/hooks/useQueries.ts b/web-ui/hooks/useQueries.ts index f1d7474ef..e90c06594 100644 --- a/web-ui/hooks/useQueries.ts +++ b/web-ui/hooks/useQueries.ts @@ -359,7 +359,7 @@ export const useMissedBlocks = (chainName: string) => { const filteredMissedBlocks = response.info.filter(block => { const hasAddress = block.address && block.address.trim() !== ''; const notTombstoned = !block.tombstoned; - const notJailed = new Date(block.jailed_until) <= new Date(); // Check if jailed_until is in the past + const notJailed = new Date(block.jailed_until) <= new Date(); return hasAddress && notTombstoned && notJailed; }); diff --git a/web-ui/pages/_app.tsx b/web-ui/pages/_app.tsx index 2ea164dab..fab09f7a0 100644 --- a/web-ui/pages/_app.tsx +++ b/web-ui/pages/_app.tsx @@ -51,9 +51,81 @@ function CreateCosmosApp({ Component, pageProps }: AppProps) { }, }); + const env = process.env.NEXT_PUBLIC_CHAIN_ENV; + + const rpcEnndpoints = { + quicksilver: + env === 'testnet' + ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_QUICKSILVER + : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_QUICKSILVER, + cosmoshub: + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_COSMOSHUB, + sommelier: + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_SOMMELIER : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_SOMMELIER, + stargaze: + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_STARGAZE : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_STARGAZE, + regen: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_REGEN : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_REGEN, + osmosis: + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_OSMOSIS, + }; + + const lcdEnndpoints = { + quicksilver: + env === 'testnet' + ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_QUICKSILVER + : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_QUICKSILVER, + cosmoshub: + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_COSMOSHUB : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_COSMOSHUB, + sommelier: + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_SOMMELIER : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_SOMMELIER, + stargaze: + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_STARGAZE : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_STARGAZE, + regen: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_REGEN : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_REGEN, + osmosis: + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_OSMOSIS : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_OSMOSIS, + }; + return ( Date: Sat, 30 Dec 2023 02:04:59 -0700 Subject: [PATCH 24/40] begin test net addition to intent query --- web-ui/bun.lockb | Bin 420988 -> 434869 bytes web-ui/components/Assets/intents.tsx | 22 +++++++++++++++--- .../Staking/modals/stakingProcessModal.tsx | 1 + web-ui/hooks/useQueries.ts | 2 +- web-ui/package.json | 4 ++-- web-ui/pages/_app.tsx | 4 ++-- 6 files changed, 25 insertions(+), 8 deletions(-) diff --git a/web-ui/bun.lockb b/web-ui/bun.lockb index e47e0f751c03847fd11218f1d262ab6ee025c621..bd46b3dca4a66c726e0feb9bd8c6dfc60ba90324 100755 GIT binary patch delta 73757 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⪻A*g5m{K9BfZy1`FUXLxJDY!!-PL% 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 D(Qw8P delta 67363 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 diff --git a/web-ui/components/Assets/intents.tsx b/web-ui/components/Assets/intents.tsx index 5933984bb..6a6d40e23 100644 --- a/web-ui/components/Assets/intents.tsx +++ b/web-ui/components/Assets/intents.tsx @@ -11,16 +11,32 @@ export interface StakingIntentProps { } const StakingIntent: React.FC = ({ address, isWalletConnected }) => { - const { intent, isLoading, isError } = useIntentQuery('cosmoshub', address ?? ''); - const validators = [ { name: 'Validator 1', logo: '/validator1.png', percentage: '30%' }, { name: 'Validator 2', logo: '/validator2.png', percentage: '40%' }, ]; - const chains = ['Cosmos', 'Osmosis', 'Stargaze', 'Regen', 'Sommelier']; + const chains = ['Stargaze', 'Cosmos', 'Osmosis', 'Regen', 'Sommelier']; const [currentChainIndex, setCurrentChainIndex] = useState(0); + const currentChainName = chains[currentChainIndex]; + let newChainName: string | undefined; + if (currentChainName === 'Cosmos') { + newChainName = 'cosmoshub'; + } else if (currentChainName === 'Osmosis') { + newChainName = 'osmosistestnet'; + } else if (currentChainName === 'Stargaze') { + newChainName = 'stargazetestnet'; + } else if (currentChainName === 'Regen') { + newChainName = 'regen'; + } else if (currentChainName === 'Sommelier') { + newChainName = 'sommelier-3'; + } else { + // Default case + newChainName = currentChainName; + } + const { intent, isLoading, isError } = useIntentQuery(newChainName, address ?? ''); + console.log(intent); const handleLeftArrowClick = () => { setCurrentChainIndex((prevIndex) => (prevIndex === 0 ? chains.length - 1 : prevIndex - 1)); }; diff --git a/web-ui/components/Staking/modals/stakingProcessModal.tsx b/web-ui/components/Staking/modals/stakingProcessModal.tsx index abf69ecea..27724dec6 100644 --- a/web-ui/components/Staking/modals/stakingProcessModal.tsx +++ b/web-ui/components/Staking/modals/stakingProcessModal.tsx @@ -434,6 +434,7 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo {validator.name} { throw new Error('RPC Client not ready'); } - const intent = await axios.get(`https://quicksilver-rest.publicnode.com/quicksilver/interchainstaking/v1/zones/${chainId}/delegator_intent/${address}`) + const intent = await axios.get(`https://lcd.test.quicksilver.zone/quicksilver/interchainstaking/v1/zones/${chainId}/delegator_intent/${address}`) return intent; }, diff --git a/web-ui/package.json b/web-ui/package.json index af664f6e2..6ef5d99ae 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -19,12 +19,12 @@ "@cosmjs/amino": "0.28.0", "@cosmjs/cosmwasm-stargate": "0.29.5", "@cosmjs/proto-signing": "0.28.0", - "@cosmjs/stargate": "0.29.5", + "@cosmjs/stargate": "0.32.2", "@cosmos-kit/core": "^2.0.3", "@cosmos-kit/cosmostation": "^2.0.3", "@cosmos-kit/keplr": "^2.0.3", "@cosmos-kit/leap": "^2.0.3", - "@cosmos-kit/react": "^2.0.3", + "@cosmos-kit/react": "2.3.0", "@emotion/react": "11.10.6", "@emotion/styled": "11.10.6", "@hoangdv2429/quicksilverjs": "^0.0.1", diff --git a/web-ui/pages/_app.tsx b/web-ui/pages/_app.tsx index fab09f7a0..eb2d393ae 100644 --- a/web-ui/pages/_app.tsx +++ b/web-ui/pages/_app.tsx @@ -96,8 +96,8 @@ function CreateCosmosApp({ Component, pageProps }: AppProps) { rest: [lcdEnndpoints.quicksilver ?? ''], }, quicksilvertestnet: { - rest: ['https://quick.api.t.stavr.tech/'], - rpc: ['http://quick.rpc.t.stavr.tech:20027'], + rest: ['https://lcd.test.quicksilver.zone/'], + rpc: ['https://rpc.test.quicksilver.zone'], }, cosmoshub: { rpc: [rpcEnndpoints.cosmoshub ?? ''], From 08025a6efd00d4fb676d634b2d73bd74a36b8573 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Sat, 30 Dec 2023 15:49:49 -0700 Subject: [PATCH 25/40] recent changes --- web-ui/.env | 19 +++++++++++++++++- web-ui/.env.development | 8 ++++---- web-ui/components/Assets/unbondingTable.tsx | 5 +++-- .../Staking/modals/stakingProcessModal.tsx | 2 +- web-ui/components/Staking/stakingBox.tsx | 10 ++++++--- web-ui/pages/_app.tsx | 4 ++-- web-ui/public/img/networks/qregen.png | Bin 0 -> 28660 bytes web-ui/state/chains/prod.ts | 4 ++-- 8 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 web-ui/public/img/networks/qregen.png diff --git a/web-ui/.env b/web-ui/.env index 5677fc1e5..b4428c9da 100644 --- a/web-ui/.env +++ b/web-ui/.env @@ -1,4 +1,16 @@ -NEXT_PUBLIC_CHAIN_ENV="preprod" +NEXT_PUBLIC_CHAIN_ENV="mainnet" +NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_QUICKSILVER="https://lcd.quicksilver.zone/" +NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_QUICKSILVER="https://rpc.quicksilver.zone/" +NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_COSMOSHUB=https://lcd.cosmoshub-4.quicksilver.zone +NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_COSMOSHUB=https://rpc.cosmoshub-4.quicksilver.zone +NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_OSMOSIS="https://lcd.osmosis-1.quicksilver.zone" +NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_OSMOSIS="https://rpc.osmosis-1.quicksilver.zone" +NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_STARGAZE="https://lcd.stargaze-1.quicksilver.zone" +NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_STARGAZE="https://rpc.stargaze-1.quicksilver.zone" +NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_REGEN="https://lcd.regen-1.quicksilver.zone" +NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_REGEN="https://rpc.regen-1.quicksilver.zone" +NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_SOMMELIER="https://lcd.sommelier-3.quicksilver.zone" +NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_SOMMELIER="https://rpc.sommelier-3.quicksilver.zone" NEXT_PUBLIC_QUICKSILVER_API="https://lcd.quicksilver.zone" NEXT_PUBLIC_QUICKSILVER_DATA_API="https://data.quicksilver.zone" ZONE_URL="quicksilver.zone" @@ -10,3 +22,8 @@ APY_ZONES_ENDPOINT = "https://chains.cosmos.directory" NEXT_PUBLIC_OSMOSIS_API="https://api.osmosis.zone" NEXT_PUBLIC_WHITELISTED_DENOM="uatom,ustars,uosmo,usomm,uregen" NEXT_PUBLIC_WHITELISTED_ZONES="osmosis-1,stargaze-1,regen-1,cosmoshub-4,sommelier-3" +NEXT_PUBLIC_COSMOSHUB_CHAIN_ID=cosmoshub-4 +NEXT_PUBLIC_OSMOSIS_CHAIN_ID=osmosis-1 +NEXT_PUBLIC_STARGAZE_CHAIN_ID=stargaze-1 +NEXT_PUBLIC_REGEN_CHAIN_ID=regen-1 +NEXT_PUBLIC_SOMMELIER_CHAIN_ID=sommelier-3 \ No newline at end of file diff --git a/web-ui/.env.development b/web-ui/.env.development index f6315424c..75d989365 100644 --- a/web-ui/.env.development +++ b/web-ui/.env.development @@ -1,10 +1,10 @@ NEXT_PUBLIC_CHAIN_ENV="testnet" -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_QUICKSILVER="https://lcd.test.quicksilver.zone/" -NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_QUICKSILVER="https://rpc.test.quicksilver.zone/" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_QUICKSILVER="https://lcd.test.quicksilver.zone" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_QUICKSILVER="https://rpc.test.quicksilver.zone" NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB=https://lcd.provider.test.quicksilver.zone NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_COSMOSHUB=https://rpc.provider.test.quicksilver.zone -NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS="https://lcd.osmo-test-5.test.quicksilver.zone/" -NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_OSMOSIS="https://rpc.osmo-test-5.test.quicksilver.zone/" +NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS="https://lcd.osmo-test-5.test.quicksilver.zone" +NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_OSMOSIS="https://rpc.osmo-test-5.test.quicksilver.zone" NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_STARGAZE="https://lcd.elgafar-1.test.quicksilver.zone" NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_STARGAZE="https://rpc.elgafar-1.test.quicksilver.zone" NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_REGEN="https://lcd.regen-redwood-1.test.quicksilver.zone" diff --git a/web-ui/components/Assets/unbondingTable.tsx b/web-ui/components/Assets/unbondingTable.tsx index 6f1f019a3..a53c2b532 100644 --- a/web-ui/components/Assets/unbondingTable.tsx +++ b/web-ui/components/Assets/unbondingTable.tsx @@ -39,6 +39,7 @@ const UnbondingAssetsTable: React.FC = ({ address, ch }, ]; const { unbondingData } = useUnbondingQuery(chainName, address); + const noUnbondingAssets = isWalletConnected && unbondingData?.withdrawals.length === 0; return ( <> @@ -63,7 +64,7 @@ const UnbondingAssetsTable: React.FC = ({ address, ch )} - {unbondingData?.withdrawals.length === 0 && ( + {noUnbondingAssets && ( = ({ address, ch )} - {isWalletConnected && ( + {isWalletConnected && !noUnbondingAssets && ( diff --git a/web-ui/components/Staking/modals/stakingProcessModal.tsx b/web-ui/components/Staking/modals/stakingProcessModal.tsx index 27724dec6..faca6d042 100644 --- a/web-ui/components/Staking/modals/stakingProcessModal.tsx +++ b/web-ui/components/Staking/modals/stakingProcessModal.tsx @@ -85,7 +85,7 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo let newChainName: string | undefined; if (selectedOption?.chainId === 'provider') { - newChainName = 'cosmoshubtestnet'; + newChainName = 'cosmoshub'; } else if (selectedOption?.chainId === 'elgafar-1') { newChainName = 'stargazetestnet'; } else if (selectedOption?.chainId === 'osmo-test-5') { diff --git a/web-ui/components/Staking/stakingBox.tsx b/web-ui/components/Staking/stakingBox.tsx index 0cf7b2bbd..0653f8ee2 100644 --- a/web-ui/components/Staking/stakingBox.tsx +++ b/web-ui/components/Staking/stakingBox.tsx @@ -116,7 +116,7 @@ export const StakingBox = ({ selectedOption, isModalOpen, setModalOpen, setBalan const [isError, setIsError] = useState(false); const [transactionStatus, setTransactionStatus] = useState('Pending'); - const { getSigningStargateClient } = useChain('quicksilvertestnet'); + const { getSigningStargateClient } = useChain('quicksilver'); const isCalculationDataLoaded = tokenAmount && !isNaN(Number(tokenAmount)) && zone && !isNaN(Number(zone.redemptionRate)); @@ -341,7 +341,9 @@ export const StakingBox = ({ selectedOption, isModalOpen, setModalOpen, setBalan {/* This pushes the next Stat component to the right */} - {(Number(tokenAmount) / Number(zone?.redemptionRate)).toFixed(2)} + + {(Number(tokenAmount) / (Number(zone?.redemptionRate) || 1)).toFixed(2)} +
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 DSx^lW delta 83116 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 diff --git a/web-ui/hooks/useGrpcQueryClient.ts b/web-ui/hooks/useGrpcQueryClient.ts index 4bc0e805e..1480e172d 100644 --- a/web-ui/hooks/useGrpcQueryClient.ts +++ b/web-ui/hooks/useGrpcQueryClient.ts @@ -1,12 +1,14 @@ import { HttpEndpoint } from '@cosmjs/stargate'; import { quicksilver } from '@hoangdv2429/quicksilverjs'; -import { useQuery } from '@tanstack/react-query'; +import { QueryClient, useQuery } from '@tanstack/react-query'; import { useQueryHooks } from './useQueryHooks'; const createGrpcGateWayClient = quicksilver.ClientFactory.createGrpcGateWayClient; export const useGrpcQueryClient = (chainName: string) => { + + let grpcEndpoint: string | HttpEndpoint | undefined; const env = process.env.NEXT_PUBLIC_CHAIN_ENV; const solution = useQueryHooks(chainName); @@ -22,7 +24,6 @@ export const useGrpcQueryClient = (chainName: string) => { }; - grpcEndpoint = endpoints[chainName] || solution.rpcEndpoint; diff --git a/web-ui/hooks/useRpcQueryClient.ts b/web-ui/hooks/useRpcQueryClient.ts index ed5e68eef..2870eed66 100644 --- a/web-ui/hooks/useRpcQueryClient.ts +++ b/web-ui/hooks/useRpcQueryClient.ts @@ -26,7 +26,7 @@ export const useRpcQueryClient = (chainName: string) => { queryKey: ['rpcQueryClient', rpcEndpoint], queryFn: () => { - return createRPCQueryClient({ rpcEndpoint: rpcEndpoint || 'https://lcd.quicksilver.zone' }); + return createRPCQueryClient({ rpcEndpoint: rpcEndpoint || '' }); }, enabled: !!rpcEndpoint, staleTime: Infinity, diff --git a/web-ui/package.json b/web-ui/package.json index 6ef5d99ae..d1bca3ca1 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -15,6 +15,7 @@ "@chakra-ui/icons": "^2.0.12", "@chakra-ui/react": "2.5.1", "@chakra-ui/system": "^2.1.3", + "@chalabi/chain-registry": "^1.25.1", "@chalabi/quicksilverjs": "0.0.2", "@cosmjs/amino": "0.28.0", "@cosmjs/cosmwasm-stargate": "0.29.5", diff --git a/web-ui/pages/_app.tsx b/web-ui/pages/_app.tsx index 55e2d5304..7d6d2a692 100644 --- a/web-ui/pages/_app.tsx +++ b/web-ui/pages/_app.tsx @@ -53,36 +53,36 @@ function CreateCosmosApp({ Component, pageProps }: AppProps) { const env = process.env.NEXT_PUBLIC_CHAIN_ENV; - const rpcEnndpoints = { + const rpcEndpoints = { quicksilver: env === 'testnet' - ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_QUICKSILVER - : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_QUICKSILVER, + ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_QUICKSILVER + : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_QUICKSILVER, cosmoshub: - env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_COSMOSHUB, + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_COSMOSHUB : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_COSMOSHUB, sommelier: - env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_SOMMELIER : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_SOMMELIER, + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_SOMMELIER : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_SOMMELIER, stargaze: - env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_STARGAZE : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_STARGAZE, - regen: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_REGEN : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_REGEN, + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_STARGAZE : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_STARGAZE, + regen: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_REGEN : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_REGEN, osmosis: - env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_OSMOSIS, + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_OSMOSIS : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_OSMOSIS, }; - const lcdEnndpoints = { + const lcdEndpoints = { quicksilver: env === 'testnet' - ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_QUICKSILVER - : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_QUICKSILVER, + ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_QUICKSILVER + : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_QUICKSILVER, cosmoshub: - env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_COSMOSHUB : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_COSMOSHUB, + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_COSMOSHUB : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_COSMOSHUB, sommelier: - env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_SOMMELIER : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_SOMMELIER, + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_SOMMELIER : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_SOMMELIER, stargaze: - env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_STARGAZE : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_STARGAZE, - regen: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_REGEN : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_REGEN, + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_STARGAZE : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_STARGAZE, + regen: env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_REGEN : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_REGEN, osmosis: - env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_RPC_ENDPOINT_OSMOSIS : process.env.NEXT_PUBLIC_MAINNET_RPC_ENDPOINT_OSMOSIS, + env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_OSMOSIS, }; return ( @@ -92,37 +92,36 @@ function CreateCosmosApp({ Component, pageProps }: AppProps) { isLazy: true, endpoints: { quicksilver: { - rpc: [rpcEnndpoints.quicksilver ?? ''], - rest: [lcdEnndpoints.quicksilver ?? ''], + rpc: [rpcEndpoints.quicksilver ?? ''], + rest: [lcdEndpoints.quicksilver ?? ''], }, quicksilvertestnet: { rest: ['https://lcd.test.quicksilver.zone/'], rpc: ['https://rpc.test.quicksilver.zone'], }, cosmoshub: { - rpc: [rpcEnndpoints.cosmoshub ?? ''], - rest: [lcdEnndpoints.cosmoshub ?? ''], + rpc: [rpcEndpoints.cosmoshub ?? ''], + rest: [lcdEndpoints.cosmoshub ?? ''], }, - sommelier: { - rpc: [rpcEnndpoints.sommelier ?? ''], - rest: [lcdEnndpoints.sommelier ?? ''], + rpc: [rpcEndpoints.sommelier ?? ''], + rest: [lcdEndpoints.sommelier ?? ''], }, stargaze: { - rpc: [rpcEnndpoints.stargaze ?? ''], - rest: [lcdEnndpoints.stargaze ?? ''], + rpc: [rpcEndpoints.stargaze ?? ''], + rest: [lcdEndpoints.stargaze ?? ''], }, regen: { - rpc: [rpcEnndpoints.regen ?? ''], - rest: [lcdEnndpoints.regen ?? ''], + rpc: [rpcEndpoints.regen ?? ''], + rest: [lcdEndpoints.regen ?? ''], }, osmosis: { - rpc: [rpcEnndpoints.osmosis ?? ''], - rest: [lcdEnndpoints.osmosis ?? ''], + rpc: [rpcEndpoints.osmosis ?? ''], + rest: [lcdEndpoints.osmosis ?? ''], }, osmosistestnet: { - rpc: [rpcEnndpoints.osmosis ?? ''], - rest: [lcdEnndpoints.osmosis ?? ''], + rpc: [rpcEndpoints.osmosis ?? ''], + rest: [lcdEndpoints.osmosis ?? ''], }, }, }} diff --git a/web-ui/tx/liquidStakeTx.tsx b/web-ui/tx/liquidStakeTx.tsx index 9a723a5ba..cc00e6df9 100644 --- a/web-ui/tx/liquidStakeTx.tsx +++ b/web-ui/tx/liquidStakeTx.tsx @@ -84,7 +84,7 @@ export const liquidStakeTx = ( if (validatorsSelect.length > 0) { validatorsSelect.forEach((val) => { - memoBuffer = Buffer.concat([memoBuffer, addValidator(val.address, val.intent / 100)]); + memoBuffer = Buffer.concat([memoBuffer, addValidator(val.address, val.intent)]); }); memoBuffer = Buffer.concat([Buffer.from([0x02, memoBuffer.length]), memoBuffer]); } From 676ff9027491b63e8af4ac8c9312e30bb843c774 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Sat, 30 Dec 2023 22:17:52 -0700 Subject: [PATCH 27/40] fix all query errors, fix val logo errors, fix font errors --- .../Assets/modals/qckWithdrawModal.tsx | 2 +- web-ui/hooks/useGrpcQueryClient.ts | 10 ++-- web-ui/hooks/useQueries.ts | 10 ++-- web-ui/pages/_app.tsx | 12 +---- web-ui/utils/logos.ts | 48 +++++++++---------- 5 files changed, 35 insertions(+), 47 deletions(-) diff --git a/web-ui/components/Assets/modals/qckWithdrawModal.tsx b/web-ui/components/Assets/modals/qckWithdrawModal.tsx index 9b1f3cdae..6c8990a61 100644 --- a/web-ui/components/Assets/modals/qckWithdrawModal.tsx +++ b/web-ui/components/Assets/modals/qckWithdrawModal.tsx @@ -70,7 +70,7 @@ export function WithdrawModal() { const { transfer } = ibc.applications.transfer.v1.MessageComposer.withTypeUrl; const { address, connect, status, message, wallet } = useChain(toChain ?? ''); const { address: qAddress } = useChain('quicksilver'); - const { balance } = useIbcBalanceQuery(fromChain ?? '', address ?? ''); + const { balance } = useIbcBalanceQuery(fromChain ?? '', qAddress ?? ''); const { tx } = useTx(fromChain ?? ''); const onSubmitClick = async () => { diff --git a/web-ui/hooks/useGrpcQueryClient.ts b/web-ui/hooks/useGrpcQueryClient.ts index 1480e172d..41902cb5e 100644 --- a/web-ui/hooks/useGrpcQueryClient.ts +++ b/web-ui/hooks/useGrpcQueryClient.ts @@ -1,17 +1,15 @@ -import { HttpEndpoint } from '@cosmjs/stargate'; import { quicksilver } from '@hoangdv2429/quicksilverjs'; -import { QueryClient, useQuery } from '@tanstack/react-query'; +import { useQuery } from '@tanstack/react-query'; -import { useQueryHooks } from './useQueryHooks'; const createGrpcGateWayClient = quicksilver.ClientFactory.createGrpcGateWayClient; export const useGrpcQueryClient = (chainName: string) => { - let grpcEndpoint: string | HttpEndpoint | undefined; + let grpcEndpoint: string | undefined; const env = process.env.NEXT_PUBLIC_CHAIN_ENV; - const solution = useQueryHooks(chainName); + const endpoints: { [key: string]: string | undefined } = { @@ -24,7 +22,7 @@ export const useGrpcQueryClient = (chainName: string) => { }; - grpcEndpoint = endpoints[chainName] || solution.rpcEndpoint; + grpcEndpoint = endpoints[chainName]; diff --git a/web-ui/hooks/useQueries.ts b/web-ui/hooks/useQueries.ts index 2788a7c70..60fc1299e 100644 --- a/web-ui/hooks/useQueries.ts +++ b/web-ui/hooks/useQueries.ts @@ -31,7 +31,7 @@ export const useBalanceQuery = (chainName: string, address: string) => { return balance; }, { - enabled: !!grpcQueryClient, + enabled: !!grpcQueryClient && !!address, staleTime: Infinity, }, ); @@ -66,7 +66,7 @@ export const useIbcBalanceQuery = (chainName: string, address: string) => { return balance; }, { - enabled: !!grpcQueryClient, + enabled: !!grpcQueryClient && !!address, staleTime: Infinity, }, ); @@ -112,7 +112,7 @@ export const useQBalanceQuery = (chainName: string, address: string, qAsset: str return balance; }, { - enabled: !!grpcQueryClient, + enabled: !!grpcQueryClient && !!address, staleTime: Infinity, }, ); @@ -140,7 +140,7 @@ export const useIntentQuery = (chainName: string, address: string) => { return intent; }, { - enabled: !!grpcQueryClient, + enabled: !!grpcQueryClient && !!address, staleTime: Infinity, }, ); @@ -180,7 +180,7 @@ export const useUnbondingQuery = (chainName: string, address: string) => { }, { - enabled: !!grpcQueryClient, + enabled: !!grpcQueryClient && !!address, staleTime: Infinity, }, ); diff --git a/web-ui/pages/_app.tsx b/web-ui/pages/_app.tsx index 7d6d2a692..78e690d9e 100644 --- a/web-ui/pages/_app.tsx +++ b/web-ui/pages/_app.tsx @@ -20,8 +20,6 @@ import { Header, SideHeader } from '@/components'; import { defaultTheme } from '@/config'; import { useRpcQueryClient } from '@/hooks'; -import '@interchain-ui/react/styles'; - function CreateCosmosApp({ Component, pageProps }: AppProps) { const signerOptions: SignerOptions = { //@ts-ignore @@ -145,15 +143,7 @@ function CreateCosmosApp({ Component, pageProps }: AppProps) { > - +
diff --git a/web-ui/utils/logos.ts b/web-ui/utils/logos.ts index 56e3e0194..daa2395a9 100644 --- a/web-ui/utils/logos.ts +++ b/web-ui/utils/logos.ts @@ -61,38 +61,38 @@ export const isUrlValid = async (url: string) => { return contentType.startsWith('image'); }; -export const getCosmostationUrl = ( - chainName: string, - validatorAddr: string, -) => { - const cosmostationChainName = - convertChainName(chainName); - return `https://raw.githubusercontent.com/cosmostation/chainlist/main/chain/${cosmostationChainName}/moniker/${validatorAddr}.png`; -}; +export const getCosmostationUrl = (chainName: string, validatorAddr: string) => { + const env = process.env.NEXT_PUBLIC_CHAIN_ENV; + const convertedChainName = convertChainName(chainName); -export const getKeybaseUrl = ( - identity: string, -) => { - return `https://keybase.io/_/api/1.0/user/lookup.json?key_suffix=${identity}&fields=pictures`; + + if (env === 'testnet') { + return 'https://cdn.pixabay.com/photo/2016/08/08/09/17/avatar-1577909_960_720.png'; + } + + const dynamicChainName = `${convertedChainName}${env === 'testnet' ? '-testnet' : ''}`; + return `https://raw.githubusercontent.com/cosmostation/chainlist/main/chain/${dynamicChainName}/moniker/${validatorAddr}.png`; }; -export const addLogoUrlSource = async ( - validator: Validator, - chainName: string, -): Promise => { - const url = getCosmostationUrl( - chainName, - validator.address, - ); - const isValid = await isUrlValid(url); +export const addLogoUrlSource = async (validator: Validator, chainName: string): Promise => { + const url = getCosmostationUrl(chainName, validator.address); + + // If we are not in testnet, check if URL is valid + const isValid = process.env.NEXT_PUBLIC_CHAIN_ENV !== 'testnet' && await isUrlValid(url); + return { ...validator, - imageSource: isValid - ? 'cosmostation' - : 'keybase', + imageSource: isValid ? 'cosmostation' : 'keybase', }; }; + +export const getKeybaseUrl = ( + identity: string, +) => { + return `https://keybase.io/_/api/1.0/user/lookup.json?key_suffix=${identity}&fields=pictures`; +}; + export const getLogoUrls = async ( validators: Validator[], chainName: string, From dafacbb07229e5e2b9138985980d6d5a74e702ec Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Sun, 31 Dec 2023 01:27:08 -0700 Subject: [PATCH 28/40] add defi query, swap index page for staking, fix bad balance query --- web-ui/bun.lockb | Bin 435712 -> 432094 bytes .../Assets/modals/qckDepositModal.tsx | 1 - web-ui/components/Defi/defiBox.tsx | 108 ++++-------------- .../Staking/modals/validatorTable.tsx | 2 +- web-ui/components/react/sideHeader.tsx | 2 +- web-ui/hooks/useQueries.ts | 29 +++++ web-ui/next.config.js | 9 ++ web-ui/package.json | 3 +- web-ui/pages/index.tsx | 24 ---- .../staking/[chainId]/[valoperAddress].tsx | 0 .../pages/{staking.tsx => staking/index.tsx} | 0 11 files changed, 65 insertions(+), 113 deletions(-) delete mode 100644 web-ui/pages/index.tsx create mode 100644 web-ui/pages/staking/[chainId]/[valoperAddress].tsx rename web-ui/pages/{staking.tsx => staking/index.tsx} (100%) diff --git a/web-ui/bun.lockb b/web-ui/bun.lockb index f4e33e5c822303af83f79b2c35c66c36fce15d12..ad61b61cab9401ed7ba1ce36f490f2199cacbe43 100755 GIT binary patch delta 95836 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%0A?+BP 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 D(TG|| diff --git a/web-ui/components/Assets/modals/qckDepositModal.tsx b/web-ui/components/Assets/modals/qckDepositModal.tsx index 021d9d8cf..fda308e7d 100644 --- a/web-ui/components/Assets/modals/qckDepositModal.tsx +++ b/web-ui/components/Assets/modals/qckDepositModal.tsx @@ -27,7 +27,6 @@ import { useTx } from '@/hooks'; import BigNumber from 'bignumber.js'; import { getCoin, getIbcInfo } from '@/utils'; import { StdFee, coins } from '@cosmjs/stargate'; -import { store } from '@interchain-ui/react'; export function DepositModal() { const { isOpen, onOpen, onClose } = useDisclosure(); diff --git a/web-ui/components/Defi/defiBox.tsx b/web-ui/components/Defi/defiBox.tsx index 70a20a0ec..118f4b849 100644 --- a/web-ui/components/Defi/defiBox.tsx +++ b/web-ui/components/Defi/defiBox.tsx @@ -18,6 +18,7 @@ import { HStack, } from '@chakra-ui/react'; import { ChevronDownIcon, ExternalLinkIcon } from '@chakra-ui/icons'; +import { useDefiData } from '@/hooks/useQueries'; type ActionButtonTitle = 'Add Liquidity' | 'Borrow' | 'Lend' | 'Mint Stablecoin' | 'Vaults'; interface DefiAsset { id: string; @@ -28,81 +29,6 @@ interface DefiAsset { action: string; } -const fakeData: DefiAsset[] = [ - { - id: '1', - assetPair: 'qATOM - ATOM', - apy: 0.56, - tvl: '$416.87', - provider: 'Radiyum', - action: 'Add Liquidity', - }, - { - id: '1', - assetPair: 'qATOM - ATOM', - apy: 10, - tvl: '$20006.87', - provider: 'Osmosis', - action: 'Mint Stablecoin', - }, - { - id: '1', - assetPair: 'qATOM - ATOM', - apy: 10, - tvl: '$20006.87', - provider: 'Osmosis', - action: 'Lend', - }, - { - id: '1', - assetPair: 'qATOM - ATOM', - apy: 0.56, - tvl: '$416.87', - provider: 'Radiyum', - action: 'Borrow', - }, - { - id: '1', - assetPair: 'qATOM - ATOM', - apy: 0.56, - tvl: '$416.87', - provider: 'Radiyum', - action: 'add-liquidity', - }, - { - id: '1', - assetPair: 'qATOM - ATOM', - apy: 0.56, - tvl: '$416.87', - provider: 'Radiyum', - action: 'add-liquidity', - }, - { - id: '1', - assetPair: 'qATOM - ATOM', - apy: 0.56, - tvl: '$416.87', - provider: 'Radiyum', - action: 'Vaults', - }, - { - id: '1', - assetPair: 'qATOM - ATOM', - apy: 0.56, - tvl: '$416.87', - provider: 'Radiyum', - action: 'add-liquidity', - }, - { - id: '1', - assetPair: 'qATOM - ATOM', - apy: 0.56, - tvl: '$416.87', - provider: 'Radiyum', - action: 'add-liquidity', - }, -]; - const actionTitles: Record = { 'add-liquidity': 'Add Liquidity', borrow: 'Borrow', @@ -111,22 +37,36 @@ const actionTitles: Record = { vaults: 'Vaults', }; -const filterCategories: Record boolean> = { +interface DefiData { + assetPair: string; + apy: number; + tvl: number; + provider: string; + action: string; +} + +const filterCategories: Record boolean> = { All: () => true, - 'Borrowing & Lending': (asset: DefiAsset) => asset.action === 'Borrow' || asset.action === 'Lend', - Vaults: (asset: DefiAsset) => asset.action === 'Vaults', - 'Liquidity Providers': (asset: DefiAsset) => asset.action === 'Add Liquidity', - 'Mint Stable Coins': (asset: DefiAsset) => asset.action === 'Mint Stablecoin', + 'Borrowing & Lending': (data: DefiData) => data.action === 'Borrow' || data.action === 'Lend', + Vaults: (data: DefiData) => data.action === 'Vaults', + 'Liquidity Providers': (data: DefiData) => data.action === 'Add Liquidity', + 'Mint Stable Coins': (data: DefiData) => data.action === 'Mint Stablecoin', +}; + +const formatApy = (apy: number) => { + return `${(apy * 100).toFixed(2)}%`; // Converts to percentage and formats to 2 decimal places }; const DefiTable = () => { + const { defi, isLoading, isError } = useDefiData(); + const [activeFilter, setActiveFilter] = useState('All'); const handleFilterClick = (filter: string) => { setActiveFilter(filter); }; - const filteredData = fakeData.filter(filterCategories[activeFilter]); + const filteredData = defi ? defi.filter(filterCategories[activeFilter]) : []; return ( @@ -154,7 +94,7 @@ const DefiTable = () => { - + {filteredData.map((asset, index) => ( - +
Asset Pair @@ -171,7 +111,7 @@ const DefiTable = () => {
@@ -179,7 +119,7 @@ const DefiTable = () => { - {asset.apy}% + {formatApy(asset.apy)} {asset.tvl} diff --git a/web-ui/components/Staking/modals/validatorTable.tsx b/web-ui/components/Staking/modals/validatorTable.tsx index 0e02884cd..0fe072ce1 100644 --- a/web-ui/components/Staking/modals/validatorTable.tsx +++ b/web-ui/components/Staking/modals/validatorTable.tsx @@ -119,7 +119,7 @@ export const ValidatorsTable: React.FC<{ Active validators - + {filteredData.map((asset, index) => ( - + ))} diff --git a/web-ui/components/Staking/assetsAccordion.tsx b/web-ui/components/Staking/assetsAccordion.tsx index 79665e04f..765317b0e 100644 --- a/web-ui/components/Staking/assetsAccordion.tsx +++ b/web-ui/components/Staking/assetsAccordion.tsx @@ -22,9 +22,33 @@ export const AssetsAccordian: React.FC = ({ selectedOption const renderQAssets = () => { if (qBalance) { - return qAssetsDisplay; + return ( + + {qAssetsDisplay} + + ); } else { - return ; + return ( + + + + ); + } + }; + + const renderAssets = () => { + if (Number(balance) > 0.000001) { + return ( + + {balanceDisplay} + + ); + } else { + return ( + + + + ); } }; @@ -43,9 +67,7 @@ export const AssetsAccordian: React.FC = ({ selectedOption Available to stake - - {balanceDisplay} - + {renderAssets()} {selectedOption.value.toUpperCase()} @@ -62,9 +84,8 @@ export const AssetsAccordian: React.FC = ({ selectedOption Liquid Staked - - {renderQAssets()} - + + {renderQAssets()} q{selectedOption.value.toUpperCase()} diff --git a/web-ui/components/Staking/infoBox.tsx b/web-ui/components/Staking/infoBox.tsx index f961cdd6b..b1f82c0c7 100644 --- a/web-ui/components/Staking/infoBox.tsx +++ b/web-ui/components/Staking/infoBox.tsx @@ -19,17 +19,29 @@ export const InfoBox: React.FC = ({ selectedOption, displa const renderRedemptionRate = () => { if (!isZoneLoading && zone) { - return ` 1 q${selectedOption.value.toUpperCase()} = ${Number(zone.redemptionRate).toFixed(2)} ${selectedOption.value.toUpperCase()}`; + return ( + + 1 q{selectedOption.value.toUpperCase()} = {Number(zone.redemptionRate).toFixed(2)} {selectedOption.value.toUpperCase()} + + ); } else { - return ; + return ( + + + + ); } }; const renderUnbondingPeriod = () => { if (!isZoneLoading && zone) { - return (Number(zone?.unbondingPeriod) / 86400000000000).toString() + ' days'; + return {(Number(zone?.unbondingPeriod) / 86400000000000).toString()} days; } else { - return ; + return ( + + + + ); } }; @@ -72,8 +84,6 @@ export const InfoBox: React.FC = ({ selectedOption, displa - {' '} - {/* Adjusts right margin */} @@ -87,23 +97,21 @@ export const InfoBox: React.FC = ({ selectedOption, displa -

- - - - {' '} - {/* Adjusts right margin */} - - - - Unbonding - - - - {renderUnbondingPeriod()} + + + + {' '} + {/* Adjusts right margin */} + + + + Unbonding -

+ + {renderUnbondingPeriod()} +
+ @@ -118,23 +126,20 @@ export const InfoBox: React.FC = ({ selectedOption, displa -

- - - - {' '} - {/* Adjusts right margin */} - - - - Value of 1 q{selectedOption.value.toUpperCase()} - - - - {renderRedemptionRate()} + + + + {' '} + {/* Adjusts right margin */} + + + + Value of 1 q{selectedOption.value.toUpperCase()} -

+ + {renderRedemptionRate()} +
From 9ebeb6ecd2bd45de7aff18c4411a78de192aa740 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Sun, 31 Dec 2023 13:05:34 -0700 Subject: [PATCH 30/40] finish defi box --- web-ui/components/Defi/defiBox.tsx | 84 ++++++++++++++++++--------- web-ui/components/Staking/infoBox.tsx | 20 ++++++- 2 files changed, 75 insertions(+), 29 deletions(-) diff --git a/web-ui/components/Defi/defiBox.tsx b/web-ui/components/Defi/defiBox.tsx index 3578e903a..7dd5fa601 100644 --- a/web-ui/components/Defi/defiBox.tsx +++ b/web-ui/components/Defi/defiBox.tsx @@ -17,6 +17,8 @@ import { ButtonGroup, HStack, Link, + Center, + Spinner, } from '@chakra-ui/react'; import { ChevronDownIcon, ExternalLinkIcon } from '@chakra-ui/icons'; import { useDefiData } from '@/hooks/useQueries'; @@ -93,48 +95,78 @@ const DefiTable = () => { ))} - +
{ if (isMobile) { onOpen(); } else { - router.push('/'); + router.push('/staking'); } }; diff --git a/web-ui/hooks/useQueries.ts b/web-ui/hooks/useQueries.ts index 60fc1299e..b2c1744c4 100644 --- a/web-ui/hooks/useQueries.ts +++ b/web-ui/hooks/useQueries.ts @@ -385,4 +385,33 @@ export const useMissedBlocks = (chainName: string) => { isLoading: missedBlocksQuery.isLoading, isError: missedBlocksQuery.isError, }; +}; +interface DefiData { + assetPair: string; + provider: string; + action: string; + apy: number; + tvl: number; + link: string; +} +export const useDefiData = () => { + const query = useQuery( + ['defi'], + async () => { + const res = await axios.get('https://data.test.quicksilver.zone/defi'); + if (!res.data || res.data.length === 0) { + throw new Error('Failed to query defi'); + } + return res.data; + }, + { + staleTime: Infinity, + } + ); + + return { + defi: query.data, + isLoading: query.isLoading, + isError: query.isError, + }; }; \ No newline at end of file diff --git a/web-ui/next.config.js b/web-ui/next.config.js index 36d476a96..cfa95afb9 100644 --- a/web-ui/next.config.js +++ b/web-ui/next.config.js @@ -5,6 +5,15 @@ module.exports = { swcMinify: true, basePath: '/quicksilver', assetPrefix: '/quicksilver', + async redirects() { + return [ + { + source: '/', + destination: '/staking', + permanent: true, // Change to false if temporary redirect + }, + ]; + }, typescript: { // !! WARN !! // Dangerously allow production builds to successfully complete even if diff --git a/web-ui/package.json b/web-ui/package.json index d1bca3ca1..7c47996d0 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -15,7 +15,6 @@ "@chakra-ui/icons": "^2.0.12", "@chakra-ui/react": "2.5.1", "@chakra-ui/system": "^2.1.3", - "@chalabi/chain-registry": "^1.25.1", "@chalabi/quicksilverjs": "0.0.2", "@cosmjs/amino": "0.28.0", "@cosmjs/cosmwasm-stargate": "0.29.5", @@ -25,7 +24,7 @@ "@cosmos-kit/cosmostation": "^2.0.3", "@cosmos-kit/keplr": "^2.0.3", "@cosmos-kit/leap": "^2.0.3", - "@cosmos-kit/react": "2.3.0", + "@cosmos-kit/react": "^2.0.3", "@emotion/react": "11.10.6", "@emotion/styled": "11.10.6", "@hoangdv2429/quicksilverjs": "^0.0.1", diff --git a/web-ui/pages/index.tsx b/web-ui/pages/index.tsx deleted file mode 100644 index 9c1c5c339..000000000 --- a/web-ui/pages/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Box, Flex } from '@chakra-ui/react'; -import Head from 'next/head'; - -import { Header } from '@/components'; -import { SideHeader } from '@/components'; -import LiquidMetalSphere from '@/components/ThreeJS/liquidMetalSphere'; - -export default function Home() { - return ( - <> - - - Quicksilver - - - - - - - - - - ); -} diff --git a/web-ui/pages/staking/[chainId]/[valoperAddress].tsx b/web-ui/pages/staking/[chainId]/[valoperAddress].tsx new file mode 100644 index 000000000..e69de29bb diff --git a/web-ui/pages/staking.tsx b/web-ui/pages/staking/index.tsx similarity index 100% rename from web-ui/pages/staking.tsx rename to web-ui/pages/staking/index.tsx From be6cbf1e42e266b35b14be9c4626c6c7368a0b3b Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Sun, 31 Dec 2023 12:47:11 -0700 Subject: [PATCH 29/40] fix dom nesting errors --- web-ui/components/Assets/intents.tsx | 2 +- web-ui/components/Defi/defiBox.tsx | 11 ++- web-ui/components/Staking/assetsAccordion.tsx | 37 +++++++-- web-ui/components/Staking/infoBox.tsx | 77 ++++++++++--------- 4 files changed, 78 insertions(+), 49 deletions(-) diff --git a/web-ui/components/Assets/intents.tsx b/web-ui/components/Assets/intents.tsx index 6a6d40e23..286dda92e 100644 --- a/web-ui/components/Assets/intents.tsx +++ b/web-ui/components/Assets/intents.tsx @@ -36,7 +36,7 @@ const StakingIntent: React.FC = ({ address, isWalletConnecte newChainName = currentChainName; } const { intent, isLoading, isError } = useIntentQuery(newChainName, address ?? ''); - console.log(intent); + const handleLeftArrowClick = () => { setCurrentChainIndex((prevIndex) => (prevIndex === 0 ? chains.length - 1 : prevIndex - 1)); }; diff --git a/web-ui/components/Defi/defiBox.tsx b/web-ui/components/Defi/defiBox.tsx index 118f4b849..3578e903a 100644 --- a/web-ui/components/Defi/defiBox.tsx +++ b/web-ui/components/Defi/defiBox.tsx @@ -16,6 +16,7 @@ import { useColorModeValue, ButtonGroup, HStack, + Link, } from '@chakra-ui/react'; import { ChevronDownIcon, ExternalLinkIcon } from '@chakra-ui/icons'; import { useDefiData } from '@/hooks/useQueries'; @@ -111,7 +112,7 @@ const DefiTable = () => {
@@ -126,9 +127,11 @@ const DefiTable = () => { {asset.provider} - + + +
- - - - + + + - {filteredData.map((asset, index) => ( - - + - - - - + )} + {defi && + filteredData.map((asset, index) => ( + + + + + + + + ))} + {defi && filteredData.length === 0 && ( + + - ))} + )}
Asset Pair + APY + TVL ProviderAction + Provider + + Action +
- - - {asset.assetPair} - + {isLoading && !defi && ( +
+ {' '} + {/* Span across all columns */} +
+ +
- {formatApy(asset.apy)} - - {asset.tvl} - {asset.provider} - - - +
+ + + {asset.assetPair} + + + {formatApy(asset.apy)} + + {asset.tvl} + + {asset.provider} + + + + +
+ {' '} + {/* Span across all columns */} +
+ No entries found for this category, please check back later! +
diff --git a/web-ui/components/Staking/infoBox.tsx b/web-ui/components/Staking/infoBox.tsx index b1f82c0c7..64e6d8508 100644 --- a/web-ui/components/Staking/infoBox.tsx +++ b/web-ui/components/Staking/infoBox.tsx @@ -33,6 +33,22 @@ export const InfoBox: React.FC = ({ selectedOption, displa } }; + const renderApy = () => { + if (displayApr) { + return ( + + {displayApr} + + ); + } else { + return ( + + + + ); + } + }; + const renderUnbondingPeriod = () => { if (!isZoneLoading && zone) { return {(Number(zone?.unbondingPeriod) / 86400000000000).toString()} days; @@ -72,9 +88,7 @@ export const InfoBox: React.FC = ({ selectedOption, displa Rewards - - {displayApr} - + {renderApy()} From ff3f5f2c5bd509589ad2f194b65e977bd1e08e8f Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Sun, 31 Dec 2023 13:22:40 -0700 Subject: [PATCH 31/40] readme updates, add validator name(s) to staking modal confirm section --- web-ui/README.md | 32 ++++++++++--------- .../Staking/modals/stakingProcessModal.tsx | 10 ++++++ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/web-ui/README.md b/web-ui/README.md index e5c9285b1..433d7e5d9 100644 --- a/web-ui/README.md +++ b/web-ui/README.md @@ -33,32 +33,34 @@ Please ensure your IDE is configured to use Typescript v4.9.3 ### Development ToDo -**Staking Page** - -- figure out a better way to fit the custom weight Ui into the modal. - -- need to handle number displays better, sometimes they show NaN or undefined but quickly render +**Governance** -- need to update any QS endpoints that will potentially be outdated with the coming of 1.4 +- add liquid staked governance (when its built) **UI/UX** -- customize wallet connect modal +- customize wallet connect modal / Utilize useChains solution for pre 2.3 from cosmos kit -- threejs liquid metal sphere landing page +- Finish Mobile breakpoints -- Mobile breakpoints +- find different assets for side bar -**Defi** +**Mobile Menu** - design -- build +- font size / style / decorations -**Assets** +**DevOps** -- design +- make onboarding networks seamless -- build +**Assets Page** -**Mobile Menu** +- claim rewards claim.test.quicksilver.zone/address/current \*/epoch + +**Staking Page** + +- validator route app.quicksilver.zone/staking/chainId/valoperAddress + +- fix succesful transaction on staking modal not taking you to final step diff --git a/web-ui/components/Staking/modals/stakingProcessModal.tsx b/web-ui/components/Staking/modals/stakingProcessModal.tsx index faca6d042..db4bf9a36 100644 --- a/web-ui/components/Staking/modals/stakingProcessModal.tsx +++ b/web-ui/components/Staking/modals/stakingProcessModal.tsx @@ -474,6 +474,16 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo You’re going to liquid stake {tokenAmount} {selectedOption?.value} on Quicksilver + {selectedValidators.length > 0 && ( + + + {selectedValidators.length === 1 ? 'Selected Validator:' : 'Selected Validators:'} + + + {selectedValidators.length === 1 ? selectedValidators[0].name : `${selectedValidators.length} / 8`} + + + )} Receiving: From 30a3a9eb90380fa0117f73d59542e5adfc82a556 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Sun, 31 Dec 2023 14:58:55 -0700 Subject: [PATCH 32/40] re add interchain css for modal popup --- web-ui/pages/_app.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web-ui/pages/_app.tsx b/web-ui/pages/_app.tsx index 78e690d9e..9c2b37245 100644 --- a/web-ui/pages/_app.tsx +++ b/web-ui/pages/_app.tsx @@ -20,6 +20,8 @@ import { Header, SideHeader } from '@/components'; import { defaultTheme } from '@/config'; import { useRpcQueryClient } from '@/hooks'; +import '@interchain-ui/react/styles'; + function CreateCosmosApp({ Component, pageProps }: AppProps) { const signerOptions: SignerOptions = { //@ts-ignore From 1a33168afe4df3dc9049cce707fe438bac58c2f8 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Sun, 31 Dec 2023 15:37:13 -0700 Subject: [PATCH 33/40] begin custom wallet modal theme --- web-ui/README.md | 2 +- web-ui/pages/_app.tsx | 49 ++++++++++++++++++++++++++++++++-- web-ui/pages/staking/index.tsx | 7 ----- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/web-ui/README.md b/web-ui/README.md index 433d7e5d9..8175b5142 100644 --- a/web-ui/README.md +++ b/web-ui/README.md @@ -39,7 +39,7 @@ Please ensure your IDE is configured to use Typescript v4.9.3 **UI/UX** -- customize wallet connect modal / Utilize useChains solution for pre 2.3 from cosmos kit +- customize wallet connect modal - Finish Mobile breakpoints diff --git a/web-ui/pages/_app.tsx b/web-ui/pages/_app.tsx index 9c2b37245..a7ff0a821 100644 --- a/web-ui/pages/_app.tsx +++ b/web-ui/pages/_app.tsx @@ -7,7 +7,7 @@ import { SignerOptions, WalletViewProps } from '@cosmos-kit/core'; import { wallets as cosmostationWallets } from '@cosmos-kit/cosmostation'; import { wallets as keplrWallets } from '@cosmos-kit/keplr'; import { wallets as leapWallets } from '@cosmos-kit/leap'; -import { ChainProvider } from '@cosmos-kit/react'; +import { ChainProvider, ThemeCustomizationProps } from '@cosmos-kit/react'; import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import { chains, assets } from 'chain-registry'; @@ -18,7 +18,6 @@ import { ibcAminoConverters, ibcProtoRegistry } from 'interchain-query'; import { Header, SideHeader } from '@/components'; import { defaultTheme } from '@/config'; -import { useRpcQueryClient } from '@/hooks'; import '@interchain-ui/react/styles'; @@ -85,6 +84,51 @@ function CreateCosmosApp({ Component, pageProps }: AppProps) { env === 'testnet' ? process.env.NEXT_PUBLIC_TESTNET_LCD_ENDPOINT_OSMOSIS : process.env.NEXT_PUBLIC_MAINNET_LCD_ENDPOINT_OSMOSIS, }; + const modalThemeOverrides: ThemeCustomizationProps = { + overrides: { + 'connect-modal': { + bg: { + light: 'black', + dark: 'black', + }, + color: { + light: '#FFFFFF', + dark: '#FFFFFF', + }, + }, + 'connect-modal-wallet-button': { + bg: { + light: '#FF8000', + dark: '#FF8000', + }, + hoverBg: { + light: '#FF8000', + dark: '#FF8000', + }, + hoverBorderColor: { + light: '#FFFFFF', + dark: '#FFFFFF', + }, + color: { + light: '#000000', // light theme text color + dark: '#FFFFFF', // dark theme text color + }, + }, + 'connect-modal-qr-code': { + bg: { + light: '#FFFFFF', + dark: '#FFFFFF', + }, + color: { + light: '#000000', + dark: '#000000', + }, + }, + // You can add overrides for other components if necessary + }, + // You can also specify 'defaultTheme', 'themeDefs', and 'customTheme' if needed + }; + return ( { - if (!isWalletConnected) connect(); - else if (isWalletConnected) return; - }, [selectedNetwork]); - const flexDirection = useBreakpointValue({ base: 'column', md: 'row' }); return ( From 2fea2d2ef94745f2760f4dfe33f8e4112a05ff65 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Mon, 1 Jan 2024 03:31:36 -0700 Subject: [PATCH 34/40] install chain registry fork, update some endpoints, add more wallet modal customization --- web-ui/bun.lockb | Bin 432094 -> 432937 bytes .../Staking/modals/stakingProcessModal.tsx | 4 +- web-ui/components/Staking/stakingBox.tsx | 5 +- web-ui/components/react/wallet-connect.tsx | 2 +- web-ui/package.json | 1 + web-ui/pages/_app.tsx | 88 ++++++++++++++++-- 6 files changed, 86 insertions(+), 14 deletions(-) diff --git a/web-ui/bun.lockb b/web-ui/bun.lockb index ad61b61cab9401ed7ba1ce36f490f2199cacbe43..b2b669b6f3102fa0a43098effefdef9af7f777fd 100755 GIT binary patch delta 82246 zcmeFa3!F`5`~Sc9n4MWlLLw3>Wz{B-biumVVu!mkLg z1d{CtqpX$dyr*JzFmGKaew1w-bHfmu@3X)yRT^me^R->ioVjZL9XMt0| zy5N13t!k{nP6l5C)z~m))&#$#PRhN$wd28h*jwS{*;m0c!Sd8e`R;>M_&QMb^B{lG z!iSAg7zO3s{#kv855!M7bf1pr$Vk=whEi35MN|Z;FfS{!UqMnNKau9ht^>+HF}@q6 z$e-;%rEf^)N`JDAe*|}&5r_r~S27mlm*sYB+-`LNAYQRIF^67rQsqk`8{1Q+tACzfa`j`#BllW1&Zs5>i{R15B$XG4S z92ps^sB;^b7NuIgA;{<|Jj>#(CcnTli6-4?@N#wEAr}w!gRte1uNh#%zFGYSHEt9L zTzsLa&}Zicn)w-i1)&ySaghng%Fd1qD~R;lhpj=h8LSFMh78KeixlLqbBp8aL_Z^y zs#`B;vL8xEsrXZ{H8b|n1cf)b#NhAwHuzV~If?PD+=nn#<%a5wjURudsw#aCs3HF@ zDE}@6{h>SC28;(4F$>fXz6w+YT7dHJ`Jg(o5=g?rBNV6%cY(4$0M((xhUORa%g+xy zm1-(H2NXXfbI8z0|3F|3@zlU2J~DI*^0Om-sqvE#>fzaVK#o3UJ@8d?Q-PR=e(!;M z?9jfog{j~+Q0a3(6?_vY4{dE}__r-S2l_+z5fruXNV*w{6Ua~rCxlH4J_c3e2CWPZ z%e-Z%T)Y`x74Dxo${#6XNGChig*RZUOQz5eRiIiMVl8Rgs;b8ukvTe3yf&P+nI4 z(CiUefwdi3Iv78NuXQvDi$N98AJn89m6?;RmNvQEWY`dtXR35I6+D7n8#^m6Z)jdp z*2wZ*Ou9YrmErph%FMon^q;{iUnXzTfb7hHv5IZ&5;X~a>}p!r=?YW83=*gh-^V@& zJev$p0T*0pa5gB9G`q@FtfDROVOn?=eD!W7-Y8HlzY)~=W=DqMS6pr4JrzaKsGio{ zRD_XRFlty<;P=z&VdBXnimw*eqgATV?@zZw30K84dYXbS1?7p@7`P(Nc%s|2rpux& zAgU07lf670@Oqh=O#szbIiRN3RiFxP0jf{W18ab><>(^vQNgEzto?gd{n{F!}AL=*)v3Pa`82c!w__uHh z#sz@~iLd7W$V5@PeW2|1pw{D;!77wrxDZ7(8jxd#>?~{F4XQ&Xk&!xNIjz=eFdx(i zx@o9!_!>|nC zubjjBrda*6*#3~Zzw1;CpLx!BJEgL-$te)na)+I2Zf3>man;7VqboMc=swZZ=yK2@ zi<3yCn*Kb_B-Vt^&kh9KyG(f2$gF;uWY%+%>Gsa<;fmFxVJx+CSZ2YXq+7B^HMVv` zP`TCy)x4^p{F(r&Ikygq^czHOk$mz6D^D?{?*SD*GtUnW9H2Jx^9xf=`X52%+cz(> zUsgWDHg}o{SO%U-fOC(DK=lV^5A7QmkFA0i*@WB4P|fu2Gb{FJQ0w0HU>z_GtP9oz z>w!PtYy7?wRQM`TgKq&?D{xDo@Lm+nqkK>cUvC?sGpGu+0@dQk(7devoK-74Xj=5^ z4CA?PEPe`BA>Jmi63AMWI~>=n#6AuCSvR**o#;I?O|FF&ADCqZz;JApk~w5lPG&*B zL0cFmHLx9qjcRrLAydo4BMkrYY}1P$V^nhd?k8NH_z=`o`N8rpSiA5^!*2wY@27-oM)!Tncw)7U z_a$~Erd#2B2z5~Y0)s0+6>v9vEpSGWaqR?91r7%l{|j8Hk@MC<(n|zKDKYAX-4ipW=cRK=S=w5pghLTJD_7P zw#H!J$dLY#Ap`S!zhLSY8!B@sM~)htpG1`!2bwH3^?MD}7)-YHEq>87{M2P;$dm(> z?<4RyDq1)ZMIOopwK(+8%FY}`1+K?F13U1N$>6|pQ{YfMuLAP3az?1({pm(EcvL2r zQ27Ocn4^AQ0b3yH`sHO649+(fx7P;>&wa(zEVfgxiLDGz0p*d&D@>P-0yTGU1U2|? z0Tuq-s|I~HP;opg2L|4Br&p~L{pDpdV7>;GDz;~61!&J>1ur-on zC%507)CymD%k)bmKQk|no_Q8qbNp1&odtFUD}fC`x#Q>>Q;rE|j>kNZN(6P>cT_|L z-UikMV|N!~muj&^=}J!_UWA{69h;iJuVC!1MXYPfZ#EUu&4j2%%qi~6fp<87v( zXDrSKHN<0A(=)N zzw0xT|H~lfs={aYm=pcO*f^nZY}6`O*$mFdmvT)vGFE|quLZFdzejwHji&BN6;#0|f92;NEj&!iRp6)A11-Kb6{-!Y;CN7js^ei( z;64)SRQwCJx^6w`lwoaJD7!qPP_t+Oyec^N8*|Ej#pXW~RD~z{>6riHsF5P(`2@Rd zPC3^Zpas~~z-h;fea4Sw z<-7?zHA=uqD2n(M5tPwhP)lzkP%Ufrv&rB|P_tr=#X6wkUqHN*!Nzz%p8Vz)GZqd} zusm`Kyj;H%Tji{`xB~1gV)=11YG**Gz}}z|)&-SeB~Tgs$Y4@SNH#$2$=y%>EP&p4h$=IFC2mM9b12yW(fofWFP&p4t2>Lmnhpn1a2ekm4 z0;;J6C!2U1LDg`8?$~7Z8`QOe3E$!P>7s>MHbSe4LBHyoKoxX55rr$U<$`BH75tP9 zZwjiQ?xa^|-bH*>v<0?&Uf*I>8-9%Nn((_ptwisF)wF|Lfub66iIA5yFl*$~*eWP? zx_T5_Et>(V(+7cSaW7C6O9z#{f#oZMsz99On^rRw`iU7*)Wz zwM+ryK(*`(Yu|a6Y2g7-33ge;Q~6m1x>`%h$s864FgXF{p|@4yuKjBeRnF zaRD{M+EYMP@J8~{aDVb#6YrAqjHhxU+$~{iH#mRjkfsd%bK$iEnR#y1M4U(h74Z89 zDd&)(`f3p2wZWFyT4}mpU@~|V)EKxNRF`n?X`t?CXEZSUfXw`YTnfy~8lE2+Fe>mS zyvmuFXwq-G6h(t4*(PXiGc3p)rkf;zXBrw0I23#)@t$#Cs(nfH#w5dDeo@e0foEN8 zvVHJEZ$hkEZc)5}B z>jF^Ke#F?(!YPeSfIne|4GTPABMxg~GS1E#F@$mg1F+RGZ7g;L)r|gGS;Ke^6_`jm zHGdSS4!H)b4{}Z5-we*o8#pX8FP|G-N%{S`{m`E9Qv?0DE=N&K8-f~YYFQ>j>ycE` z5wQ#40bG0}4IdWByv)S!X>nLm_RxNr1=J#&kx>xn+1!NJBtLcNez#MdI>D80q)wg0 zg)K~;nG89#>Qv&WvN5m6S^G=3xXuNApG!Ama3-krW)Ih8IvcJ9HIyc_3i|tjm#|e* zOLFwbVul&}*^%s|fx{z#0o=JR$O;6e!Yh0%C|6}?xXtTc+}CMqidhe8v4}mwi`}Sv z6J8^738=Xln<4|-n;uyMD*P2t*)Il_{qzoI$UM^a`E_+4tX896c+^=fqs33nskx^@ z`*G8rKI7MO+P$`9^F7bs+-zI9=UX*Dcv7pnv>*@|`DlPq76`n4-&I3}m(r}Up+KPR zr9;Nv7dR7g6JLM#IaGUht6>d?RaPWS&gwG$`#J1t!Wp0Ge*=`Y^AGjrL!_KJ*fj~zZ74Igu zNpZ$t^}-6dxvf)zo86*zVW%2CNP(;1$LNLC1S`%xd{wF&X&(;0>lU>SI~v2Z2fny{ zO7K!Qv4biW=@53d5^_x}#JP|m*~ZUJ=@UDKX;!3T*qMxnuQIVRQk?BrEwIYD#ThAa z)hfCTJEc2I>BOrcgKlp76sJ6^T&Wf6jn&Id>XhcJMpH&6Ry8_Ig@;u6V8kuDJRE%7 zExA1G>>wnAkP3c<8@rLt;b5v;#ODCFq;oj*Aamwo8# zLT=j>=Q=D#y)AML*3G3>0~Uorvb^Hz!OO}A0$nhCCpljdba!dQk*5a&&9Tb4$(>T1 z-VDeaY*=anh8kg-Ujy zH0CrTPsO{37p6ElSbrNhE3o9MIG2uzt9-WGut&OcC5uZMq+fW@b&Gn0o%i4x$GEs) z9k*f6^kA+V=^1v0)ipis=O3KwmcVU;(E5C9f-MrHmGa}T+PjDHeOlwgbaYiNwv?E*;H4f|)(4E_8E#4MaPVq3 z@w%`xpN;(GCf=&l1dJ9Y3r1!O&J+rwqU}6X`2$f#Vxuy9GVa3=N}im$ZeRJ9=ewCn&u{Drm->>Wrm&O*mjoC z%-%_Xz!kB|J5OPyVwo=Z1gq2`!86^GzG3G|eA3L1PwxjOx{-e2;BvQ!&u`rlJ~Q0J z{^8KLO9Fw;er4Z9^BW#l{!;f~f0~D@2nu}zw;uJpC9&`d6^82pqmuthvdPk$MyfMYb$=nYyvz)c(+4!r|H*rYVxq#)wOoC#@K|i->NI1CP zEg2GyJ3rk$I3zuk#Wd*T9vYGsdIqh7ubmY32h@->rvn-}XmIyS2~Kw-!@|x1I88s! zdn`IlP|ajynNg#1!@(!q2%o#$qTH}kB_p;(B|n>*fT73%_b>x&DwYNqD+&I%#x2SV zI~TPvt1hRzeksm)tWJLX+|DV^J6Kx0%oIMUEf2hmMP6gE2qsL6%`Pl5S2?7s(=HI8 z&c@QJS`ZF;Zb?Dd`HT?t2&eo`DRF1CcLxto4|QwrJGdY%F1~|%aCo}YszYqBYgrqO zr5SG4#C2}bh_G`;N7IsWIv)o|yNS1kLkHjn`2BtbO|X4H@9@a@*08eyP76?ZKSfJ7 zGBWH8xjg17Id%b-8C29Qc&?i`D(vKRHs>8CVds?42CP(falbUD3QMJO3uti*Ugai^ zW-Wx%62bY1b?Iv?oWc;5=bLmjlbMl7N!eIxQP4fiLiq}o@}dXYrNouL!d*BfJ=C3k zYT@RzP7B`aCf*hfeTO~JO}Z`3xt@8cF6HFL()@z8%n9i`tk!F;i7W>y)@tu5lX{rUx%~BZXmS)-|SGC#lV3SyC7dHg*%og@Z%f2%pcoMSLD{ zOU8wr?mc58hSk%#AInSvd>7o{7L8|Ld98bJe7ffP9pPY+8@YpR(Y0kx3!&$Gv6i}r zo@$ZM+iWYDLgdv0%lH~AG#~2*{{+LbOMh#g5vem4&9v4WEDcgK-!@@sXftUzLshw6 zeq(WP?nkqeqdVIKEP0*|W>%i%7Tp;Rc6Uqe42PE8z(8=5I;1&2p)p1^W$3x<`j~Br zUjudqC3i7M;hOtp$z|ubkxAj;O>WVou=C)JoTvS?#Wdp}R$G6lUwo4pSS-{G^#N|t zy6=cu)eC&GPWtIOeAQ$kCznz>0m z)0{8R7}14s-r>r@)P#PqdNM7vb(tD=R>9fDmLdKF7VB`~N&bfUlKy6Dn4NwmmZnB| ze?vAOOEJv|-if8jKumm8E6aG5O)KNM50;tM$@JMQEXAaiT~pnXd%~fM2KdYKJ!zqV zG0k}lO-oS)Hsc)M&$mK{Wx0p$Neeb|6Q_rRgWL$8 zZ@5L%!%l@r>2`xXPID~HOvhgmM`PKUF+4?s{r+&=*@NAM_ov78_Q82zaB1sqP6>U8 zb(y>P{xql3EwP29czQ}G1FI8!i(s~U@cwXowlUK}Q_#9AL1-6RJ6}6Dhe_^hx1n|Q zwY5H%G^0iQ5PacNozYtQ+IqCkzE)$X&PK}aR6NZ@{py&Fh zI1gi)KGtQ!2UzlL70WbrbWv^K}zr;H!>&e^x{OQ z#ncSU*;tMJa&ik(ocFMjvC8}Lm$;Ef!p=7%O`GumZD};hxREnO&y>&*tXBSHeg;j; z5EJv3lu%$a*As3|$F$HjXzjhlXR&!l(`sfW%R#K3Smx~BX-t`Ot1}j>xgS&K=TESV z&(*#BWPw^(+ZH?ia| z7Pf0s6EL*0($p(b6K*$?)SRpev3i(1xCls$YPu$|l!gn9KTh(O*fCfa`)AoAG?Q=c z^pxOEx8w=-SK~@22es{ul}3(CRrUdoyG8Ta(Tq2z1qLE5ABfe+ua2x))?%^a9Q_Vf zGs39dfD|WqM=WM;7q0ZMY*>$!Py~z9apyE=KALSgIqbrcm(AjN-UQ=i|GJZFj>v*= zaFJWIARPLbkk)R_@U+m`6S-=27mrADGSO5syw)?taj}%I*&(d5)=6IS*(|qMnrLSJ zTzF@xSK6n9Zo=|U1-iGeFzoEaZtv%#7M^>T@vO=9CM@}ramR#x7)y0$46}HBh^5+a z`-OCoNoId#PJzp?wA3sT+BYNR7v6U$VV zd74%?o@zX6THOyzCt)n+_N!PbkNHFi<)+0d#%V3Cc}0j>(J%*4UT~6q*@#uW6X6#B=wVX>6>7>E@cySbec> z^m9>lU&p$+)T(=bY;&rx@mM#MhV8=oTe=o*?AC;0-iOt*H0D06t4poa2h3eKQ~G^a z*OZ3s!BX2zYg^1PZ7@TBG?p0@x{NscL94VE>66t`60h?QcD~osoyu z$>%kv-ow)7!>p_oAC8^D7&@V=WVws)PSZ`HSHhwCbEt&7_?5KK9JDK>ahV@k5f1iu zi};-9maGUnA3b7R$%_9(N~qSO+A`#<;0%G*($}V=rTN;sXc@j%ajxZ@j%a4KC1HmHB39P(p{4U@tduRoIya7dE9b z*-m=WoCo|}gp+|~!iq^f{cjfK?83UNwAAWPmF^G-%fo6}8ny(>=0eynSUS^~5>gkG zwZ{L(+Je=!H0C))Wm~xbt4(Rx7g(l**eOGO>-`N#;#u8 z;q+i?JeGgME4bK=tP49|VyhYchAY_HEm;>1zUn5v6L!8`Vpc?R^EByMGmE(jpu|k9 zW`6ma93GZA{cvIqeT>DOKW?I5TpZ)odAZi|*9cCgiR;78Cvcjf38X$5)STAVys8_GX#wg|ozZ0eT07Y+_{6E}pN7YMn8RGdiOO9_3B zmF^zuo95Je!K?%RHB~5r)lplvV6hw77!H2n7HtfNIxeMsx>^d|j>f)uV_N6~G^Y8+ zw7BXox(C;#hgQ9)!-w$(lB=UYZG-ny3Uu@_Tv@4{=B`sG1CwIAN2R+J^ ze;kXgJ~>x;$=}11^OY~T3pb`aGa)pC%zk1&mYl(9E0a_1UyM`zYjLLsmO8@UMe_6} zvL(z_HlLxYFROMrThc<^(b%zUN#lNR(9D?MW~Y?@$Q zOiX{D66%Z9+)dh$<~)q14kkZ3_&qGO$yo8Po7S_NVTYTF)t)f3&fShBKe0k}ObNd3 zCVs@Qg-d}mdy9rE%{pLC4+F8ZVi;=?mP*CT>Z zs~y(K{-$=yYO|=Y#eJV84eL_E%(?B!=t zm$yhjxeA(=b5?o`tC@c-vJI`3iB2EXSQEQTsP%scR(rzC#r+Fd%GhjsPF@>ZxU}u* zjn&i7ophlkSUhZqwunc$+FN{butoejG|hY6eEmG^lzYdtg|qK~6mA!ld>#(n4#$px zdG#t9H()pryV|d6^4;9Y+Tb?apB|dEL1%WkuhK^2Cx3S7!RG$3Qv#>7Mg_CRhqK}t&yLjW<|Bl zrCr9=O>Z}HFdTXejz*H|lTz)h4}51FNQ>+7fqU>kdfbCPgto%_ah=n*#7-`3jY3yq zaYvgx9un_sThO}uk2)HB7@K`sID27rrbhm}s`xn86{=r=FO_i>aiKdmBca^k4+GvU zrvzJ8Y_ip?%;gEL?iO$KgX8kHx(g4b$FWo<+z{5)I4c>Y+=&nSt~3x zpK}?Tjy$Z^zB6>^?G3E9x&(_mX@@)btMs_OJKTj|r8{$Xn6n`RxF97I|B>IcwycUD zxr4t>cZwi18_gBysUMsD8FQJ@c`a6kUz|=zGqIW(OX~^N<;J?4@xRk}fr^btO~B~j z2Wh{!3F{W$lDk^$D&5nv{h5TN!l@f~cplrWv3}@KTIf48&L4-;;#z#>F8nq<^xbC~ z;t)=k&r6%bhI1CyE$*SVX-@o}Sj}|}))lLt$rx)B)=e=hbm?CI)-GwLNQ?2#J}k{> zR>8F?aZUEQ4Zlx!hVC;pG#6Y4t%ZB;NQt{(zk84Y(uw*xEbc4Oh~sEI{JLFp zAP~rml@nTu)x|yZeOg?w#2tJzJ=C(qUnIXzbH<>lN6CLJ&jhiIi<7r<U`D81aZ6Bk$(O>1O#qe{`I+nI{?_b@)Kczbt z9x`K-vX63sixoCire_vlaTly@8c)t5KZl*PFJrw(569j0rF-z_^tiXbbQ}JX?$rIt z)S3yws2q&N!zL>EB%0hy{&%N1-M@|v7`iL;2-fv}m5-raX_~?w<%YwiqO9>eHhBW8 zcPuPa^&9_MgOPm0H}1mY>2WK*aSt9(51sR^CaRh_9IYMk&2`mZu&z}Zp~~NBFy$Oe zi|h8C*Dx4NckYF0V{&Gey^p2kn^DQou6HCBrrRFt9EHlis zzdDMg(#ZwqxBMXx$WpCBkD;~ql7hjs&;isgsz|8Y(OBgcps}y`Da|>EW+q2+Zi>_H zm~n;QJ#ll6c?aXEc)cG@r?J9P@w>6wQlz=kcn?dxOc8usVkro=t)lh^Ph z(r<#*dPOC1aOa<6OT6a$60GKaSn?>YcdTXh_vii+J8u_NGxnX~SY}9Tj=lD)w=f}?9y$)o$@c5CxR%HLHE_)F(xz`naW-P9-)Yv@+!hN2 z18sf(IXS4MxjDYgV9+c{UTzca7h##f%`|qFW0{UpeSg6+Ue^lP zJkI3l-?54t9_KYY1+TpY+ky(QM33QS1z#M};PE#bp&nSNZVtn58d_KQir(Q$Tq48= zIa4O}NQ>*u%&izq4=(T$PYs5hYs;I8`n&bue6L94K}h)?Z?kBg$G25YJK2LcAPhhEA@XOCBp%Sc~{zfu3 z>PCqzD+m2=O5r@7xy`8T4X(x@+Yf7+o>av&of@%q%fd4C(*|z|78^XeZ!enM$^8~$ zT~O6@x#^I8Sk_J3Qxh=MT;>q>8;@hLp=_TPYInMNMtk2`Xgru_PyQ8}@u+548@^j> z=IddKxC=|oCm(uwGuDl!N#vS*22JvtIvK4AJbOzXEv@iM&J2b_KSFYO)Hf~EqPjGm zi#oTX+3Z+h*I{uRlo+S-JzFji*oa??rt`EvG@KW)G^hh!@}*1>EK@c0Of$ZND_<}T z)~AG~VqK*h(4nu;xEP}cTGll2S!?@pZHcA4*rn2wE3mYtQ_i6jrzu~nHNC7Q%fm9B zRGBt&!#K< zx~N@au*}5L_ItI${MOW}V@3#zEwQ>|HS@FARr+MCUVaWb-S5WgDPP2;)b$qDV+ws- z*Z9gz!)EoohUdWEThEMiHoxq9)?@kGM7Nk6Yn>DGod(5CSelqze6l2aHjJ|=Bl{z) zQoqJkKi4~WE(^&nFY!FqjMVeYBs8bHJgihNr&=)0c>&dInrU-zpO;vl*mdjM4)&5S zqPwxoc|iBtpTkmua$a&}e6|PkBGZ2AaN7B1V6xop=TZl&ukpqJR%)!lN~nuJ=O(@l ztRQ zCDLhyW!LL2DWU0D=630)Xm+(?T|A$!9*6yjoQ2kj)ZCILua~fFXXdARk%qx=+{G7q z3mdXR{FUz=-{>uFh|3}u1^w$??&vQ_aT58$a#M0R*&hxOEZ;l+P3_rO8hZ?N&XOCj z)On<1T$aDsbh ztVU)y(Uok}gN;io#hLF)EDbfY@tt8Ub6bBCmVD@+6`k^YD_SubqMQv2vFvKdmS_#u zrG6MUXPl#@G1a6dO-(wMREGU9EV~SUo8tThOC?Y;sR*|Rvt0Q zh2{HutY&(8>0FdzdLqt@Z!G1EF6Mg)$$WdwYFN5Jn8;46qR{lm|v#IfK+&km3ZXl*v ze|KT^!1B8|u5l}mue5Vr+bS5l=gW1*VJt2XpGb>K&hQ4eq}$j@wdB-zAcL8#=Lm6i zT6+!CNq9}`pnt!L@tTq6zyE8uwQ5Ks5}#~)!lAy*@D$Tdh1q1*hU3`YHodO<7V zb%-KfkCaFHB0ByI6~CV!>$j*13`7!;p@`xQLv;KNqoyVKh7XiQRcN^7g=+CgL>Y~; zI2sf`7C8l(jHuvgh~nLY==i%x`F_NEK_zsp{Q#&#sElSHa{ZHt;w?nPFS7VFs0u%0 z@mcURH>xe443Q_vEEmnNTDjUFZ-img?3(i!&TM!*(v7A@2eXx#d9N4Z8jNM=fNwez6}?OXPaWYgW?}$Q5mvr@C)F)?;n4J8pbT&ems_1KVy~_ zzX6w9zKi9%TmD**zd$ek2hKlwVbwqzCiXvsDk}FBKBeUGQO-Nmk#709V=%%0h$>)& zK7NN9nYY1*z;QNQC|67a<=Y294Tzbb;y(iN7kE@3ze9!3hnLG2*l^ISb&DXB(GpOd zT?{JDbJl*r;)^0V{t;9@%ZYz7xC(T@cR^*bULQW%z7ZkrJwDXp%{Iaxp~AP>@Up0a zKDYdzp**mUc)}9j|59v1q11zXsGzSbUl!%5Z!KRIMSW*^p*-+CsDh4x3i?qWWiUyE zxSuTkY$FJj@VK>wab8mAV0Eq(P?fnw#VCiZ=qFjeEXpyJ;T5k6sG(2;jPs_Eo!*sQBlA>fj4O1tnSjVryRts@P@<{4MGP{)Yj7msdtDRDjo` zi(UJ}GND_6Dx$T;wxHV40aSQL1zMEd$=YR6{N?axfH#Bc?*2BOQ0f3a6mMXhUENUp zk)Eee4xu9CTl>#YQHI<2BW!%3(%))vq~*(^{BV05{im=(K1AFJs>PFS0-@}wpjvVt zsG$2TJ|Kfbr~+qL`_EA2%(n3#j#_1oO(>N5sI`R}8VjubN2r2}2v-#Sw5jZ;ZTzyR ze3shq7eO^B^cN{!&J_%0rCVv!31z=wah2tTni20=yDa)k54;@qp$!*`{|HomAA{Pz z?XmV=P>bJnZZOtJCGqNwJU|0DEw>^8h} zIhtS2>vNUuz$-0Z7FAw%cm?&e;eUqepc{#&j_YUR{{z^F=)X;%v;+8%V+Pucgc^y% zWP7!{1?%{GmOLB$k6<}3r(3W(7v9Wpo2)E~8qJ4#?=~AQRQ$0*Zw1Ny;a+Hi%c3^f z_gVhmh`KWRZ9($NEL*Tp^?k_N{|qL0i?0q|;GdbEu-VK9<&LMUy};TFK^;P=i}_Ho z&wz^mthI|l{sJ#pTn1{|z6xptU!wjKVt2F1Xb}L%JHa38672|YWORtjNeR})nBXIVVkh6~lt7l2CN5L7iU1U2x|KpkMz&nUx2Y-_OtsCn7N z+E;>FCwqh1-DZKRz%4d>2&nly0#t=Yf;xn7ED&vQ(EmTDx1C`I?mM_I9gbJE(1B8nBq_u@w>5DUbqY`_*@EKq#Sp+*y6N$wm;0-vTP5 zt)MdAW^p^HihT|$-hNPrQ1K2}TPVB4+Ctd}qn0=bs)mQGEmVewEgrFW%!ZdmRqQ9r z3uXTTs(@cDFXU!+pc$=Icq*v!qG>2j zK^;P^3;iuW$YQn)7gB*}U?_?*&IMI)o(TvHw>T2yFL1lH$AKznqQ%Le`t&|)KLDyh zkAgac%6BfPavlTK^7%f}{|iu*;nSe{@TPSa?0M)W}mKTcO0P5uQk>!Od z_+wD{?6SO2<$Wew^G}L0*l+Q#pb{PemGCQTe+??(cc7N$pFy2wLo{FU%7bcI1yI|J z8kVmKD*rm54x!?m14flmLlh-Q1(i{APz9x1z6+=XSAvRvtqs2()FD*(jiA!s45|T{ zAb){De5e9BmLDRL1C06w<=KFIunGYaL1lE8WE5F1v=P(j-U$e3M%7nHvAfk*IK;JVjqh)gDRjesB{BB9YWcIK{ezSi`gbT z8jzw233vMK8r4>{2uVb>Hh~& zbd*I^;30V7BR0XKpgi-0jW5)!dCv07Kn=1Lpw@x4pwh1gRnZNgj^Ci>zX;W6qs2`Y z-?zBg;s>A(p(?T+Q~^6d4ZbfyxFP236rRKn2y|L-Ff6rhF-Wg!&5Q5Xxm2*oX}*FBIR<@)ugZ zEGj(7@?}vKXaujZa~Y_3X%6jIpJmttWl=S3ZF!**w6%6w6yM(RLZ#~fD&MY_7mB|E zRQ#(fe^nGk^Ziy!ltm>NY5B6KjBmHRP#G42ia*Zs|0qTkQ3=P}g#QRC{v9^HQ1%2+ z6}i*$Lh*N5oMdsb4Hps~4cv{QK{CxoxCc}VAF%ceP)Au*#t*_P-7FjLAsbJqiacy> zq3lOMrF+!kTu|4afhR06AJp+@r~((*ctWYge5k_9EdS4-|KMpk36=57HUptX>+7Iu zyb{!uT?;DSyP%FgL#10!JWc0MKzU%d#m_|JmOcK%57zzl=QmH-)x!VW zgLPAWnJ4SU#bqC;%Q3R$LOoE|Ayh^GUq4v4<^SeMyZY`w^Y5oR9;`DXwBy|jYKb`UU|n9|IPqW|M`-_b;=wvjDD$BH#DjIskP{Eq&FnbwV7>H# zx~^q89zXG5{ltUyE48QK_%qaH?TH8LCmyVqeW0!}BU@wR#Dnz{57tjSSl0vg6A#vP zA#&ou`iTeYCmyUP*(ZiVZL&^0SpWS4_Y)7+|Ns49T@MTchn8J7A=u?m*Lx~#SpD`r zBksGb;r?%L|76dPjU$&Go_6uY2|v9t>C@axnl4XHuKi2gg4;)rE_$a?$J_6CBRYM1 z>!n}6{!HTuW2U`Z^W}A96%71Z=~wc6KF)h%c3e-dL0(+NE~~D%r%(5Z&)xG*?kn$3 zN?!ca@SobB{r2Ol&M*A&jP9d%JRN=IFW#>!>xaj`)IKMBvDrsYArqTtx&Kv_V@-~REV<0wrYeh5|3z2ji#1?PVZ4lc;>=d!pOB@R^>2`=|VRC);~^H0gV^gG6VdAqh(6;X_IpL+ArdA)RJ;SC#Or+r#BvcUM10{n6Cegngvgly zamaf~M2$NkYEOjt%8N{dSR-P+h{N8QcS4N33u5e@5Z`)hMKqWMk#rZt5pUF85ZgrT z6!C+XI0<6XWQb{#AdY$4MWo&h(Q-1xPu}Fo5C=pY67h?7+1(H`r$EfP8{)WEBBJ9| zh^|xOI>!aec@IrtbRQM-3k*c3sYF>Y4Px&+oM6Y`w`b>i;?-fmhNVpfG;ynk z7Ca6SdK{vi*X?nLUQa+Q716;9J^_(1A0q1sh)!Oyh~*-x&4=jhWzL5f^d!V;5na8? zPeRmq3S#(^5LbFDMXV7~|0#%WUhY#6BNsqy5z*bNw*aC+5yZp=5Iww2BDRTWS_E;e zH?9a`(n5&6B6@qt3n5Y$LCjbPalN-&!~qfQ7D4p!rZ0k+`83245jS}mPeXKE3^D&{ zh)nOWh@&EUEQaXk&07qy;2DU}GZ0x`w`U-FErD1nVxSjX0+H}6MAj0Bh*vCPxrl1d zLfqnIJ_|9Z7-F@E9ItXQM2+Vlh8IH&^;U{lBclFu5V>CNa}Xn+hu9(_->dgLM1vO~ zCO!`_+}k8#n~0__K-}t$djVq7Qi#1GMtR9gAyQw2n6VUMjJI3F0TJz9gc$2he-UEl zGKeE0qF%-_h>pu4<}ZU7=N%StR78*E5O;XwVvR5o(xrk~nLrn29Uxpa;3dCv=)4a;BK-5?PG5i&Xd%cw+)`+OT0%E$C zy8>e5s}Ng6xL&d4Z`!ry#_Jqb%?zpW_ii4L!_>RnDIKq zY;U)S10ve3gqY(^UkNeu4TvKm9`!QbfatgiV*VQt^Sr|%j*9593gU5Z-YSR%Z$gCL zgqZJjdlRD9YKWyGp7MgLArjt#$XX3iTMFSO+?dm5X-!A>mVk* z1F=`cOJ4Fj5UKA%%ygkd-g^)WHb8_nK&S5<;vFw@ z6U3nRAy$i6?^S*uqQ+*3;qOCi@K%agBclFhh)rJZW{8m=Kx`4Q*{k;fM1w656F-31 z;%ySKO+?cz5L>-*TOcNV2(eehb}#uuh}5kRGd_g)$lERAfQWWmA$EGxw?fR^2605h zCtk)jh>qJK=5K@8?Hv|zR78*M5TASVwnHq~0TJ2(vDfRi1ESYQ5KBeu_ktfmBzz2! z^$|pgS1e+=h-x20eBot&3^8aY#A*?TyvjQvYV3j-z7ygrZ>5MeBI@sgIPB%_f*AP; z#1;|Xdi6emXz(e-#7`iOc$-9Q6Vdcjh#$OhpF&L94Y60mF)w*HMCxY{Gj>D#RIK;pe`KGz0BOpiT8Dd)}GLzD%3Awqj0 zLSDDM5WV(6EEQ4S3+{tR*bkAl55n<^A%Yb=XFqVVm$^S~V00|k$=hZJ%IUhG?$oP> z0)hV^7yWM)Y|D-Q$6Nf{2J0W~{)_G}=YP@qztHb7FGT;-11?suEtl_=|8LwMx2)b5 zanU%h?iX}KLP*WbU{XZxvIhMyy^cVEPE-woEsOs&dV%MihmZWT{r%3i+*Omp?O1C{QG;s zgmP6|&Ycj@gVjQqz~D$hMEDPLUblpDuW@Br*`ZedVhC0!S2bF9ivRD?g$+S|xTR3F z`ww!_|5m}a+~|M2#lLNE^uO!=!sx%E-?h_eb*~xa4QB8=EOs3I16>ikbsI{I&I-Tzz}-RS=}xb=T7*p};W8vlFl&x-y# z2iHH~1#a~JH{I|5qSAlS{RK&7=eFj1epb$iti0c@0Vi(D{`2>us}1dFu1Dq6!TCdn zGzAxWl`mmyeggi`1<{4PbA;db^B)CdI_dvA&1pk+~{Ned#+n|1xtMGw# zX2>$R1OH~Or9X83w}tT5uuGObm0IrQ)%P!|YySAz!?^+N_xMe~Dqi-l<PFI`8>*4VN?co3LmD_7fRc#j2y3Q^_iTTVYtFOI!~|AT;{7g8zvHih&p}SJ+-f*A zh`kYkw><_PfYbET+YwY5{UYHExTwf)ESZY#*@)j-j>rCiS(f__PM*=L zgRVv4Mza5w1hps)*+=a)brng4@S4iNezk}r2q(2AvQB{<<@8gL(s|RN|MN7OpCMNZN!VukB6aQf+5t$tlBcdgd{8a85AOZFndnU=f4a=qb>(Aiog_1X$mMnBe~Uyj#Gca`O? zM?X%}&jY)`sY`fUXkah#bX;TO^+Ep%E>Zp815z!y5t%{GS_?F~Rme@qy(n4>dRgvf z^!qKRcV{SGCNdsH>%(=H>x+Je<*v6}Ke&mOyFr}#zdtg?l6`E%EVv_x7MB|>Hvs*6 zM8{2*8;E|?X99tnEjI{zyPD3CX}Jh`KlEgQ`Bm;W*?=I4!${mK%?*L9G>boaOF7*PsrA(eaj? zfT2+>@(#;QMAxWp1x~QsoeHueN-I3mkv%c96wcz zF&a|GWE*h``dG`|ZMms%db?gbaEj%op;xf+rdsYExQdpGyBw9g@jf`^b3Y;%c9L%6x#)7C)^XQz51`9iTE-u++zfPiOWX|0J%}!E ziF+{CcOJ$ykXqY48*wK36>wL8Gc7j@y%C(&_F0yD2)(i89-`)^4X#I!sdfpTYa>1imuk6rmYWNA3LNWr>C1TLp=(XK8GPKv zdknn@UB?radmR1Q_`vxA&HMS5d;(o_RmYQ-n~%Q8n|^Y9)#zk92^J8fo_Pvct_pK3 zw9yx!|HX2PELQ~gHo7L))1Xd{3z0RJd(OsN1gH1AFen1g!|@k*8oAbR(ZDhoC0>k# zZDm&2#LvKKMventwcHYPIb#C&n&qBF*Gm93?q9cDG5YOrQ^1v$dk(!8oW}SYaC$FR z;CYNHkQ(HxZNwMQtHSAc3r^}%$cuV%e$EIC|e$;aBT5dU<8u}Qx z-f}OYyBe!H-m~Oi(6#Z=vB7dLqt~p|_2Gw>djtIjIQ8LH%dJAc$#UB)_a8)~d~rYKdC@R~zvIbS?8b4q0vs`spNAE5Eedhv=$=j;}zudMmQe za)&Lq&4#P;-@?g*(d~S+wYB-qk~`ogqN@T&EcX$*-b|&!zK2tij}g6$N@2%ryq)Of zY>R)i+%CBCmix(asZ~&vO@s5j?<>XsnA8kQKPdkS(iy!AqLo{}TK^pKJn{mv6nW80 ztQ>!D^L*3-WH>Sc(aTRhK(-*d8?Y784FFy6>jM8HL>KVyl=r@`9N(~V0_%>0R6ukc zeu|e|CBAdzx~TOKT{WMJoaare5??EN5o!{0F>(oVDYBhb=>qv9_#@gZA5fgsmsWj$iv80I6xcftC8-=c(^-|Tal57?u$H!Jdbe2S1xcM&Z}89zNVu~ zy7+DUj_aM(iW+4xGo2tfF4c_4G zts39B-e4GYk-AYEtQJU1BpnGOt-Q-lr~MsKQxLt3T30cvkT;RHkhc+C#psm;^^xSb1BHtm$kYA8rk>iMN z2n3Pc=$|22>4{$fw9|>mm9{V!cRM+ubq9ZHTtHt&uiJI-(aW zYfF1FqHXM{h+YS-?dx1556MRg5G|5g<3=N6kSyFE=!4|8gb`{bM z(N0h=yJ&zUB6=;1-r6yO0*50baPV+MuM(MpXhV1>5+qEo`I&*}jVv9JPDp2@i(dWG z4y7rg-Qs=5WV_mE;0{!40#+m9o`{+IWQgxAtxbvtIkYBZ{yJ` zf)*f8Ba4w|kR`~oNO6>p?-_AFAV-m_kgJjI$TdhN(ii!J5vO;E=?!XnZ=BvGSDAvV zAm<|&APta)$b|@xyaF#1rwGx`^eIGJT5UVE&3pzKf<(1_9fs&iQdfV^;6mMU)>}k_ zi1x5|BigrWpQ;xeUWPPB(vTKNI->1mDQ&D#A`6kJNL!>G(msxB zg_bDV4lX4!y%8ux#v$X8JCF&;MC49n5)wfMBex*gNDiWxps&a68@%0TvhUu4`XRCv z*@k?K>_m1UdTWqgmaR9-=(RLgB56nqq!qFbAB?7*V~`-(CeT3+atcxrsf1KUY9MDK zwUM)tI>>oQ{RHmxoR4w=(f~ZDjR&S>4s$gX~52A==Dp^Qz6N zHmABFs~fQ0DN_4L{q$vRZ0#S*;hPY0khcF7IfQ(PyaK1UqIW=aH8}(EkeTW=UFAK5 z%tq!Qk0SFBT{BEUrXu@s?g8WrpS5ow5gjjIkL-yqs|>gq{XOS%x! zE_@lX9MRjEU!!F!kv98P!c)<_#f+tzkSd!z%>3Ar5k zmUi6^wx;}=IHopoHu4MhugGyEfc-deZbk~d#kJW6>B-xzNI#@Ml7)0bw3{6SM!ewJ zOx&TU1CZ{BHnj=JF!T!G$%r0dEkpG5s3I$&p0ntA$u49IqDLZn1foYCdW+}Vh#q0A zMb;sDa9U9hJGvLB1HGt zb^l!V%XNQzB%<5jpW=nx$Y;nN8`SF4u6mALO!E0e?@A>ak|qT;A6qX!oQgC-bjMilo7B517bDLg`hCuyNUOWVdN1h%R6;j_9z;AZvrc^V z=>4d=-=q6G6A<0gxf7X$Oh$C~>pSXt1o;6uhWv>9gnW#%Y7u@T{?NTb-6YUm*A0m7 zw7x-+&m+2wjxK+*U|g$AeSR4NJT{Vq|UK=O=?@VWB231!^k&?dO#xY>+L(z zTLl@mDnLdJ=^oJwRC*Dz04YLZd6ccl zA926vnUL;i{D2%qrs2xVtUKj_Wzo}Q*JMs~-3(>uw zp~TZ|np`9gxgOCinm)*lh;Ge9Z|37lM6FjrYN6yTq&9LkqL%7b%$Z2p%Ie0%F+}Nf z)3h0qh?GN~qH;eV-y;goq6~@dgmgkWBj@YtO_|3s`iabR7vl;t=!Ark|EIO@0E_DA z{$|&^px97p%Pu1JfTHZOh+XUrYcv`ow%B`#T|i^+ChD<^-Pnyav0(35V{c%LT|rIk z!uLCO=E5$D$@@KjpXWID&YU@O=CnC8_ueG{@Br`#z^5Ha04CS~1Qr07`|zQJ7q0mr z!V{1OkQeYC^$k(aZG0e61W*(Z08juq3_0+usVK1UFGmADa42f~2;>g{L@TFvD0zM5 zR|2d63m_O!8c+&Q62KdiZ97^PR{Xrw9my8l^JeNJfHyAK!Kgc#!zlLw_5wJgl<$?O z1!pL~19k#-0Dc4P0_*`G%&K*9xaKzQ&#{8<4+0LzYY>V~JtQl+ktu5faez@r!ha>e zbRzBpQS!Ra>wj^;OVr&4aAJ@fU;scx$Wp{Y!ihry+Bu2fWP+250suB0PQTo;^hQj; zMGk-qfL9&f&pG2-0b~I<0oX-9qW%@&4&Wca4FG!|2T~5G_W`_e-343){0ZRID;~gG zK%Ur13a+SlQNmYB)*{-3d6GQtMZh0`^MG>z<|B^r^BH)1c}DG8=K?M@vDjbpTFDf+ zC%3b>&Hz|EOz9TjCV;tS?gZuN>$tqew*cgV!?9EupZ{sNe9iSdEZ4E1 zxQ_qXr1liQoCun~R;6YhTj{pw=-0uOvzAyLDCc*d@ z^$4b1X+Ma@J=gQU=RiybBmvkVSgp)Gt5aZz|9Nn}dWkaQpns!|C&{##0cMi%FGk}( z)(p>-j|%KNYErPTdk>tq04AjMV`5D74S*-|8eq@ZJ9*EZ`T@Xr+^&O7N3$o`55UHr znxT%{wb^mUjOx;6$CF^j?4`;0?3HYSOq-p>PI6SfqLP!{L5b#`jLrXUqHvuFZ9aD0_(YoPxsOJQ?=@%AWY1xX*<=~9 z+*uDSduEyC=Z9;E$5D37mnH|k*6f&xuso6gsSNU;W=>o$m66uQ3e;rC=tVGKIF`@D zsMpNstlm#3N#lwwgBj2SEJK|=9d6=#?qVONwDIk6dGX+T?!)aG-&|*JNZihIWua*} zTn3>(ifF!eh=aW3ZUOQ(AZ!J!1`uE_Uzqb&6t{J2sw~dU?_m;lttMY4ZIcYhLR6>D&o2Vpd6qKfN{7j3}r8re2oRu zsXXqxqSR@l|89ue87Jj?O&+JpgRsy#cIWwqScaKA~WS?CY2jRu9{l zeLWkVX1H{yrs5XOCO!bb7Q-^)o-C&yaL;CJ-<#XmN(Z8zEtf?Q1!xNx0T>QoJ+uU{ z+}U6T0a*FN07C&o0D}Qc7xbdj6vo7O;E}RXQ#MbJ2exN~>v$!Yj8b#{Nw}T}m;e|L z7zbdna1a;+unz?6_w4gy*$7GjiGc~t0kE8Z1k3`&00=M>z{FUYhY)U=7)O+!0jv)u zI2FJ|e?mC}FdZ;WmiEl^WSI7Bz${h}6Xj}P8lJ{#-@<0s`lh@#y zAEYqOMqFvz##zlI{@H%zUT53;5^@Bpi3w( z0xkot0ImYA0}=qY05z~6xP09W8<1MnV*-7gh& zDF9}M|1r*8*_ItUasz->$Vc6Lpx^{xN$OGR0M7hEa|cwg zz&8LF)Y~s{Wl&cGFbGf?z%)2!a9Ks(Gd+$eOmi6Oh5~8wT*SIm+F$b3|Re@zr}OfH-*>1y#9T3Y^D4bAILKlPvcQ(8XM|$Z-6Q`$6?f;bpwifF(-KtabLePy zgyL=T$5h?W*P8Ou^rmywS9)FPAghJ@22&CcZJeli1EFM?TbASA{<^$vZHUsTma1`8hUqQwI(Gn55I&6@+hRa>k) z&$pDbA!z4t6J7CZ%l^j|cgo&K@zaf_z(yE#D*EI^ zA6x9PA|o&6YNFSHR8ScxY(BMVq*(Dwz(1of@oo;r88ghg{JXB>zV3uk!-61QI5Z`K zknR+{XL`K3S2f%)_?la;swKcfSWpP#J*QHQf%lH;G*+zooC-xXRssqYf^`@{HzR#F zoz@aht($`|pWm^H_Due}rhC$mBP>4%2b3RDa0?|LRryA7w*3PvPhbriG`!^xQ(n0M zi){eI^AiSlv@D6bQLt8&;+EdxM}8v}4+CR;MV*^q&J}5X6Aa0xa4ef8EBX!HwbGZn z1hcwJ<7oH{5Oh80A)^l?-=<1u-4%)(g~}texG5^_xY8Y>r%llkPYYY3ctrkRqp(Mi zE%sIR*UjlU_vk=-GIo?L_Q-bERH>N~qK#gkrZj^U4W#SMR9;xBx?Yr`v6{?xY>h)<$+-=K)4CEunOo5{Z&?j&z^^AVDkgwhI$XQGZRFo)0dnncsS zgF4r`2@5#oZ>-{bq-Sk)2JlWqP13Pqj!_(VGQS0$8T06Wc+~x0H`Y~H?P4Atd8koK z#am-n@~J9sn^q|&CTMAul7s0GPhL|qM*-*T>3AooRAfd`V6hm1O0x@sKI?0F-|wsDjK)v$f1)oT z1O8J3Uz(}pS*k)##8C(Tz3p?vgxEgQVl}0#5M!&E9R<PUP2KG3X{z zk@hex`zrhEYLs{$0#?^w&-_?abIA27wm_}Nn{Fx7c)7Kd<>l6&uD1tjV+!u4cxACT zb*9`MaKC}htVeN>+MPmiky>-*1M=N~HQcEHZ91iR>+=+#bsgY91*to#@dqVtGg1v& z%y-QwI37huD)~L)luAxDM2UQdHhz!hWE$B6N_Q$OvVkFIy16Zz{yYInSNXF!xfP}= zdoYHX!fzp!0M9n301EDizG2k3r(&e^yKe)-#NVay!2V}a zJogEt+(iwZ3bKf?r0ax=d6cK5!D#xm2-XyIEabj-;o{5Zo~RwM65~{W_SZ)bTrH(@ z=s}}8VZ4pB#MfZd?WA@-C`1eXq=e3F@FZPl#aGfr6?(HfHth^`NyazOlFpFHeM;&K z4*sERU2rGbs81JA55mvUtJ=k+G#TkNNr-9d?$Dl%N?j!cn*i#27HADF!t) zKD8pDCW}xBn@^e@scdo$e!{mqM(9i<2IJwyhwe(KxMt=sj8_($lY=p2oT%*oMVvd- z9SoZ~`w8`XU2O5Z%EF_&G0o7Ru%Iw(19&JSga)f)rc}GLo0>2tJ9hsK6H;*wroFu& zm6fm!_S_AtUyf@sZ}V{^Q%GbvQ{70GTJepTBr+?7G8ETQh*bZgy#(61eq;p$nYHti)6fVpu z(xMjSF6j?;$e)f;f%b#At`S{FVd@Ax4%(OdZ@sbn;~#P9c%vwHA0(plfxtu69_v)M z#HtoQrz31b3$u55l;`Gb7fLAUEvKk8x|;6FuJy0}GNe`$y&VrJGy@3uOFL^(zPw9CMxKT~&-&gTBErdeZ%ll8L zow9XB;o<4lyoxq5x*GS?y+%r3$mnx>4FnRnj%uw&*dxb06F=MKq`u_FHU5n&jIZp* zDGv~XEw?DT9~6~TPVm`aPRq6{?|Hx1>(rbc+-Kz6UH7z%5O|jIbh@7skWIU{cQLOl zA(|zIu#+|F{{<%t(VQ$qV>^tN41jb$aWJ#ySt0POBu0_uo;C=~-M;I;V6~y($%?09 z3$pg4zCS>|gJ=a8J1Mm`V&|0#B6!c7S7ph@K$4T&ST3 zo0)Loh981=cWb@5g`Zw$1D{Y6qQmCF==G6KqA=yCD)uH_Up>8Bv!mN`n1Rged?}R? ztU$;OJ89XgQvI4$LR``js*-gG2Ao8d?_$*+K19hcg@iwQ^n4hGm_cWTpjb)Me#B%- z2idk#<>9!3pC7@WK10(B+CQ6D#A?D82Z!B!=Cjqq6*i8|F9!vWYSd$>(n+_EvJVIT z70ONEDZaX3x?j)>ONZ3vn^gQTUcg?E|1j_*@DOr(GaqUtR`P1Je3)V}EvPAyuE?v& zK@DPkCZKnjpx{slNAm43m`-KdXxoWi`5=b{zfPJQoWqa@y{tiM3VsqTdC~It!Mu4* zOC79_mf#@X{5svFDd5`l90(i=?ry3zXUqQ4)l~$w>pR*%9PFy&deHPq2shtT?h&Zk zOnzk$1mdXm2+ZI(HT=q8r0F9RAAQccv~C2Fg!~j(3m5@(n=wM@EqA+1C8JRML+zrF zyX37$!=vD3F7?HN|EkyQQSPoQ3xNS-94xO{v=R8G%MzhMsRK)mCl0!+lT#6H(nnCj zTH+NAy6>o7G$vH1frv@xTC6!+=kLXTsrz_d1DwuNH1JHH=6BkDYCgp?h1Cs(c|Lj5 z{$`teSwk?O+;D}GE(Qa7kqLzhlwT&}BZv$Bhf554TYd@fgM+bb24m?y#{);xW2U>H zi4a-+JoTooPVLPDhl-t)y5}~URsn(6qS3K!FI6n)5(NarN7nitYC2L0G-)v~W3+UW z0X{8As*JkRnURXYG^ME+c5>5ime1KZHx5+!qyU<-&!SZpyr{q^#SE8Ae1cptGzjcT zO5H~(etNlJ)ACWsu^jjJrSYfvFw<}fw=2}X(r4kKL8Vop8KwD~jvx#muZo$zXL-N9 zua53zxe3OEcV*_o;9U5yMOZnqTDJVg)MhkTkPJ^5t&}wtZXwRV{O*pK75}h6ORT&Y zfQ_mGB{Fg&dXK`?6L`Er=iJ`3cFz)lS<~@GQ>ign+zAN0sY=;?ebc3_&wfis=-EoN z3}4u`bESV=E@2X3h>FnJ1R8;^IOKwxRV#LPwz0{)rp2hTd9)SLweGN?yK2^3;0=WJE5d5cI$fqD5ZJq*ls@D?9>a~N z@+eHRC80fQ%NAR@v0eq>!Du-KuA$!JA&DKdjEjSGc|6i~q=FN$3s9F-55r(59DCEM z31|qQkv}W>{852_83*T;N3*->somC``L>AkU%v z>hHHBQVM%SaB8L65Zq}RBisW5o9nK!M{nvH298Wect?rMjpPD{fsCJa+ld0vs*N_D z+VGv=#Pm}yv8*RA`m0yzg2!-fqYWx%sPz&f;P27BM`!a+^y1`s;(0e~wUcYHgVuU! zEQqO@+VmCT;mNVm+7S((Wk$lTk3(-t0LZbeE-H)80?6Wl&)pADDAf(y6x*klNJiF&Kt1~-_IJ3_rhs>98 zVRyqR&(qo1cgkF_F}0fm8w$qy?*_t=FV8kx_@L$qb)HE7LY(eXYtAh{4iF=MtT}P< zk=O6$0zrm{12luc=uSG!g`kH&J(_P0#P{hU9~q43jeim^fu`+HJZZ)pr7<=vOKw1~ zFXss_#2t5|2x!=ZU9^_-7B*#}djd5X8q6Y(_v9?8a6o8B=YW8{(PPH@5qRtl z@1CUedbM^x4h67G@G|c-hy1{cX(u?{&}1b>);2= zX8NVPv_h<$EWiq~j;F}wFyDORg-VJ)zm?SAD|v^i5*5RjW-JFU0kjr{$qGEqPflii zShQ|~6Q|NCRi@j^;coSSz$ch{n{+*>Pq{E12>e6`c}a6BxkBlz&ohZ;uTbin?oJX~ zbA9-YZ{^s@?<694T1y{SU_x6dcqOm-lLhb1+CE8rH@)2}bwup%@bU*muY`7YOcA12 zT3Ei0cV2TC2r@CxHdS;DC{_Ezn^x{G&;s4^v`0}qy27aMV+b*l(Nu4mAmsfZC8*xC zANXOQL~ltAS7D_7K;ZOs+g}e_{F$;gMbY7SjmbGpLkmA}EO00}%a!07jni9J(?WDL z9Rva&YmLhFa`nwS=YLN}xJl=L03|}K}@NyZggRF z1Oj5vYc6Eu-9= zS!{0#z6QKt+ISUsqk+d7^uJv$zDZ0xKZIxH0#7151_Eoa^Py@jHy+8kSw&DoQvz*X zhp28?M5op%7P*F`EgtqSAKamc^%%^skovh|*hl@57|x*`6WO8yGk3njw9t(ErPT=SZj zLLBt+it`n<0|H(K7{++DmWm;w2ClW%iFmt0@&Na0MjII~m5%=kfBFB*IrLdp(AF(V zeZ1Vvi>EgyE0KE@Z#vdj$xD6K;$dC_HQb6}goyE{arA@9!8IYwzukGYU- z&&Y3EI*PpOPd)7__s|l)bHx0ClDJY(F^&F3sIKgY|{o^v>Z?)^p@76_KO*zI+8F>lkYkadA1b`$s1lFthk&b z4z53EwrL!N(q^`4X>b=ngk!dIlR_!;)~IDu#T zIFA_x)9t;`ZjFs%-CLiMSWETqN9;IiAOT^xF;Z%0MYoj9BiBMnZ8 z1FLGd^rVvekiMOxB?lCD7d0hEd(1wx`%v6L>_|3pdl3phrx<7Nhy1$G!u^Vs8sOS? zXqbqWC!ZQxgcptD?S_@l8Ikae5GwV*UMjL!r2l=i;9WRw5&fA99)%u(j>Zz@KahTd z;NJ8ASXXDDT8_%35eHd)4`S-czlxw0^I?`#MAc+IZ|6J$DP9UCiH?O1LINs!gqV#{ zPL!S=#HLi8l&3-ERuu_VIfMzeq*jL@;Sfqag7tkWSH;oDqo`^{y^o{lOE-b=8QH6% z4-Ih|LwODZZxJPOv6-G9ha6iSR=Ue)YqCY3We0sYjDVPH2YDXBLk#)0K@FlKN`&db zPH{BQp=h%c^(OqjN)@5HD-f)i7DD;naGU-uA_969jl+{v$XG=X{OX;4qXtKzNrA7; z!r_iiAI1EnQK^Tn9tKWpgUR<8c&|ZajzI_CQ+F;tXH!xrw!YhiB|f?L)qsP6FMn1K zGN6!9r%!EEm}sbw6I2_DXJZhRdZkKhq$UbcZvcj)tm;#)ld!+jyM&c_u2?f+)!O_= z)!52L=5!S;yc=5@nf>~}O26+*Z@EXUPhu{~G~*;D_>tD4Fy+`SjH%u~))UUX$KnW- zpW4BeoP6ju&`pJa!1Vkk@9(ngSu%FIY-|W@ctxZnzZCL+ni56mB1v}|e0AR=_^Pn7 zd&0Adf0ToYvF&5VhERMw5GDYD(~;i?M;^|*zl$NFMw)l4-laZ#^>F6sE?%T?SKm%l_+()f`98;fn=^o^fW!7#!o zl@UI|5OV{;cx*Nb~t_2W`WhE%V_&6M1=~ z0K?csz84{w-PHXehW|7UN8wb36WWfn7zm-C9+yPPj5m|6s#NINMQqnIpZpv0zl6~T zLOOizGot3Z4tZwvL_SdKgz%#s)a(-6D)VXFqof;(2P~>IUe}_%mk`Ew&}H<&YRxTF z;4&VD-l3A%Hi;+t?k-lI7_91SqT+7g>oA&e1rP89D`jCmc=N_6wiyoA^>0MP zD@I{3>rJP`X3n$4gTq^$?)?OnaA)PM_+Ja2iG3d}UV!!`ndyk3B`@8WY zY`HIeNezMU@B7zJmzXwmj(ZNE$6VO&og0%MpMUP4vNxb_hY>OgB`qz3O{CiazdA4M zz?+@C(oI;8nwhy%?^`&UZcKe|0$nu^JcqamOTwNv5q7cnCPK^|nvd%=gHT_@FHE^^ zVX2l>#T$5h9)*|hBvCtRH1!t9h}ZBCB5&Tpx#W@7;uvV!+*(~;nAY%1#`1}_%LU4N z8`-@*G4WO$t-B36cJ-9N6`!|TyGc9DOc-wdFB-1uQ@o%4Wa8R{?Pe!s^Dy zIe+H8B>0Z{hU4dxX>$G(qWE7QCVXOMURi?0YaQ+`>Vs!z@g7^~=F4I$lk>ID#=?Vt zMBK(vt-9bJL<9sI52_F{O;;$# zUD%KH3dQIQ-r}VgexB3vF1{ETd4;B;)ja2lh>o!e&D^=D)CTeH8-lgd3iMAw{|#3t z@-L*#f8Rx>y!9%%;YQ!=8U_4?Gg;Y)_Xpa&#D-Ab>gCv`x!1*`jkQ1J8M|Omgo&pl zP7*{12y@sy*!>&Y|6Iw3%>WN9X@SP3d$9EH?%|o8#B*p$n;I?8WAM?hxk)Mau;)K~ zi|XIUQgQW`7~3tccZv9!KVUz=N58>k@O2hN-^V)i4hSsO{SCYuS&JMVC=xaptyAvX zBE^}|u%J(9*I}u$D{`Cyx9K#9>r36H((h1Ky*)dt!CT+*Hkltln!V96FGw!mU!eV! zfxZEK#Ue<=Un`wo<#>9>6bp}J<|Py zh`0v`Za~Pl?bj)%a`)KH2*GON^^wj!fb`>UQJs(0uSrWvMJ|1QEj>^5DJmXn{z^qd~ zwD1FjDuKCQK3O^y$A;=WaBLWmK)W%9xe_o~7Q2nVJX&M%XwMjUtp$A>B~UUj^z9O6 zKLcVvAhJj%)Hpck)$r>0(1sChKpc}ml^(H?0)uDnduxZG;JfF~SsUhQFhF%FVI8o$T#vz> zQz8|A3=_|jNZ;Y!?4KxlOpk1DXn$!QR$6U7r4wm7V^jhLPb46+U*TqXpFWdpV#;%` z)9JrKQ~0NMXk%dVgxo4$oA+(DZOEbdO&&J>c4%R#wX!YzeORqw@0o^0RdWACD)9s~ zq(AG&CsJG7OTRYF)d}{(_eIR<-6yCsUQIyi$w}{2TK@!#n)*OALV7CBqq$PAsba*P zS(_ln1$QVVC(2!SC^-wtTX$&DKWUm0efcaqouHBZZeJeYhWtr=k`X6PKSPjI2Q$)} z7f9qw-wP{QYtDAvsoqR;V|f?yry0*^(cN?P_qp4ieuvT#&~^&)y`s?lu1 z_L!1iLBZcWre1Ea5vk~5kEzmYn68+iY9P`kEZRIJs%i`JT27rdxggrhktB&s)=oq` zr_ZgOSZAP2teqv^W?VbH(`5MhbyLoa)}%s-aupCvXntYJo+QNcZQzo}GXs7@a79+3 zI=9e+#=D%dw_cNyCN(J~Y0+s4(j5K^cG19uvGc=nf2n9Lo~5N;E@D4_1@e5`j+t6liiJ@ zydYpP#l8@a8xCAOoKkGqotxFW3|3R+J9}9U?bdqAw#4H>~W(gwL^7~3`{b_pD zg07UbRic_b z%3y9u3+kHYHFLZBiuNgn^mcjw1vl4hMRKfpx1&#*GEau2A84ygMus#Kl;kt2FXRnv za7IEaVx^1#Y4JlCs<-A`(tbqHDE5|4xgda9-in2KOhQz2TjORt;KJV0#*2i|lsWTU zOs+PXDQUb(R^=M)r~qj+<|!DJ7yaUKZZ(Elv)@)nRlfm~5|=wt7xg*BUvDWk8)hk9 zti?BEN$AcQm+RZvNr|mi@e7Uo{t=Q==XdlBsCv(Ll-1P`fYJGD4Oi`L(Khd>xvQbN zzUMpYlLHi=Qudq%e;V&@ej=} zefZ6&tVLAz`9%+>&<`{qI}GUae8}<43(=onamhdTM#A7-9uHOi)v2!hK-F`k@twws z`g*Zd59&wKTP3ysuoh+THZ6S;nqw#A70H~rmr1uYXYOrM>Czj_FFxXT>M+4&DO;Yu z2=G%MyWuPbZYd2MyknP?=9i9ZzKj?eV*=Nxmy48MMn!s*+u#`g(or(Fp$I+F$pyIx z{mxXXgk;Thu&vnPoc#W+|BM=c;*~Pqm_f_@H5>0FT>S!LP zg+495$)V{+UT`jBy+fohYU{h2nn$E13l2yT+U`aZjH4du`@gk}$@t#`mo|djKS>jz z(;fyNEhAK$@=<9|LpjO(r{_jqzQOo451smCr1{*tF}cl)R%0K{NfAN{UPkwVbh0T_ z!3$1WP@zpB1`h-LwxU9PP!$@f=+u`;o&S1~uUQs%Y(x=`Ec{TbA6j^y_IlIIT3K2R z#7mucc}jhedb~n=ncRGZu6P-$<3YBsx51dr&!FSKoe;B{D&tnSo!W(0U;6#}`q1Km<}my$fgUv+v;3T?Z7mE}+?m{r zC_|m8z76hETlRQzziPHZb%tWv>Nz&Dt7gs=0}K(rJZQ4f;F-0(#HQ(1gO>r@o!-uL z#Apa`9gl_r7$%DgwJm^7ffR3o%yPI;OmW|?4ckfRH?aB8CnuH&*>*Ro^Qs#hAdA_;gjDfoI8z;2E!lWy;Yi3NCIihQ{GH@lD_$Ip$=e zfTC~bNtPkOYiMER_ntfY!Sek35@icaN)8#C42-+bBh#>^Er6l!!ttvmt~zyl z`}F&}4_}QR#;2#eSU`e#T9tgj(L`*POd3)?h-S8}Cf;F=>q zpP!#+zxwyA7TdG;mGlwpTDVf-{8$XSxYB9p&Kw0y4*TwZOs=+f*Ad%MX!m z9We3$V{pm9$HN1B9!Tn#_Z|xOgL9msRwzt~!1D%PpDM%G?u#y;OX7jgw=@k1q4}~4 zVPAMO=*piy4L3>z7*r9oc%iF%xUK3B2hLniZ>f--Zh?u=rn0Xg?|_}L^J{8K2Adtx z!siglIlQ`cIsYy~_Qm7}WT&$QA)bFTgZjF&lhT8_z_Lj%?3@pH`~lFE=niN#1>%D=V)Uw@m;u>1wQX}lG74JnwyDRb0!l27h;MQ^EfD! zU3<;N7Hf`7+B8;WBbX1b{;Omy@-y?yNClVH2K%pwS}5}apPBHNMl@p-Op}0PaQwGw z@dZ3pDuPY37OFCc)IPlKFJiE!;i+HiOT#jnGxtJCSL>&hA_f}&ReUTJ{>Yz$k;Y<% zNy?b3k8q{o#o*O8520Lh&5;8iT+#cb8=-1RM$ISW>^~I4iZ1O*#N9L=9S4$24Razx zofgQn4ti1V!K=|`GT|FY$1fr^yo_s@<2adMWma9=n|f5lv=`x5%h{&CY5Ye->leqh zB>^#L9qkGLD`MT(4>nSA0Afex;ZZKnnGA^c?w$u5jI=z^&T1TIASG26V#vg;5ju0= zN60xcj>jKj+PJ7th*T5!P1o~!{QiTs(wj10(d^e_&-@rQli!*^4l5RB$KQz1Rxn#3 zu#^`pg$L=o^yvKBEW-lgP39{_ATg72#&&7QNE3bFG(@cV9+}&(?D}Q4AJgU_hyn}r zsUR%J(n;%>XP3eXl8M11bbf0VG7g&K|J9@Lg1iKBxW$C}nyEo4EXA{2X%tFx<}rP& zna*Mqy@-q+lv>JA#&ipWd0mb@(b?_k?+VVbwCv&mH7*TKH604?Ww~SsEYjn|l0weG znH!U^H#_gsXlF1wi6@?^k)H)A+@u16&Dtw^ZMfp+>;g9VeFNBmLlUf?Re%Oq3>MQe z;Ij{z-^66!8n+IgY^iT~tM0tt0yQ6^>lOsTyhwGe@S!un=M-a7;5nb=wuTnHt|H49 zlFuY5=IpjaT1uPWpN?1!^)=7zQiy^=AZh8LB14amy8>_hm_l?S#9)!%T9c;@BGZP^ za_%{W!~`l7T^;OJb@~#ia5$B4Y70JZ-(oWax^4wx05~sHm>$>+_4TC+Q)npcArslk zpHGPoH8d9E+b;wT`M86&2pv2rezoGFFIS9`%fML2U|`;8WZ&A**EF}s531#;KS@xx zm`EOiD=#lH{Kq`}-V1L$A^fJrs8SfrUj544gL;G+!ps>rMs7MxNBy_B80`bLEf{~u ziF1uf-_P8<``U4FrlJ~uxNM0lG5=cmX5MvGDd7zQ{8}jGENkG8AHvJ3+HO_W5b+s8 z+GB$;Ux_`%IG3*$MJ)Sul}bp>BhJxHrm%rtgPwk1AeATw&CU*_4Jc9FrktUM>-j*P z`lgSp*4HgT3o01ADWRNUgKKOFozn!cA6b&-l!s>O7Nb+;4V}y(b;Vi9h8w${`1dct zVv&Q^f-VMfzy8a&8a(co+Djh{MX zxg9?FXj@d9`XYZ<4`akqQ{VO*K1*Yaj!_Q>^=p|ZrmY?k97hZ9SSmK?GsJhy0X~Sr z=|4Y-yh~3jA})j%r>vDQBEGR{j#771{mlWr-a>mT!J%^D?|<-1z)81<+vZ(Er}dfx4zOq7x36YeC@363Vi7Pn_W2e}EVM6M!QX%( zpU|zQVd2;+?~(}3t|kWN^{Y2j6#`5Kzw~9LP2m`un zG24|Tb2USKQ}c2HqtvQO`|gct&--7fhPk>=KUOo0v^NIq=RK%vb%U=db7R2wG1Xz= z>hS=64xqZh4`0S6p-K-`xz@nWT{CaoSE>O`Jfprf(t9kfVK8XD`I`3DF!v^HmcLdH!+VV(P9wr;10QWn4yR+aU^H{W$+I?Q z;`jpv>WU*i*VbpNPQTWMU8^69TTOT2ta&hK-EFA}x4uhghC%Ua7N0uUbuuriE*Ma@ zpErHy)Tb!0tocr9=6Dt?+`LiMCB1qXyykc z|2b_jKvd~#8~@Ol0pVV&$&j0foq^ai8}aVqKlNc=QLa=y0-iRbmdL4^uiQ4htn;kx zsu)x|6emv}Ik9z*ZDdf_q5@55YlPtseAG3e0UTr|{nEe?=kvQ>NOE+T?UZhCu9QYi z1on)1G^(NDL9Py6+I8(!vR}u}UHcE{H)KbY*DxBDLsEF<12wc&-_6RhUNwWdHr&-vf%cH0)g^@K*2810oQ<)!SBg%I=G~0 zQRVcf!-2plD60|zfh2HPpX>q3{3cZ>^YdUea4YdAfeX=9SZ|xJLt-FM1wHB}1uMrI z5v5dF!}GER^`=Rg*#p$NE~Ksie`DD|prTTvs|go_s-;)CK;Tp`iOh;WihdgSEl8Gv z9pIT@A&D!2c^0n&Rr`G>`{`>HtR|rf?gpwM&(myz1?N(c^aQs!7>WHtk87iS2%ZJz zfi=Jp)U9SLLT?Dp2i4iS)OiNDoi?fTldb**dQJ3KKw0)Nuqya9ipt##Dt@um?+5vd z6^t{1f_|W^+dHdgeqZb~km1uYi-OeLcc@hjm_|dO3UabCd*wCA&OMdxNKXW1pE%!y zT4m1*K;^GU;mZFVW>EU~z|#YRo^7!lsDb>6{Bo-U7Co?145Ea9M($-$37-UI`X-=EJUlm#whRo6 zJjWD}3#zB5)iL@kP#qWps+^|hng-7W#m@lM^M0Aeq!VrYVA98AioSz~^bT-bK*8#1 z=J4#nN?KUg^r)ugD}s1eLD=Fgro4bx&*b|NN0O;~4!YoGMIAtwMRr>3nboV`B^NX9 z=bHv?tR1+_FK`EhdK~$iiO3o-AbUt&cCXFoa-!v6MKF6%zpR|>yxhg^qJ-+PjpR~u z%LYv~-5DrVe~79zGd6>YuXdrq-}8UNzUt0b7n#xrF;&SD2wY<9_z6u_?VCWk{1Q<1 zeE{@bcdU)*4=Q0tP%hjUR0HaOvTp@Y19_N@3!^Lpjx2JT5V z4Zaf;KPYq1;OyRkz#`JAgEM@@b@OruWcQ@OQy?_LW3hk?{vj4o19mhq4TxLl_ZGOt zy7o;?O#@ef%HI`K#ce@Z=#^%Mf5zf0(0ARt2>6pJ)wtq73RK2{QPYF9pjw=Cxxpcs z{Rhj!%i-1F-kBqOPw7oQ>G2_Kg{}e5qa$j-FU^hR4uI;|J77!^PZPj73TA_+g3q@! z4T<+;0lIu(3h_#xn>S)Wc5WcBqLtBag;#-lTbqXO0@aXppgQ&(sB-6mYEVvA?%)B# zvI5VxW$D0w3g)*p8SevCK?bNvHzIT30QIz5J5yjqP?k9YCV}sP)xfNroWVH_vW9=% z-sIb4<9qeX9MGTq8#|bCnY<1949M&oZ`dmxVkX1h4AaAlJDLjaAcMy6CG=Y0i4=Ge zSagNKv7jtc{YulY@6%0##?iyG-~*jZx}KnV-Uih9W=)#mAMI??-4i1quO4=lX$YR1 zH)2Ru;P=yN9O-0{exQ0>lU}Jozdzk}CteM&-_=xH6_lmoJ`f2ROEl?bhAdVG;#3lF zvX`at9@DacpvI~zsOi=iRK;~bjcIwX3K(CGDp8Iq{sCuW?Jvl=)>!6wP?pNhZE#D! z%)CHXbXjQXb$&x)1)Inq=UEAA?Bna^)7P5TRL-!hxJ3PQK2VS0#IS2!>4!Gzt_)pmezp(h0#XX?X_vaLh2?8R)Z_4pC+RGs2o0&=A*1{#+gZS`DG12U9?G$3>7wFdNVP#)BFurc@| zP#$ud<%fc0(epBU_RQ=#AnO|PYhdC7bRN1Ecz=9)6L@>58JJ&gG!=XR%5`65cr}OK zuzC?5pp1)iO@l_GtAX(ax)-`S@^PNYx5eTa?tyaEo#K4c|G&9OCsmG3#KyA9O`xnc z3RI)_-(vIu=;~}cP;E#7Ro8i-tau8j>61HTKz826fk3_6j8iQKRo+5S>94!pw6&wf zZ@_YaK$C(wBv1ne59)|UVOy_R5g@EouPSO%;K z?wexlz7ACUlc1ch2s|^;pN%I0&7akm9m{PMXj+|*6;0AQnk~wI^z|6c}{a(gR zs-S-}%(QC%eWsPW(8WJ8%Z%b$^h)UQ^Tky`yUgEj{CePQlkX5?M7r3q4L*~>uQ0wD ziEnG!uKL}sd5#&#__lU4>E#GtQlJL3*<6$VPEclOXfgF6)1iw%neSXsj&mw_nwF{B zBveEg)P&eS#|&V6UdJcO=Z_dWZXsShUI}Wdd@#@Ov#p-}sNr7#Rckl1yw;V{F&e#3yf(8f~xQaQ0d>I=klDVA2&mC))Pj*A6@Hc z^(RdOP5|Xl%RxCrg@vY^4@n=xss(EZ$Q92Bnij@4u5k;*$MS-wjj40{W%`#I@%>}Z z{62kj%FNEn%8E3)H1GiFG-Y0V#tg~Hi;UjM;=taG{QPAW1>AC{Hi&)ltcl+V%3|!i z13KP7FNfYUdr-j?0`YV;?Np3U(fE}7y&0|F#0s`D`Rh>dxL1v5-niD-Z%F>YA!=qT zba`_8R>lR|hMCGRL0vrXCZ|9FJR|rmc84 z8C78xSObjTT{uKzG_dhSsOCAwV!!Wcd{LVDx|!Q2ZZZ{bCciAaj1H^(=FF%h&GG0P z#&gaA&qS|JggmJiIW+a&1=W-5x0pq!EvSaXH*0Cc*Fuj^&EGdLe%B&Cv|n#E4bsho zm^|k9cM;+}`u*L4c+cXO`EiTHd-g6p)KrOk>I>+aBCJ{d;*_!7c<6eIE4Q=8%9Z0+ z&Ce1c6TPv+v~U)BW%R*24c`b|mN{{k;j5#og2m|S$f@rbJpi7H-fQrH!8sTA4>&g6 zH*cGKyFpp-)pxP~c?32>D8md|s)8Q+z>LvkPzi4X6@T0NrY9XgG!1!`E-U}xJ*MJq zAm^ll4SUTA{dsf^p=a@CoB#5Cri1-s6s!vWryj(6yq^s6fpwt9`nvZ_Pd-jF-u>-v zQ_lI#O+(|B=}!4t?>Cc9mTZTvS&#x&0AtfXH9Z^#s-;(e>QNKRp9^Z)JKr`mK9;{X zW!!>ikWMF}bQ-9N>wIa-FJ~+K$y%W6SAK(H1rY+O_-s(l)AMUnVE|pH+{y=yX+I&O z3Os=xYRqeXV`j^0cs1}v(p3ZBwiP@J%CZmIe6whf(oM2@chJ8SNx+Tk6S4O@GiJY_ zE8$9Xrg%Y15=w6X%7h(%FclS2pnRelyee9aE?;@)wf7TffGl!|F_!6npdqU06N}p| zZvDkL?bGP0FBeQ##wG+*U_DR;oCc~VWvu=_&Ls(_h{AHvBPD8 z{vhrHRmJOJqt8Df=r79OfwIL-pt|URs&V6qLBEDk=qfP})IyLAs>>y;ZA#amT+nZ6 zAKjtJ?A7ma$HYfK^2G{PlTclmeNxcx!Ug3`MemS66`qYQ+mr`YV1kXGN_tiF4EZ&v zACX=Sorx~nkG43(#&-p^h^K;8zpayVBkdxInYq*21isGlIpD9>9`vxov zt_9WOC7>EM3snAbmLCMF0XJHH>S?B78R%;0S>Tyq0$4@f6yJ9oyD!ENsKR*`T~Hav zf$HJype!@5vZ>gqVj6Y?UGal$zHRVwg2q+N(1vaPE}%Nn9E@qqwN+FF?}6%B+cS;6 z7gP^honiMIfZ$ZkF-g|JbyqxSoSy{RHdD#PU z1NEs`Lr^gsjQI&R<9w?4Z#7KMZv&N}Ca5t!8B{|9pn8}&JgY%3E||WlZuI@2dh`wU&4-RrjIS z1fMzA6!0@B3q1z<6=mi0&AK=cc;Gz4_sPu78%l*aS^2ryeMSUo);0Bf2&w@WTvX4D z;oUZaXA8{B9HN^dfpYbY1^Q5NRWg)wi>qB2d+Be6eeC?8zY>4nz!du}sb#k}!5ZKd zgz#4Q7%p8l4gX%`_tgInCcM5z+KFyuCLD^#wSO?@9 zz`yyMnbUVjW=<|Qwi@L2=61uw#Gf4KrQ7$WrFVgHHT5hL*E$k00};RA?Zd@JgZv?Z zmy=EU#TJJ&7%;e3W*)5=fM?_d7B@EWw@{u2w55AZ_3FX1-4WHR*E_MPDKit7Q?L4y zMvaYI{YI;|cUM(EuV;l+bxu-0KqGM7bsH|U+%W6aY4^MElf4_TbgX~M|SZWlQrSxktczgoAD{~ zYAZ7$by}PFs-TK53##}pLAlJ47K?Y)xVO^c@t5r=lQ{c~kIJ?lHTlWKH#Pb61o!c@ z)9d$dwJss35w^$g^^oPi4!IN3QiJEX#c9!CAJ=If4bE}X`K;p>@|oin^O@&5Euz7d zZhDJo=up_5&>}S$af_jDbDfsa;0JCxpS9dVKF7Mne6DbvR#E4N69a*^G&RBP)FR^a zP7DOPqlMj~=8@oXx0n>az(wH7`YF<|$E9c?x2Sc*$w#}~&t1|n*)47zbq>H>21`&!ZuOo6@2*Wc#LxzQ=|o2S(OvachlQO>0n{osFQ;wuQch>BF<{Grf6l{ z60~2?Za@oqC27IrL>BnY()_l3U0Mq_XNl|XW~8S$PZ3gieyZ>2r;AF&cPsKBak zEz&aLv_QkZZJQRM-E>S#V*2;F4gt`nyhI0{LOFTI zSY=EJNo|u8k11-#hiE* zJmQ?i2}PD7?v9Al747e?^C+5exT2Pk&`;Iec3o1PWR{T>GWeATZ+DBkM4hE@m&Ccy zr)RtEx~2wuxP@J#&NVg6Q2XTv3tgvM)L8|m36bC?F*+#nPct5ua$ftpHsqM5x%DKP zx?xg&iI(bX@`b7yCbk)O1yq26$AGh+8^&)h!yQx)5csijppL;tV za%!A!<|_`=G7`MnExsulz8lW3BJ}C`ZoACX@Z~siikp#{!tz<1NloZx`lz?f8w3I! zkM-dmv}80hB=yQl2IsoPe7@^Cy`#bUZhG%%_~r`( zf%bk=mk{!M9{T!1w`^8wxIXqGs&`5_pAb>KQ-aU9#aU4&)G!dZf`S8Xryh~u4Q_g$ zXt))we3hHgCnY?CP!~V+1)*+!s3l9)Rqo{MrU?W(`P6;2e+gfje4 zDqU#rhYAT@;fHn*GNsgGN|;g#2zB)rmv0Hl?ZW=TdWD;QbJUrQsf=&P@!vXsdx8t#bCr@Q3`r-VI1ZT!$zgz&4uDb7VvvtZ%sy&}O|-NGT!a0%Sy?&LdC zoNAZH=O;^$Iy5vIoa`3z`I=iiH0m57Ue3bVmxZxWnn@jSlUUmF(d1+aZV7X{nOmF_ zbt-Yn?CKk+q*ui0kCu)WaEsbUoafNAvT<&#&nX1$7HOKE;XW-n+q&hiX_`oYa>>H_ z>Lj+}SyNooYMU1g7PwA+)Y(XkM#67c=+{>6g#6TS6BZ>5o1YT;qP1IgSgKR6P2ATz zElf^C(KI(pkN-N%iy%k zoamNxV6wn;YZteY@)V&dPgph!p5&&Fh&o-{o6`|fuze)F3@zE+)GNg~LP%u=w9*9| zyXm*GGP0On4997T#c3xRHlZ}xyjq5t%4Pi4bwN{)f^HJ)jo#PIxIM*b$-HEA)pZu?*;X^>soiLH4zQZkr4Bg(1jS=PPb8pH*BZ7Ijv4j-Ro0(yiqd#-ia-SJ6^`{aZ=s zGI!I5O@mjt?Fv$Zm$-!mQD^kkrY9$;mz3s=in8lT=d+tz$mdMAn9uiIXLQtQin|#X zVYPH_Lu0>K@J{#Q6`J{)RiAmsmkA@G( z0nk#fiJMs3-DuYxi~AIfv9>8Mr3m_JwD6s1m-#_ zExC$a1DY((%7P<=-Qqi=!KSWrS2R3_3R}7vZBm?%2$_~?#9CZ$b}4>4*(f;UaZR`; zeqAzLIk#|pG}zWHCMI@6{FGfnKi))>QyC|(e4}wH7HN!jgC+gNFY1QQ&ODHgk%$wY9^X2=xgC!(o|~jOgFtK8tmj2^7({YToiS_?RRX)!8ER&ZLH_` zmovT4IECRCMfs8NOf=5=)0zfvb|*}W^0{GZsx$KDV?Den5?+bc*xfWW#W_sKEF>jG zk#PO~YA1Z?>;B3XK7W8E!g++QQdIagLap5L_cl!!s0CS67NHD3^z1S25TU5gT{=h` z6Qz5ePzQ_alSt~ z2}6&0TDRmx6qd|_fLC%hE`+8fjKS;?arUFhz5Fvu@KU#UrmiHN`=ZXSoOlsBrPs_g zD;T+OkKSmkc3OdPk5y=zK%9PX-6LppGbhDqooDK$Y^GH-pKEobt{X7I$dX)e()|3X>)&KN1|{7S4`3X`BSLo*MTYi*^Yb6R9BL zEJbUGcA}qthFkbR)OlyP=`-h4`f}z7V@A#uT_a96G-D4<9}i6n5>vE)Bzypk>&mt% zPP1F%OMz02LA#PvX6n3&#uBRjbGEtowo)fqrw^KJVu_H&0qGNl#%iCOVN;sGZO70lZr|gqG=8A=cKa-O=~Q^fM=Y4hncVD zoRy8%#ZSpDK74A-pBt>KbqkD9PViUU-e?#2C)=rnOvyz>k>EPlnaA#G)Ui3zIudS< z#@uhq#W!)4Mw_z)bu;U)MAK|C+GwjWP@JTnL%WPP+SP|Ek7Fr|*u$JP=2%>pNVqc^ z=i~M%&fSD;uW9{jXiePmW1A+9HFl*ab`M?M!uiqQG`DzuG`yCW=I-SDl< z4NGy_5mKWtFyntanu;{LgD0)V@`+jBMbi|+Z_rM=^Oz~{qPA!){Zix+lh8EI=H##r zt+gqWj-GUvF|DbgEt(99_c1u*(3B5PW*J+Frj~IJg6?%5&pyjP9nK-7B^OVj9q*yZ zaO{;Z@o9yojd(1B(E;spcT-x5Gs*JQN?EV^ymqe%6OPr052m6u_v_cpC_rn9h7%CC z98I;J=%21?Pqc&XbviYeoFGkY3*SYkwcpBJgjAO4=UJ1CU75Ez$%!a!{c1F&A45|$ zT;b8_&(Vwt*ye@Ko$PLCo$BPYmIggt;eyr_C@B7l!;q_cGIyqXKH*`s#5x+U3V<* zHMAR!X?5KAtqP?afu>c$l(`wL^D(XFG;@7!;zpodeJpMhn)+^fTW7lIgV{9nLNlJA zD~A*BHLH^E2~Ib(%gN`DM%a_)U%qW8)WPSIu1rq!jHCKj1Wq>ErGCY7hS_KuGp0$4 zNO&JwnqR=VGmOKr>l%#%Ta8MKI13$%>(nLU970pmjYBk^X*AQkyV2VDb!i&xK-16| zmp=Wzcnz9%9nsSLc9h`Y9$F{2{B=zeXC2#s;sw{D*+gs@m!d`8$v69nT9~|CFg3p4 zKR-`M(Ji9o(eTN$X@k3Ic}nHC?Pau#V=2omh<8o(6`>s) zbmuL!zt>Rl@zP~>MC(W?#tIwJI+-$ANiKV$bPZ$BG*BjGgC~udS-^16p=j;>d_@@j z4YV|)QA&-4rD_k}=oS`7!>i!ByOWDkxRdT|h=#j7C8y!0SnyuAa6{DDj;{9m`>9}a z*Vz~iKIW!xj5_Z=ZPqi^I###SpE1*wa}_nUL%YncS7(v}v?ge@m&v;pE!CgAl^4Z% zM$GA9HJp*H{4_UxQ`A`xr>V$Dw~d5Pc$QV%Kc8GiNQ(pK*freEM7!A6Z{{}9;y~a+KPG8&B>XyBs#~5b`m)cN3GZJxIi1nW!o&I= zyw5G%5)HoP7H^4$8!n-bx-1I!CB*i4OGH>dTlnZMq8r*pcYwe)i(b&EI)exrSXb`f#72d-0X<*@-{@obOQ#Ld{8;*2AtLFU4tG8YbL z>Jz0ie@WO85XF&Q^r# zukklg+fqWq*SHh5r8>(Y%fkVXS~YTqm}b_R(Wg9s>0@VYs7gCO(ruZ zvmel|Lt}us#Jp;q_CTCIoEHeSg!k7@=O~&QZ%%6|uf@;LTBRnUnfa=YtwO_TIjyaa z-wf2|rW;yo3NTmmv(Z$z+3I|UW)?4P@R}Es&p%ttAf!Arl*Q>iw9aVQmQ>9)plKn{ zUDmx(=W}#*iU#)4Lo(;1Xt?i2HAR!`F+!~KAEkspB*blaLTA42FII%EBgE}>LeCK5 zE^%f`xY8y~9))@k^796#yXhZCgZtdVkE7vkZ?O6B4fQY~)2>bvBB4WXxa~ek4UgW; zIo*#wOz27)=1(;}?c5)Awr+{9>$-BSR6;XJ;rMG|7qpv9H)E0D64yBpb-uSLaM)py z@MT;51|3KV4<(f0mOqfu^Kja3qOs9C%)--l3eSLg~D(7#yF4? zN`1>MdmuFw^CA2SJO-iMqlCIqFbbiU30Bq_^D(U#5nx-|lYsGS%6!-K>k;6l2QO*b!fFbQRD8O+8^kGw74hn*06YTo8U2 zt)(uXLN#`}?Y>S8-M-VE@O7&5;!bmhV@l>l!e{UDTiGfll)cMscQDmi1ECpat{dyV zV>Vd6A2~zO(){XlvUwIwu59M^ezbN*YscmAyQV{CZjVH3&_ZeD$UsKn+?v8Iv zwUc=W&CKr-?$0d$Kz_UF%ariRd$igS3U%G%PWUc0eDa5KR|uyMp$t=Sh&O3p9#@Coq#gS0QeQwzwQk_Cb zwa{EFC43xjZ_$`YDD7i+14$-A8Z+rE{5o2OJDE;Y{X~ys)V4u{GUN4xH={8 zPMss+$3NBG7u9=^knJBH+TkQQMSK();n3VK+zm%lLwmk(%l?w;H2KoB8t29>$D%d$8~F+$ zO=bEvA>s`DD(*21S9lrPwSJQ;er;|#(F!&o!_d@F7H%Gsyo`2@UjlLA1_v2%wJ9|0 z;PeT>)X?^W(>DaUum6oEow_-NP%F~=i+T7hv~H>+eEzp`ri`CbLjAw>%7%ie&H|Vg zrevns=V)46@pODU<-2&C?pfS{W(T`-#JS*5ATZRVWJ~lQnsGC={nYPG?UaJ?yP;*N zRpI4?T6^U~!IW_52aP2S3HK*t8n>EIb2sB>uHg^IovqW*h;t*FOyLhtXz5{ZLzsrA z{1`uRYJGSFttDwVFEQ2jqbUcgD?8SUeln*V;=YT7p8Clvdm{NigY9TKfPu4)#FuML z_+qpsrp6Hwr_9er^Y0-#&Ct4A$95j| zCO8aP)n7CLG7hGMy8YrWg3}?)y3lDeca6|A?sVi}B;4XxI_cZbxr^Yj(wq`BQ?D|e z6bM>(lRI}nvr7_NAr~#`x1MS2Y(#`xf4uV{oQylE85n;bYo2fk`*a%flgELvw1H;M1@#2cxrqM^q$t-(*A8UK^^Et)#OAmXXb zPA;AA7Bu5Os$dCP2S26C3|26sL%yRtq(GD3na1D$8|@o3n~#pAo)WYVq*VKTXx;sM zXrXUT@yeb~H(MsfJ0??1K$9t`2_IRFX4;Fv!zY~@c_`umy(k0B#)2I@CwfevL`#8X6rI6Jkt;H+|zl7kS&rm z_`J$g=cnjTh-(A(-_H@!v@xDjkuTJ$v#jhi;R-a^?N*;jU6IcCBbCk9{cveFoo_y~0mf@@2%Cie?5=?(!X)H5e&-@cmj7m-KjY zB8v4gHHxq3sz_t=iE+(Kx{ym7G}*<(9r=xRVYQ&SZQ_-j9As9Y8aJbF;T>q^9!;&Y z{sDrMJDUM+9JIjl7)Uhz3B zE7NP6nP*Olo6(ZJ@~3k$N;)T~o4wtedc}1}HxktjFLqspX3i73n_i&~NvXVySCWLa z(op|qdQR;F(QZIvE&L?nY((pc#-!>KaT=T(^uMx(mvGg$98Eg{wz^wbu+NJRq-=XN znpQuW$=3p&Lc7#0KaXn^Lfn3$!Oo?8iTDz~=#r`I_|Rm291Rzljb_*M4w3MeXzU)B zHBIE}#%6+P-5i4!^(XaeLg{4Y)-y$&&ew;{NMh+=2hTY_7!6IV@3lLhb5%OuIljTm zIG+ZrBN*}9STaB2+{u@c8=;l+PrmEWd=vSr>|r#y9-hvr^luH!*p=~;&c!X!H0Hh+ zg&#t@+7$0xU~G;FcyiPYt+gK!o=vc;N%Jj1v$S`@^r;sbFZNG2P7&Hg6wEU+CfmDc zf1fAkTogAit`)ukjc;8Pr8xHzGApqLVGo+Rl;{?%h&Z(_j!%DW>u*4lN6=O^f}Tuuc~=lTv*vvYP*# z(bxv57Gj!_hiY zW>#n(oNYC8tL{xSc`vIHEAuH$ zjq5PDxK%qeO~OR~_Q^;z8Jkwn&lPB9(NKHK@r7{3ao?M@?P@g5Z%oW|y&Fxv_Vb0- zHS;#4uo~7*HTC+p?3`|BW{8wy3YvC6##P=&yAI8)#3_8mybGE?$f0|pUb|+Lb`-Xg zVcCmyyj)8HD@y3@%e}Ix3>@38R8Eww(wNllrU@yb+ta)aL^z9J8v9jo3o!gC8f(df z6sLZ3vxJ}OCT&PgJf^Vs4?We~D|`{hzvqh%wR-EX;iyeC;X!{s`@<33zhB`MCA;(I06)ZJ8}{-9#OrM_;)Wq;basY ze}*dXZbTWUBGO$%hfw-7M24P+DBS`?{Nom%0M+1y7N6EN$|)!-5gkIcbTy&^)>+(O z@eNS%C5Q^%iUhoj*1_{?D)bhj=Qd*7T*I;Kt4js zBL@*3|0k%ve(RU=8;to>>4>s0T!{L{`PF6+s)71YgUk4eK?M`|kc|>8Um8U@mKQ2N zS4n<(<%80^6>ac70)dk)&&7&g9-Du^9hEG9xm5$PU7Qq(kl| ze-#3QE%8^Nsv5$Fa44HFzsGsfIQ|TS-oSK5OfGsG$-`iQ%_fvVCV{fB3(7M*Q0Zrb z`~@D+$L~<_kHBjrAG7g7>5qdd=P6Jl{)|RUX%<;xvBf1KIsOq;K}$(r4qOd7;6_kI zysnSmp{PxKsKZ@5CD?BH(x{3)wEUl;dc2Qx!u>XVX%uxJ#-}R!(k3X4 zGSxShFO8zUwY*RkI0UMq!=R#m)W`2o)K514h>edapp3s*LZ|}Ghe1UJee$;`J_N7) zVH;l>WvNr(l`aXCZ&U`Aw5mRIzED63&M?GpQ2d$js^DxJUm8W#u)I*|Yl8BD`k=7vGpr%YO$FL_V#rMR&S_K8Xv+Ie5fC-LAA4uNQ=_j zO7|LMFegtZbR()9pqEW1R4|JVCGTT-q3k@=>O#fmSpCmXN%Cy^e48FLb8?uCxWz`4 zMs<56yrN=!NFN8Pf8#}3ls*w%9hm|us>q@%g+r(Y>lZ|IObgjL`FA27VJf=MW|(F1 zew$IK-~(0{$`Ky3`X8Yxo=?1z=qFC4KcOD!c%l@lpyzCYC7^org2fe zgerKI#nqM_2sMPNj3lu@NVReZ)xz?iDm>ZpLg^K({*R#QPO|BRYFH(!3l*&5>vTbZpqFta zlR@>I>GOY#DyKT}mBGtwy3#1BvE}~=wZCj<Gqxwy|Bz65v-nWM`q+Ym^3}msFO5NOVJ8+PVgo~M^dF(3^7v4( z`BJ>2or0BX5(o@K6*GbljpuDrEC#)1or9Hw?4AMNYT6cSGd{(p`U|m#Z-g1PVxf97 z)9U{WYP9Csd_uZ;Rq#B2iFni&`xq!|EU?Lh3O>n)s$B>w{%NZ}1M(MGZ1H(e({=@@ zX}AW|6~h)#hfw*qf-3J#d8IP!vI&F=?&d?@xCcBL{0dZtuN7%g@!whfA3;_8y)EYl zPz^j~P6WuIVqq4-2l4ROSKv#-WMl&ri>CX{}P#fp{}s=lhAiaFC_ zH5)IKv!4qpe?3su)Cc8wO+Xz&m2)|$bS)AvpaQKSG!5I^h>oBZ%I=^xz`a3byxGPN z1mzI|Y2AZ*~)bU5?N2wJ$KvfvDx=z0hMl`~}Lh1XgE>uJI zTV1FMKDYR_#qVr-$^58^O{D)`Yx2)Q*KXh^pde+j4xF9X%HG*A_`0+p|| z#Woh(g38y<>g}zbVfBun@^?PL@4o_O{@-XLdRgoX>JX{{H-jp80H}%wT7HPdT#&!O z2&>-?s-gmmV?hnwM5|BH4H5O|K2V2H1fDbKx0xI8rQ29Q!`e&f>eFbU> z{sGj9xB?1N}wt@1Jogu1*(B6s1B&~mw+m$5vYn9TfPmb^zA^U z?`-3{f;xnXzXsIBXW&`_>cMp&e}P_nr~&;fpDmI@sEP(!eh_#ndI6}0jJEt3P!&%E z`3p?tL;3CnRqia27R$;19)(Z=^Fg)j2@q=q7JT8O_*Y_sl{fX8W6Sm<)99sDsEx2UT!}jla_3RTjHiyvE{n ziP&Ei+yJ4BJwY8p>3u-;q_4$(HeRR(^aquHAgJ_1EuRM}U%u6cgEC$WRQge%j!`01 z&{&Ii*#w1FpJZ_gr~>b?@l!z^rBMyI7hZUuO+O2iW#-uQLd~A1EFW7;K+g68s0Cpy zr~-;XwR9t>Y4|Isg3I`;%x_WY5-cxNx& zx=l~}k1$F!xs=`NXI-!CK`A~xwTmFAV z-x2;efqL>B8CCF7TYyl$xg1pd3Q!YtEvR(sK^=dF%2!M}&E9u3Br?fvi|>Q{1@`ly zga@S9<3I86JeEP>GIb|J4Y>+Y#aAObN~3znt$aV-zx42&ygd;e7QL@p2E)f6ryqZu zj!S5hcl>cWlTY*P_~Z0HdaQo@ar*Jc>Fj5YKTdC?b2Z1mg4z)sf1K`b439rfKmItq zf=;&_e}tN4#~-I-AYJ4ff1HjHrdV(J58&~~>Bk?ZAAg*F{Bip6$LW9iSY7Aj3;yGEJ=QAy7+t({@y8#hH?vO~ zg|f);$LW9ccwLq`{y5#b%K!Twr`Momx<2?HAEz(^UEy#yBETa4{h?l%;hC$5FhgczEh3DJ? z(R~=iz*`_zdM}7byal4#aEMi2_Hc-0A~uOw<5e92(Qi1!$Po~0ys=Wo4v*(A;#YhF?%FL ziFZIm@<@n`J0RZlX5Im@U&K)n+r0D`#Ed&27RDg9dq0Y38-uvM0Ai=Npa9~qi1MQ# z-tn#(1u?$>Vugs^o--Pv`zVNkqaoh+UJ#Ku8lu`5h&^8R7>H#eHi_8lRUHe_Zw$o9 zu@L*bVi8rwLNpi$@rgHL9K?DNyG0!E>fH%3d>q8&J0U*vc8aKbCq%QmAinSl?}FGN z;tLU9d5yt$bA%650OoTWrqWmO?Bi=QWAm&emSOF0_8uH3c4t4dqPl6dZ8RplJ_oA4@$uQOK zCR5PMzMD+TL~IgK#;ZC7qTk&RBd0*{gI^-5Oo3={55$SyhNa5MG(!VLX`Ikr$X!y@r8&AUSk(x{8Wh9E<}=dKt!?&kueRTqBnCI#C{P+ zMO5y7z*J#2FCPWfR60Y&PT2po}*)hjG{;W;#spLT}G(l8m1X(dq$+ zhF;MF5Xlcf91?Mfm-ZmUei8E?glOa)6fxsLh%R#=BHr9N5N+o`gy%vu_BzdlI4oj` zh!ijQ5XAhs5LpjFH1igT=>8ByrH3J+UgpCPi4Q}p6_Ms8Jp!>zME)ZXExc7C`aJ?s zXC6c=Z|FRTD)S(=iD={1d=z56h;ffXqOKasPeg{-a6ZHi z5!2^GT;c5zF@8Qos|669yrKmV$qOJ3iMYy3dmLiFh1l{%BJ!Vx=;f^v(eG)9I?q64c|)IpsPYWNHW7Wjnu{RTix{^EBHJqwF?J>c)k^CIQArZM=+7gKUBIYfD z$oCG4n6U(+%kvPocyphJX!|@wcqzmPuhUY9!y=Z5xXlYLgP6Y*B5N7MNN;maW!t$>*5jamUwcLl^g5tF@!FGK7QG5uwTDc&9t<6nkowGyJpD_RMW zyb|J&2-iz{1!BL5d9OfB_YR7f@d`wjRS=#xcNIk2RS@CT5Hr0_t04}HSR!JU7hD4| ze>Ftb8i?86A`#u!Kva4a;z2L-Rfxn_A=ZkR>m{v)SSBKWEyTm#DiQtGLeyCYG0z*i z4x-9Bh;1Ss^J=~Zv0lWu*B};nB_f8u2GM9e#1r1A^$>N}L+lf=&}&!>u|vf4Vu+`` zJtD>zL$ulevB)dh0Fk@_;*f~NUfM>8{UYXVgjnJo6ft8XM3>hgmU?qvhiLmcM0gX# z3tp#95Qjx95%H22d;?D>8 zCt{P=@GXcPBBs9uvDw=rV*FbWt+qjwctzVFlD9z|67i;&_BO$C&nu!toh-tmGvA?ELZ$l3|9+gl`}`%Z{TyCB~8GIv2F z?t)k=Vvm>f4#YAM`R_pN^;U`K_YOpzcOmw9L*Ip{@-DW`+0k1^F z@ZAuN-h=qe8}%MU-S;5&iTJ{6_&&rA5!2s?_{!TOV*L9Mtv-M_=oNhck^BL~Araqt zX?q~{i^bV2wc#)S|AXm^%2W(Kz<;028=5 zJ1<-K4|Cosr_9RW?cS)ewCdjsL(7$^7;`52|BO;l5#$$63e>v4kc<7dDz^2;{_-CG zw!^XiuK5dM|Bi9jMyK8sPd%y+ndAmM)~9sd)lx%p4F`rp@>*gt2k ze_zG6UjKhW|9j@=9}|4@d%;s!-;%se$KfwF!P3U3l_^(-n_{CXGXnn%l$Z=PtN8hj zgLm8n$4#*2xCxG%fMxXmmbIYXnitH4O+vum*9C-ej-d8>hVz2;xSV(>6g+krF(fA| zFE2YQ=P%^UcJjYaae-_xBq#Ql_t;i!>y7<)&0pYeC;xlq&x-xk4)? zSV8vxPgks~z1*yU!?JSzz7mMjZP@Vf`>_AqJ?Ki^+nOs-S@7oE!GjusCwikUVpDw_ z{?G)m6M0Vuzn|jY`_IZ9kUc1mAHL)j9D3%0^#cE4&YWZZ!0A`|}FZ`y`}R=Y<}>nnRtqlQ@0LA%5IBeN{rmW_MXu8TAWC zI>uX08%O>6ppHT~`JR4Wj9Kd+6TPHhLdEMR6Q%6>H9Y;|wvKxs^iTN`{g|bW_%E>Q z>)HBsF&+99cI8vm{2aD_%z;x?+-3??_C`@f>V*YwS#Bwu`mMJIZL{19emeFDRUzNDXPViq4L|~OA zYY;AL6Rx&gO}KKF(~sAyC$*4MEVtICs||O$<Z_KYuK1 z+k_i!!t>y_*`B;^xw>#W;6!h-Ts^}2(Pd?S15O3Y4@xYjU)EQg{9vo)cEI7nF}?UR z@TN-R_`oKVbG%1b$H$;deF5?s=`;eLSnfi?8!WdUPL{a{*<`s-Z92Y#;G11@<}=G( zOn7w}?GZUXx8x;+^?TMjzOdY-gk3oK+?STq#$=l1zOtNtrSD$L>6HL#G+zP<%&^=+ zI9WzN^xTzzCgvgiP`_Hm6a2tFny;C8)Mn=0e1VVEB@Qh=3Z@{%Dp?1GDA*LyyGyj7 z1mRRkGvsZ{g&|~q-uxHXZn<)Bsy7zpBSR%~RD@K4mm^nN?ljA#!S%3QCCfF3yVi22 z!ztJT(fguwRIyx3!q3BL%{as6ZAI9Nzfw$Z9-xDI>t^6S5^5ni+a_#7I3G?6Np(2> z^xDe6Fw513Q18-_TP&wH706H8AtNkz5gb9i?KJQ{qD82oeh*&-c0fKrL^iSoW)R+E zxfEMqNA$gxYiqSmg@>v$#U&2r(bS7$Y5(l>|nX>g!TK$F|BGDmb`}W zPuQ|HsCPAJNc4`x5Aa|eoou>m34aP#7winDo?M4a!@l*vt8KdL3EvH;wV;dTZXjG_ zIc9&{)-yNTJ9Rl^@N{bxgM751@|4IwdGpN^(K4> z(Q%#SvZz1sgW&?#Te1(jRwo@dSgtSOo`kjF+-SLegn8|#zu??txoo%+@@m1!wA{^v z+mTLdi^?Dv=#S{<>o3*#_p;;w!pkAGko30PK*IV#eJvzemeb?(hb`B~a)aUe6V}le z)Q}8823RiJrW*>UvUTXS8~(TSa!^#b4i%yn<{~OwhYAswhp2EJdRK?Ie59Y{23c+x zoQ6j$-C)bzLRiBiZiwZEYyH<)h#YFk5rkzXaXFT|m2mvE1G$#F4Q?D((2-}k+X?G+ z20HTL_zR3gF0owv#UXdV9mGV9HU78T%o>U>Ahqm{v|IsUd9{|KF;F2ciUU>Z2i za^nf>OSL-gv|J(K+bwsOEjN*H%&`dzEjbDDB+E^(++?_C)hdpOmb;s< zUQpNyoMgEvgdeo&Cc~+idk|T$4LHT7DX&$0&vW~}W z!bb^fo2)|(pk0B-kadJL)fRx9E&}tB*DR+-Dcu4@uQJi}(|d6E^WQ7m)pE~4kT({1 zf{0Yxnip;6C*d?dH9KCi+(N>#%xG}A<(?v}7v5UesgwGN_m4rIhz$v&G`I(9}{%dXK=LqYakQ)E>Ht!O`KUl8Va?is( zPk0Wv!E#Fp%b9g-j4vR|P^ww-b(`=7xEhw*WVsjNv?JE>hUH!&tR1nA&6ZnESi4^x zTP(MNuy(&XN-P(98D%$$#&xSDR}vn~kZ26`Dj_-*cm=r@?s4!f%dH}OgXOkaZZ+K1 za5~JZU^V&r_nI^MI~2ErFu?tSh5lyD<*u_ZsS315dh*K&I-w+U{q(|wnA?=9J8m={4KjHoq z@-*@cvIuz=(U0-#o>r!7=_S+F%x$8wDx?0!O z`4Qx2O#m|yy)nQ=^yYyAWE7&G zU(kDUe?{&f{YbqnK<`kv4bh81^1)%q2qYJ2j?_cyBf4-Zhn$2|M0A0q3!>8z{np2q z$XCeM$RXrMF*@;2t&j_CSkC!$vyuJJOeB%B{R zO7t&?E&#OQ?~P<3eUQFLKSXWJRHx*1u6tVPx#>qA_57ZcckY(!p1p75Ni3AJN$2|k28j68zqy|woudaKEZFT>VmRvXo!NDh*VXhqcOIRd#A>5XJ+fxMQ$ zb;$LIwq-XWU68KG6^QnJ+865859c6t5WN#+4w6rWd5B*0sh580#Ts`Z+8>Tav}WrS zH${lvM$!^#g|tE1B54ku*N}iVj~`RXCy3skQWvR?)Ijv27QOf8eq=WC0P-Mm3cTJj zuQ$a62nUf6qMyE*hUiT+bC5@n`N#s~apVc)Nn|1Njb51eE%F`G9?3vDB3B^t%IlF` zc%0s&rMHOb-D!HC+9_0=gw#RKMb1O&A@vcxYW_vi%ty5Ud=%0CQv1ork%fq^F9#v9 z!F&usbd9H1eQGzWJ7hW&X%}0FXydAls$S-oj5J1?ASp;QMElDqaygQQ1Tp(w8qp8b zdySVM3lP0bxdqY^X@xY^21Wb9=SX}9but=(0%R028X1F(MaCg_A^nhSf+QnN5p6O@(Cb?f zozxQ;uP~B`I7m69JaQUR38{*lft-odKx!hjklNnJvl1$&r4U?%9AQND60zP$7NQpl zYGbaAxHj3^RKI{MLY_s2BM&3@cze!Ds909l*ta2}GTtv|CDe~;S6c(oTT?$o_97o4 z`w;D9wR6=@RXbDNa@8%?&Qz&Qq<-!3EOc!iLkvR#a)6$GhJ22EfxHCQ25F5<#Sqhw zdl3)e(k>R5N#H)@e&hjU4pN9rKy*Q{7gK(Oe1bHh|Cb>Vq%rauvL5*xGM0Gl;q_MD zi_w=Mx_58~qHVk`D0K~}D`ag%PeIPt22;CDZ7!3MbCHV3X-FmHbfhv;1u2i5jFdri z16enWzd^o5bdz~6d}}O{j%ah)0jUmO1F4DBLTV%DAm<|IA$4_wxgPQrrurH=h-iPO z%OqVEJ&R~-{XDW1xt+8x(X$oE%ZN6jy68L&z6qF!IEXf$+Gu`^Xg8~ksy3!yAbOT` zKk^{bYz`lKUvpQaJ8}(jEpi<)1-S>Ainz!$WIA#$;vtQ_%<2ghuZa>&Lz*Mnw6;WA zA+3?NNILQj{Td0TQGZnoa~4t!`5FBv@(c1S@(^imL}ZuI-lpnofrb(6iS$BxBUd8Y z%Jv2OAvb$9Ya~=`rFTJhMzo_n5gAO_0m~wKaJ3lGGowUS!5WC3lI%qEWJFIw^yFi$ zH?l@T<=E>4^^D>big3Yc$aF-H5A?WTCUPIrkp_1~KEk*4bU=6cbyr_^@uSH3h;FRw zp1JOk>z?>6$OzbCGIMDKRg z`yTZU$I0k=&);3hg^2DF>(z>SE#rJ-0iqwJ{GLYZ&ag`Zbk}D(axXFonT+VJ&y=9I zt5!l;eyd_`O&&nr1vMVg-L7wG=Xc2W$YJD1~se4*JF#Gi0%XEHme>s>DH=l zr9O-3?y2sUK7hj`IsS;vooo$Las)-AnlP3h;C?g zM6N)tL>eL&BbOkTB8`v;l8mUFw~_A%uVdg}Ls}!3AP$mrKBv zWO<3K-pYofpehhw8L5DrV>$70SxWx6JWBXUtgc%`ImlCt-V?}t4rq^b>{Yc0>jRv_(>pdWi0I96)qC;!8vYW>CN^ z(khScE}TwScN8iiryxnlPw*Y#6{kB3=OA^EdPo_h98&k3L{f3Q-rhU?)P!0MkEl?D z^(b%{)cI1oz=p_0$c4xS$ls9q$ZJa{pPNv|evZi|C|&5)wjml0O;w5MC$#-JmuB)seFiZI_O~oe7pl$|4SufV>&%X)dwK zplHGc5c$-v$WO?($ot4Q$WG)d?%WHH zfqDH{M`v-LW2sihGsX9`YdOn<)EoAlv&1zQaWg?vkkok9$UOue$HDsm zHVvL&=2g>J4UfCx->jYXyz@Qw#5^XZ%`yW^gH+zQW1bZr7;A}rLv394_x=XXO8^tn z+VS|9=nDYTdk)}EwSTYVHQVfK0OPUAz0brCwh8+V-r@RfwtHN!jgEC=l;Q6;!=L=jf z01u3P6U%@H!?c*@enS--G854LxdK_^n%8f<(5Quy!%G2x8`tBS@!e@{73H%}O}NF8 zVhL_%N8x)usPiU$RmGzgqiL_I2`~}< zXMc~!!`Do}-U(^U*yD28;A?Kf^@5t9XRkwCf03V-vA{GWE`vcpyS69%7Q!xtIxg3s z{2jol1~2b;X*Uw^BOn|Q2GD45$t$bDfMft~0QUfV3+Td&wvK=ffcAi|0lZ>kec{zx zTR;SWiA167fcxc9euI*?W6I%oSwJ+v3Sb zk{NCY_}ocH&#Ei#gW_>f7f>5e8BhVBF;WS?xzma$xijvB8RR80Uspj{6Ho(C9l)Jd z1#lg=VPJeNxefnjn#`E&XHeEn9uZe)NcPt(1+7k-2FAu|D>~eb!MPcz*y3B?-_Ez|wC5U}>|Od=KC${{he!&5qXKTKm{>^jB+covx8C;$^3hjJ`n3}Cb@?V0Dn zFztzeUwO1llpmVfBWa_qjQjI|!wgIVOp*A^1a~$P*HZy=0W$zMaDO_=Z764>oC%l( z;QBd$6u^AIZ-CW+L96iJLI8Kf1o?V}yk3lwJE{k7y$HX1%1)Q#_c8!8v=qP{E&-&2 z2De`c(CGYu-x~ny0Yg#04&^Y=S&I^SJxIOa?U2W~@euF;z$3X0D1-a!0nFSjT&vHe zQC;dcs>;!PT?Et>d*IXU|90hPkCsCdNoC2H%oB^BzqysJh{sNq5 z&h5p+Olab{h~M7=t^%$Ac*OksI)JC@CQ7bn&?ImlzwZI=0PX@F0a$u0c9tmrW~s4s zSTgxoG%O14cryjXV=wI)em(`f2INL{E#*y7&d-dh0o&;Jrtc zJs=bHEIb{4zelN{Y=e?@-37nd7@Scy#dS--7pxMA_|XVpM1_6)vf^G9!1sU(0L@^y ztSGOUAiEJJ`UCFu1+f2Pdc5*4hf+Piied?GD&Sx4^3B2`TYMi~F)%DLu;=;`^^{?H z?}Er2re5e!=&!1~ECzjq*QE3%LBUHw+;H1VW5qg$~2%pX!3@g8xRJT z9Mfk_+N@GGgm$zV2>M=hkn#9Ln=A0*w#QHD{%uGHgFZAgB(zLOq;5RD2ZD7e5IlkK zbV<$lGdEYX1VV_FdDEq$CO>Mf%z5AwnUQ!NU4#lA4pV#sG`$K09#^TAOM)7d|G5$n zB0|DqLPEoMkIEl4n=hR@S$gfN2Wm|?ll7wM4U~B6r!d0;Ku9}yWY&tw8AA+)E^T^! z-Ln^F3pL#9!& zy8;0UnSAG)XEQCSoBF7HheCY1J~SH?^h0PP@bnYu0T(G0^aXA%p>in9yq4qcORPxj zaeKkt*JzBH3W7?_k|K}cg% z0Wn23Nb)K7rql3-?cMZR%{od*M9({@QbQESDYS`VvZSLKD^;I9{lENv^h+1e=b6X& zpDQ$`q2i@#6_W?ERx4hn>3y>cRcfiDQ1K)a%}{r`FSK0ZPD;% z;~FXTz|WJ~Miag(oTrX4T(X7F4j%@0`gPQ%F^UtE z#D!p4yD6_^QHkCG#atIIffad8QE#tN)7vcrYt|6VC_Jz_UVL_(@ibE6CQWIgL}*=F z=~fdZ-rNdP>H$JVmmcFbS6I@9r(LC^lVWT_$5@)}=%+*s$noY*y2o{AX>d!$(*;_L zt*1N`_@&}weV0e*|69+DlAjIBxM!2MJ4DJoKCEQj-`BVnJwmmLjT*GVmE=thIjeb(rl>nkY9Ub+N^J`E9UJtb(QSY^k>Z-6SVYaZSWQ=& zqqs_Aab?JKqk1i&9I|`aub3`!Yp%@DY9zO^wM3U4{6M8!fTX-Ro!Yg4axH{+U_I_} zJ?`@M>Fe^cazPB3!R@q~(Iv$*J|ul16pcG`ez*%?(AphctDe99W)VpX z)1gj{NneaA@ks4QQBXlwDudzpE;IMxP#x}YWztZj03>hnsv`xpM)RRmjtj~D4C;<6 z^BQj~z`@$aZ%Vi(>wdgqW6fcFk!ipS0^Y&d#tp6VkJ)X*dn_sZ*5j+n`34Pdf4sfu7uVCLoxe5cop8sE+T=5OQS+~qPw;Ws!(V}5Pa5Gb2$W?h0TufC6toWozU6)d#WI@7H@8uX zRVa?pF>ZS&fbOHM;Y|Q7TLl_gTaRx81DG)*ZaXsU`Q zTO6bv-GFnB#$RW$g{fi(kbPa4>U9QLe5SesYCY&mClo=X-wt28tpkJ?LZy%6x8(|c z_oOQU#)AIP<^e_UBmzQA?D|#o&0C>wAVeA6Jt?juNOY%s{&2xRQ5+Z3X>bsV@|02> z#YhT9FLa?JNKTE;mHv#?*yq!R*5n?!M7eQ zE`r`st7pS6FFbegWGAg=GU?Rr8zmm-tG_`jZ@O|!DWgQ-Q3sF9S4cyXf*3b{p}jMj zoTaqR;3&KXI|k{LIznzGwIzt2aMy`c>IN98PnEiXNwr|4G(sOH z@NPfN*#;(?{v(b$cn=p5CR7FWbdC;*<`K$4sLek%8gSvro>9hgSBr;nkxA zAXqyCfn&$YL4$4=$n|K74PgjsI1yM+{KqbOf_9Kro+RY(H{-;j>yx&=ElwV;Jj0EftC{1AIEqa| z*6CbXB;-X-y~tmwdilOK3=3*_!S-dhigl~UM!29x=KsO?BV6dS7wzD}URW|}wi<}2 z*^knODh2(q!W#=pyp-9#D!Hr86VAKb1a{Ztg^X*{kBcPi7e{s?NB zm8r`xC5-;=j~sk4xlV?h;SYAu$^k$|M#+WRrXYlo!e=)kR`HzX=PKFyFNVx_Be>+te zj6U{anCzy;r2O9K-GH=4Dn8b_*qEXoz%yTq$Ic88+V&_?AvTX|w2GiEmBT0%6!1q| z&M`d?%J(Da4M`B_OM?>Uz8U)7F8Ll$aX`SI#A?QPx&|VA6!f@Rx7g448#(%xQ6XVr zA)(e9G!_Wf&Gm5p5B=V(-_I$&(bV->2r+HZl;2vctr$Cl2-MP9+Z=dB;rJh(>(7mbj5HON+(knQiae0jj^&g`6nm;68 zu|jAh`wo?ExE8W06WESRZL_JdP>{t5e#d4^IKCNU2*r4z@g->RP>fd=fy60@zxRwOW1SGAzhn0yMPN-@p z_1j#nCjNAg{weNoF6Tj|et{f5Yc0~IDg$QU+)<}P6}4$73ptM300DpKEQ#@Y0FQmY z`?{u!n_W%pDDb$8L9~+bex?1tfb}^PdQK@w9wXt$mr>|Qr0QE~>PV!eu`#uSw2|k_w#kCem*z)<&H6|U2D#bxdtv@Uy3jH_W=QtgsDLkfY%7kecj4O;5P>2XsWHBQq40 zzI~En>yYCFQWW(@HeNU+Am0g><4`-cPRE|N8`$eoe%Xp%_dTC7dr(V+larlOq4ZF^@NFbXREb1Ze7mPE>CKFN-@-mtPehIxrr-D1{Q9D_-&s`p#Db+ny4z(6E1$EH1q;XYw#;3Ck>5RYc|LH zc~PGbJlNLw8umyRHuJ`y@<<2c4e;>L0Tosytcg_#ax23E}PaWT?(= zDn+2DhLD2Pf|RJ7Vioqg6KN$O!N?()0pWjH1+Ag4r+|?Uq8D}mLLyt!;VEG6W0|RU zFFZ|PLp%|*r(~bkHz+^2-db?@% zy%N?yScz&3QM#LSjI-aRbZ;uSQr(@2qNhRh4rFNXG$lY*Yc>0+%{H7Fygf~6h?GC> zB9glcP&;*{JL-O{E_LsBZu*K9@F*uN8p}k=+=k>XH;tT*{t_uP6$SqE-C7iX(cq1+ zk*B>y{0r@9G2irWo5Bx0MCi;rewu*j(M{BAS{%gHvad41d_Ly>r#hQ-L7U+j8VS z6W!IOU@ltIaxS`1D-_njXvJQ(RFfw8noTOp2|4cyz^{x%4JV=%OI-E1zvzv>+F>ZW z97#d2j6aWhWhP`jhgP0N& zpfn6M>1QhRphM(Y^AIxhbTC+$oiUQXtM# zR1SsZ8t^#QC%0-o)@9z&PZ=+SGdA7dgXr57UL+=qadhaDTs2or-VVUvc|@?!K0?&U z5xUXV6m>LDP?&cP7R+{k+^1^6Um7|=5@^qwaEvO=1>OznIai4{JQ_?p=PF@_%)#_> zE@YW!eU*7ilpZoo`VClmTKOAf6Hf2AC{K0fD``StCW=@9U(}ywE`ZdY3>PX{e_)p_ z7gn#~hdoh3kKdw(r=-}E^hZ6tAM=s{0%1m+=^mQG-Hkqt!a@NHQ52(?h3Geey7E;e z8op5JV0iNjJzfar4pW6ixI2-WECS9<8p*{qO2y5{rlUna6`pNheZbAic@J{{rI>>n zb|Ok*Si{54OZK3KS8S+xI-2q?#$HM1F`{kmnOFWA;&Lq<7??N4C{A&UwXRIyYV2YR zw(?k!iUr5txjJyw$^8nVtSVYvbJTD)yY|NI#A}&LGi^0}=^~n%#{HeJ-5rvXdB-7O$+?rIJ?|2p13kr&C* zLp?(cJD`2tg7P0bv2Lvtwc7OHQtU{#oFX)7*09Z07QM@l1^7UIYzQmsMB&RY7k#M1 zGT>bsC343`t?$2oGp@}`m5}O_22dLC%zZ$Jr@g;(i|G|c&F^O80iky}2;HUzTu6WX z8_ix06_+>V>SqI$TLFVTJ_D!ZLF!uTs(st8|Je&$AL9=;2H%x)K{9B6{#M4mC!|a{~wI@b8$S*M)`rw$2MrUUSb6 zk0v>wuz(Zk{7NugpIrGl#{cOPkPdQFii!3|?h_@%?!>4W}wW@8~|=7Q+m zYH+1)h1cfoeEBFK+tUNa;9>rM^kMEfM<}uTcLRf8U3VHI;wCIsH--|{fQgxOehVbI z0(kBiM$eZ;rpzld1_6rWE90foOyHT10>K9e-^_>~5*2ne8FR}RF*xJHVTE&ACE8>l)9oR z{s#AsE!gl>ZDtsy@T~&08HKs%T;YpmI1T*O(rjIrN>s%wLys7tA`o~)4SxD=Z|z0R zP60vgvxc?jFU#Ha7!ldD8Z|c2H2{Z4XFBZ!wU+rx(tk|n!wvh@k z>o1f0dW@kHwcYRnl$ak$@?ffSfZby<#w&amAUyM;e9&)eD-+d z-S5TYMs?;S^#zo{tsEMgTP_x@8k^Sj&zrfF568&)mVI@l0UOXtHXevSb#3EU-u&oT zW>7rRHAk^x8}-2^+$>4uI8*yjQP|keZdSr9mZc(Mbk4V-RhP?Koo#GE!k=$KXcOt6 zbr%rXc_#+WDBNdbFFYSq*@r3RoG1z|%vaGAPZyI1Y?`$x<>@`mBG5D|lVmpkLE)XL zJC7qrz1N0=?ZP~;Ee9puLY3IuW=eCrv|?qqFY^AbJxhm4h$M~olT|r|i`H3o>bhKL z_54LY?rp#8i@P=nIZlV;bgx_@;_Xi!rGMGBuX!QaDw4Y!zg6jA&H*7>B7~dEHW9hl zOyBFds}CNH#05I0nyPB>9sbuW-~Rbb*3)D8STV&lcWz9RUAhgvNKVY}|t`t$&IqL4={cA69!h>NW;|U9qHOn)d4j!Hz^NFoy7_!UT;vjZF)MHnkH1?npL*;iWzMPS_-i>hRO+9u3cN3-V6nT0{zUxHK_-=lR z+Xa3a&?^+QXqVz^`RH1J_Z)Sgn7#{b1vYm8Qem z_wR#J9vJ`grMY)qHEnsXvW_jOXx*!I^zA;Sz1Adzp6tW0u?PT9dcm4`7$%)#V9&(( z65WcX;;}I@WMt1c)vNMrzOz9je0y&`8J>Cmm!mcWK|vdr{gs2piG5^~`9sAMdKZZi zk3WEEiKjhW{IjzCi~K?*HIum;#KLRynw@jK+qk5SP6`+Zs_0C34g`4?q&A0?&YFZo zjpg4YT9-N=#aRcLgjvR`J5tZ!v=D1(O*==(d0V?2p2i|I7>C^SpGnr>e1 zEYkC-SL(P28Pzht!hw@`d5T8A zlWHA@+KY6OuHyiTG(++_0Y5Z?!cRbEs+FqegjB0G2^@8wAj?k0K_0IF?&HHmmeYE! zQIBJYgO>6fPyLhV(>{-#eG)xNJ5+VoM9!y>c*#vJ^&FGKs=)g7Zn0!*dH-~I-R)A% zRb|BEHJp1#jR$5qdg}|9FRHxZttxiLNK><|5-!q{Q*fxSc2nNdShs$dX2NdO?H&(m za~4w=v`0j@zlQ~OJ3nn3o+@Yy+nc1XjHjMr@okO-9;>CtLDRv=P{UWigPySis75iA5*kqbO*{8VUHMoq43|YUhg{EK!&tI}qnj`UjAV36(q+C?$$BY zdKE}%S6>|vN?J6GzKRJg`>8ogum7jWBNAZt6fjp2r~K-9-3 zd^iGl-cF(7aD=Bb>Ov7|C#wuT>YLnU|c{)%-I6TOOsv<1u z_m|*Jv`MuQ4dkD9=Zm6ve}M0Ox3)9uS}TXshgbMUzQ zL`OXMG(0{|U9Mn%LedfE1j+d-=y*`jRj_IA1vSle7``?v2hIHl0e(1cdtqwSR3X_k z-zKDwA^+2fsjt*LJeCrY)29(FQ9MkW37(I@q{x=7}a9;A@X{viu@v&SyEj-Gf z#;pzWwBpXbmL2coK{va~P=tqoGc@NRtUU~F&3cB8 z0NW6MhU$45eQ+j7e+wM{NakDc!qd-C{ac{*J81E?{2YZQZkSbi1sj&SH>OKHGwF!Y z$FT1V1>Q#Ly6zUT?;~f$Zp8t;`(Fu5Z)4G^=Dm@47+=hpfmj=m< zc@5rLbVGMbC%6xr(I?)_S&i845DoBE$qIL1Lj}%@A=Y@?W$5$6J@g`3g0bo(VGs;_ zfm6W#ckn1uG}8JMRocMA47)GT_B+_BxO9>7--XFNyC`^YE8tV|@Wk(LN%6s*IZ@nQ zh{%(gp|BLkOK9%kbwolT-^fl$$dpwvW3Xk@X&fk7Y5{|z@%uB0WtQ&gG=(uBJP5ye zI@Ns!;rC3ZbYMn~0A>MT{H*VwOOpC*;Jt`niXV~_90p;(K@Cr7jrmR6wO(}&8%#_i40;tzsgRu| z&t;L`%=7pp!M$ED)%ajq&<$wSQ4lxyUZ%Sbpy0 z8s6Hwme#RkvxVP%E*S=`#LLtLZ4GPwqH(WK3bXZz?2HyXwQiOEn$|Se+M1lht9gtr z2{kOnX4aXTl4>MnFs(3k(nnvWhfGVFxnb^QYMF_g!rt6X*b49d2o70&es7{JkC1*! zgA+9d%tq{EkfAGd^bN{&S7^H%WP0ifjp6%$U!m52qf8Rhh1RP*@aB&LUADBAPk>bK zDqRK-H0}vvf$VeB3&oexpC}QA1J@`P`b=|PWWR{LL93pky~c#>l-@pt@5$M0Wp@V6 z=p>JZy*DTsMrgTxLnIG=tJe$)@@odM@~pFJX_G1^LX0Xnmv$7wVRY~^_nznAnuLlt zxF!=7zJrxGtWC6Y^iCf*N_(Nu90QJu^?Hfr=0nIxa20R6tI1cA)T_E1FVXB>uBx!M zv9U*%UL;4FSraYiAV)-UGa4fdMeovMSEG-m>|GJG9?kpSeNLGl@DP!o;_xAAZE`f- zNVrQ!U7%RK?@}2Ll-gWRx;q(qr*#KK@wHbJUv111KTKbNZ+5-B{XIpGxD(*i@Y2W6fyQ;26X1%Vyq8`G*!MIkFOZ+wzt?1&pAXmSdjVC zheCi&gH!HJEU~c_r>7zg3%8#&eyJ!1O^%veH91P9&zeWgAE@1ZT!~=G@sa##EPr^I z#T6{YoW3;32*pm`A2lY_^dEV2GC4Wn!3diV*JyK_y-$rdjn}A0l=8;V|W4;F3 zL6CFfiDjJcotyBrZPpbk?TonXpubw2pnh=G+J)wTv*JSL3yN^TjB7zfUjKvl&@@To zQu7*;TWRU$oYO05Jz9^NrfOEBX{bg&`%Kn*Mc?K^?j=$y*`0%9vNVQya1L~|>w%2- z&APr5f3Kzn=W)O0$LKfyHYEWRHQbX;ohM^fIsMKwe`Bd1^YhcJB6v z*W{DWSk*8bX!#-3({$L?7(})68Qq-l{)+lSO|~P}bS0nB+c@kEzC%aHT#dd)M3k5e zvY@%4eg;M6hcrY;|<3%Cu5NrxvaHFun&IqI%s^gYdAH=>pM)E zF6V$M0;sx9Q?p0SMze`RFZ_-+!tC|{MjCh-2W$M;9E3U)NlT_mniw=1S|hn~!ll|M z+bq%oZ=;qr{}(Px<3z5`q>9iuAEU2KpR?x4jh^}#%SvuwnfB-EaZ*v+sfwbNCZj1b z!AY+=o&x$>7oM;0Fi*8Zb;rLwYB*xIKUeAZMx~;8v)mdI!Ku$6d<5Hsd71_c_U@1O zuPEhN$oV)h_zMN_3!72H>rv+$PdyqrdGUD2z{EbY(mZfuyGw9;+S-){Q;sKGmJ$wnGbO5Ie}n^BY? zvl)wt%9Mbs$VNu-=U6*enD}##6BqEH1l+5e1l>`?n-vYu_bV1`iEeMux56FvZ~cul z%M9Lz;+of7uNJkfJLFt|IHRGij(;^$U?lv&d?Vclrr~!Z9V!JUq{OSOhx&NMI(GzU9VML(3} zOym4fE^?;idME`EFJ26&Z`pdfAi2ZG8k}i6&~5MJ;@w?OXSGVa+-pAQA|~Uz%%yKm zUmf)+M8U2W_9R}~m6WsClN}583R0@S(NAN-tmM+GkM64Oc^gydV2@u^TB_T(kb3}T zA&SQ1Md2)x@zkKS(PV9fX08y#gRidNdHHivUC9EL%-vAKfv;t~%U|4SPz;$Bm{Vmf zq+=cmgn~eDRc2jn6=o5Wq4uc0<{YoRdF=3pa+WZs=c4Apn9?Pn!VfI-oO?bgab2Ds zk^uzRwYlg}AOgUiT$6(!<@34dXb8&dxoA~U{4J3%-P2rD4>jiJ&O$4y{ZM(@<{j1Y z2~Js#;t^Q4juYSAoBj(IVuk7^`yA9AH>?0)waNabE9l zIv#%$FKIx_j-kdKHHpibKMm^g`AM|~6BVj+oNx*(4EI)wb`*gwsES=M0L?!te$~rJ z(=bfPOKzVUz4)zrX%92=Qp+$XwnBM8%$zTu;2_V{a(CX94=G+wa8y+|HKk)^NlQgEZ$oDYx6SE_`UKNc~+#Ld~n;*fn;(0-`y7P=+m{&VAq;w$|eQ}&qO~K!{{|k^}_)L`PFN{rwM_&HPY< ztx(ow`?o`L5=}NqR9Vy2g&h;cHM34@mY z)p8AF+(72Uf|Q2!!)d=93kGm3HyuIdK}*8m)63DNFr&#*%_5W|v&GmZ_l{RTBRjPl zt}tt9Q(3bvc$T>itq6DUDE3BWjxmYMut_t$Wpn!apCmuf05JzyBptopKeSVGU@zoE zQM%g!bR+^n#UXVxJPja=)rdbiKnYfan*4!+gFDVg?slt;M<2iM^F2tO?5tl(-P`YsA16EC3CrYNJo#+*S*W?vMd z{L#=7naombG!_+3)GXQ3B)m!HF5QpzxIoL5H-`D^%<>-MfL)-ZAoj(K}BZbeF5GDxz}~~ z^u${Y_%sv0`2>c7$f>+B-tr+aHeP<7aJ3k9DG!cAii>QlTtLm1{U+3|0}`AJLI?8D z?DEEN%ZUXb2r#+1B*j+5tU^}3DjM743<7^zz@VYOEJbdWpdi|{XzoMJE5V9)l%^Hcp&3y5 zy_G=YP-!Yt1IRMYP{~+m0FJ!H!kreSBovl7{DBYNB`zCUr=joQOZ@f@+ZTL@kYioL zli`#Z3u_SHSFp4~1D?C-Q;Tei|8?PWG{8!h8*~n(+Q~?`LLg_SGm^09VXWy^TmBQO|721dv z@*$j&f@)(~f!=(mLRD~iJB*gqMbkOql)oCB?Jrf0zLq87V(q;lcJ`4vx-BozUM|^o zh12$`;OQ_h+|WbcjW42%WozNFgzEgUeNu5Z?Wfa~DTws3~uW@pfz8dFRxARHBBUK&w+O{kh$ghLeulVN`>m9LG((_gW| z80-AFHlmtOR}X`}1Wc9x-HD}dYeQRJ#L~9fP`4cpUo{kGiColI%G+0=rgfmz>MNk0 zw7HHk0PmQcuLE}N(K4!#8*2n&Rf)PFn3r1AMN|r^Dux`J`+fa>MNgz*$npc4C1^Yl zG)=-Q+L8So?=eS|XTJ_t1 z%dfNcO`zuWjVJX3D6|14Z~!%EU`+M(HV79rB-(mN-#35eq6DL=9o30Sd~UqGzW5i$ nJEthQy7MP=xstQ{`ZvX$-Gb>%taAXhF78}peeOoi0oDH>LF)?) diff --git a/web-ui/components/Staking/modals/stakingProcessModal.tsx b/web-ui/components/Staking/modals/stakingProcessModal.tsx index db4bf9a36..b66671dfb 100644 --- a/web-ui/components/Staking/modals/stakingProcessModal.tsx +++ b/web-ui/components/Staking/modals/stakingProcessModal.tsx @@ -85,7 +85,7 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo let newChainName: string | undefined; if (selectedOption?.chainId === 'provider') { - newChainName = 'cosmoshub'; + newChainName = 'rsprovidertestnet'; } else if (selectedOption?.chainId === 'elgafar-1') { newChainName = 'stargazetestnet'; } else if (selectedOption?.chainId === 'osmo-test-5') { @@ -97,7 +97,7 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo newChainName = selectedOption?.chainName; } - const { address, getSigningStargateClient } = useChain(newChainName || ''); + const { address, getSigningStargateClient } = useChain(newChainName ?? ''); const labels = ['Choose validators', `Set weights`, `Sign & Submit`, `Receive q${selectedOption?.value}`]; const [isModalOpen, setModalOpen] = useState(false); diff --git a/web-ui/components/Staking/stakingBox.tsx b/web-ui/components/Staking/stakingBox.tsx index 0653f8ee2..d581a78ae 100644 --- a/web-ui/components/Staking/stakingBox.tsx +++ b/web-ui/components/Staking/stakingBox.tsx @@ -116,7 +116,10 @@ export const StakingBox = ({ selectedOption, isModalOpen, setModalOpen, setBalan const [isError, setIsError] = useState(false); const [transactionStatus, setTransactionStatus] = useState('Pending'); - const { getSigningStargateClient } = useChain('quicksilver'); + const env = process.env.NEXT_PUBLIC_CHAIN_ENV; + const quicksilverChainName = env === 'testnet' ? 'quicksilvertestnet' : 'quicksilver'; + + const { getSigningStargateClient } = useChain(quicksilverChainName); const isCalculationDataLoaded = tokenAmount && !isNaN(Number(tokenAmount)) && zone && !isNaN(Number(zone.redemptionRate)); diff --git a/web-ui/components/react/wallet-connect.tsx b/web-ui/components/react/wallet-connect.tsx index c274b36dd..d475822f0 100644 --- a/web-ui/components/react/wallet-connect.tsx +++ b/web-ui/components/react/wallet-connect.tsx @@ -15,7 +15,7 @@ export const ConnectWalletButton = ({ buttonText, isLoading, isDisabled, icon, o useEffect(() => { if (status === 'Done') { - client?.enable?.(['cosmoshub-4', 'osmosis-1', 'regen-1', 'sommelier-3', 'stargaze-1']); + client?.enable?.(['cosmoshub-4', 'osmosis-1', 'regen-1', 'sommelier-3', 'stargaze-1', 'quicksilver-1']); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [status]); diff --git a/web-ui/package.json b/web-ui/package.json index 7c47996d0..aade4053f 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -15,6 +15,7 @@ "@chakra-ui/icons": "^2.0.12", "@chakra-ui/react": "2.5.1", "@chakra-ui/system": "^2.1.3", + "@chalabi/chain-registry": "1.25.2", "@chalabi/quicksilverjs": "0.0.2", "@cosmjs/amino": "0.28.0", "@cosmjs/cosmwasm-stargate": "0.29.5", diff --git a/web-ui/pages/_app.tsx b/web-ui/pages/_app.tsx index a7ff0a821..776432235 100644 --- a/web-ui/pages/_app.tsx +++ b/web-ui/pages/_app.tsx @@ -10,7 +10,7 @@ import { wallets as leapWallets } from '@cosmos-kit/leap'; import { ChainProvider, ThemeCustomizationProps } from '@cosmos-kit/react'; import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; -import { chains, assets } from 'chain-registry'; +import { chains, assets } from '@chalabi/chain-registry'; import { cosmosAminoConverters, cosmosProtoRegistry } from 'interchain-query'; import type { AppProps } from 'next/app'; import { quicksilverProtoRegistry, quicksilverAminoConverters } from 'quicksilverjs'; @@ -88,45 +88,113 @@ function CreateCosmosApp({ Component, pageProps }: AppProps) { overrides: { 'connect-modal': { bg: { - light: 'black', - dark: 'black', + light: 'rgba(0,0,0,0.75)', + dark: 'rgba(32,32,32,0.9)', + }, + activeBg: { + light: 'rgba(0,0,0,0.75)', + dark: 'rgba(32,32,32,0.9)', }, color: { light: '#FFFFFF', dark: '#FFFFFF', }, }, - 'connect-modal-wallet-button': { + 'clipboard-copy-text': { + bg: { + light: '#FFFFFF', + dark: '#FFFFFF', + }, + }, + 'connect-modal-qr-code-shadow': { + bg: { + light: '#FFFFFF', + dark: '#FFFFFF', + }, + }, + button: { bg: { light: '#FF8000', dark: '#FF8000', }, + }, + 'connect-modal-head-title': { + bg: { + light: '#FFFFFF', + dark: '#FFFFFF', + }, + }, + 'connect-modal-wallet-button-label': { + bg: { + light: '#FFFFFF', + dark: '#FFFFFF', + }, + }, + 'connect-modal-wallet-button-sublogo': { + bg: { + light: '#FFFFFF', + dark: '#FFFFFF', + }, + }, + 'connect-modal-qr-code-loading': { + bg: { + light: '#FFFFFF', + dark: '#FFFFFF', + }, + }, + 'connect-modal-wallet-button': { + bg: { + light: 'rgba(55,55,55,0.9)', + dark: 'rgba(55,55,55,0.9', + }, hoverBg: { light: '#FF8000', dark: '#FF8000', }, hoverBorderColor: { + light: 'black', + dark: 'black', + }, + activeBorderColor: { light: '#FFFFFF', dark: '#FFFFFF', }, color: { - light: '#000000', // light theme text color - dark: '#FFFFFF', // dark theme text color + light: '#000000', + dark: '#FFFFFF', }, }, 'connect-modal-qr-code': { bg: { - light: '#FFFFFF', - dark: '#FFFFFF', + light: '', + dark: 'blue', }, color: { light: '#000000', dark: '#000000', }, }, - // You can add overrides for other components if necessary + 'connect-modal-install-button': { + bg: { + light: '#F0F0F0', // Example background color for light theme + dark: '#FF8000', // Example background color for dark theme + }, + // Other properties for 'connect-modal-install-button' if needed + }, + 'connect-modal-qr-code-error': { + bg: { + light: '#FFEEEE', // Example background color for light theme + dark: '#FFFFFF', // Example background color for dark theme + }, + // Other properties for 'connect-modal-qr-code-error' if needed + }, + 'connect-modal-qr-code-error-button': { + bg: { + light: '#FFCCCC', // Example background color for light theme + dark: '#552222', // Example background color for dark theme + }, + }, }, - // You can also specify 'defaultTheme', 'themeDefs', and 'customTheme' if needed }; return ( From 8d02c698866914a34afa3af7fa3807d8877cb074 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Mon, 1 Jan 2024 15:04:34 -0700 Subject: [PATCH 35/40] add better error/success handling for unstake tx, fix step handling in stakingProcessModal --- web-ui/README.md | 2 - .../Staking/modals/stakingProcessModal.tsx | 70 ++++++++++--- web-ui/components/Staking/stakingBox.tsx | 97 ++++++++++--------- web-ui/hooks/useToaster.tsx | 39 ++++++-- web-ui/hooks/{useTx.ts => useTx.tsx} | 33 +++++-- web-ui/tx/liquidStakeTx.tsx | 4 +- 6 files changed, 164 insertions(+), 81 deletions(-) rename web-ui/hooks/{useTx.ts => useTx.tsx} (70%) diff --git a/web-ui/README.md b/web-ui/README.md index 8175b5142..d26ae96f2 100644 --- a/web-ui/README.md +++ b/web-ui/README.md @@ -39,8 +39,6 @@ Please ensure your IDE is configured to use Typescript v4.9.3 **UI/UX** -- customize wallet connect modal - - Finish Mobile breakpoints - find different assets for side bar diff --git a/web-ui/components/Staking/modals/stakingProcessModal.tsx b/web-ui/components/Staking/modals/stakingProcessModal.tsx index b66671dfb..7db0c9963 100644 --- a/web-ui/components/Staking/modals/stakingProcessModal.tsx +++ b/web-ui/components/Staking/modals/stakingProcessModal.tsx @@ -97,7 +97,7 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo newChainName = selectedOption?.chainName; } - const { address, getSigningStargateClient } = useChain(newChainName ?? ''); + const { address, getSigningStargateClient } = useChain(newChainName || ''); const labels = ['Choose validators', `Set weights`, `Sign & Submit`, `Receive q${selectedOption?.value}`]; const [isModalOpen, setModalOpen] = useState(false); @@ -247,7 +247,11 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo }; const handleStepOneButtonClick = () => { - if (check) { + // Check if only one validator is selected + if (selectedValidators.length === 1) { + setUseDefaultWeights(true); + setStep(3); // Skip directly to step 3 + } else if (check) { // If checkbox is checked, skip directly to step 3 setStep(3); } else { @@ -358,15 +362,30 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo mt={4} width="55%" _hover={{ - bgColor: '#181818', + bgColor: 'complimentary.500', }} onClick={handleStepOneButtonClick} > - {check ? 'Skip to Step 3' : selectedValidators.length > 0 ? 'Next' : 'Choose Validators'} + {check ? 'Sign & Submit' : selectedValidators.length > 0 ? 'Next' : 'Choose Validators'} {selectedValidators.length === 0 && ( - + Proceed with existing intent? )} @@ -390,14 +409,26 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo - + {selectedValidators.length > 1 && ( + + )} diff --git a/web-ui/hooks/useToaster.tsx b/web-ui/hooks/useToaster.tsx index 98a245322..c9c776e4c 100644 --- a/web-ui/hooks/useToaster.tsx +++ b/web-ui/hooks/useToaster.tsx @@ -1,4 +1,4 @@ -import { useToast, Text, Box } from '@chakra-ui/react'; +import { useToast, Text, Box, Link } from '@chakra-ui/react'; export enum ToastType { Info = 'info', @@ -13,8 +13,9 @@ export type CustomToast = { message?: string | JSX.Element; closable?: boolean; duration?: number; + txHash?: string; + chainName?: string; }; - export const useToaster = () => { const toast = useToast({ position: 'top-right', @@ -23,20 +24,38 @@ export const useToaster = () => { }, }); - const customToast = ({ type, title, message, closable = true, duration = 5000 }: CustomToast) => { + const customToast = ({ type, title, message, closable = true, duration = 5000, txHash, chainName }: CustomToast) => { + let description; + + if (type === ToastType.Success && txHash) { + const mintscanUrl = `https://www.mintscan.io/${chainName}/txs/${txHash}`; + description = ( + + + {message} + + + View on Mintscan + + + ); + } else { + description = ( + + + {message} + + + ); + } + return toast({ position: 'bottom-right', title, duration, status: type, isClosable: closable, - description: ( - - - {message} - - - ), + description, }); }; diff --git a/web-ui/hooks/useTx.ts b/web-ui/hooks/useTx.tsx similarity index 70% rename from web-ui/hooks/useTx.ts rename to web-ui/hooks/useTx.tsx index a1f440fbf..30c98e6f4 100644 --- a/web-ui/hooks/useTx.ts +++ b/web-ui/hooks/useTx.tsx @@ -1,10 +1,19 @@ -import { ToastId } from '@chakra-ui/react'; +import { Box, color, Link, ToastId, useToast, Text } from '@chakra-ui/react'; import { isDeliverTxSuccess, StdFee } from '@cosmjs/stargate'; import { useChain } from '@cosmos-kit/react'; import { cosmos } from 'interchain-query'; import { TxRaw } from 'interchain-query/cosmos/tx/v1beta1/tx'; import { useToaster, ToastType, type CustomToast } from './useToaster'; +import { ChainName } from '@cosmos-kit/core'; +import { on } from 'events'; +import { isExternal } from 'util/types'; + +interface TxResult { + success: boolean; + txHash?: string; + error?: string; +} interface Msg { typeUrl: string; @@ -13,6 +22,7 @@ interface Msg { export interface TxOptions { fee?: StdFee | null; + memo?: string; toast?: Partial; onSuccess?: () => void; } @@ -26,19 +36,18 @@ export enum TxStatus { const txRaw = cosmos.tx.v1beta1.TxRaw; export const useTx = (chainName: string) => { - const { address, getSigningStargateClient, estimateFee } = - useChain(chainName); + const { address, getSigningStargateClient, estimateFee } = useChain(chainName); const toaster = useToaster(); - const tx = async (msgs: Msg[], options: TxOptions) => { + const tx = async (msgs: Msg[], options: TxOptions): Promise => { if (!address) { toaster.toast({ type: ToastType.Error, title: 'Wallet not connected', message: 'Please connect your wallet', }); - return; + return { success: false, error: 'Wallet not connected' }; } let signed: TxRaw; @@ -50,10 +59,7 @@ export const useTx = (chainName: string) => { fee = options.fee; client = await getSigningStargateClient(); } else { - const [_fee, _client] = await Promise.all([ - estimateFee(msgs), - getSigningStargateClient(), - ]); + const [_fee, _client] = await Promise.all([estimateFee(msgs), getSigningStargateClient()]); fee = _fee; client = _client; } @@ -65,7 +71,7 @@ export const useTx = (chainName: string) => { message: e?.message || 'An unexpected error has occured', type: ToastType.Error, }); - return; + return { success: false, error: 'An unexpected error has occured' }; } let broadcastToastId: ToastId; @@ -88,7 +94,10 @@ export const useTx = (chainName: string) => { title: options.toast?.title || TxStatus.Successful, type: options.toast?.type || ToastType.Success, message: options.toast?.message, + chainName: chainName, + txHash: res?.transactionHash, }); + return { success: true, txHash: res.transactionHash }; } else { toaster.toast({ title: TxStatus.Failed, @@ -96,6 +105,7 @@ export const useTx = (chainName: string) => { type: ToastType.Error, duration: 10000, }); + return { success: false, error: res.rawLog }; } }) .catch((err) => { @@ -105,10 +115,13 @@ export const useTx = (chainName: string) => { type: ToastType.Error, duration: 10000, }); + return { success: false, error: err.message }; }) .finally(() => toaster.close(broadcastToastId)); + return { success: false, error: 'Client not initialized or transaction not signed' }; } else { toaster.close(broadcastToastId); + return { success: false, error: 'Client not initialized or transaction not signed' }; } }; diff --git a/web-ui/tx/liquidStakeTx.tsx b/web-ui/tx/liquidStakeTx.tsx index cc00e6df9..ad936ef7a 100644 --- a/web-ui/tx/liquidStakeTx.tsx +++ b/web-ui/tx/liquidStakeTx.tsx @@ -4,8 +4,8 @@ import { coins, Coin, SigningStargateClient } from '@cosmjs/stargate'; import { ChainName, Dispatch } from '@cosmos-kit/core'; import { quicksilver } from '@hoangdv2429/quicksilverjs'; import { bech32 } from 'bech32'; -import { assets } from 'chain-registry'; -import chains from 'chain-registry'; +import { assets } from '@chalabi/chain-registry'; +import chains from '@chalabi/chain-registry'; import { cosmos } from 'interchain-query'; import { Zone } from 'quicksilverjs/types/codegen/quicksilver/interchainstaking/v1/interchainstaking'; import { SetStateAction } from 'react'; From 0f1c15ae7e00a5cab63832298b7272c9d715bab6 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Mon, 1 Jan 2024 15:15:09 -0700 Subject: [PATCH 36/40] fix wallet error, add empty export to bypass error for staking url page --- web-ui/components/Staking/modals/stakingProcessModal.tsx | 2 +- web-ui/components/Staking/stakingBox.tsx | 2 +- web-ui/components/react/wallet-connect.tsx | 2 +- web-ui/pages/staking/[chainId]/[valoperAddress].tsx | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/web-ui/components/Staking/modals/stakingProcessModal.tsx b/web-ui/components/Staking/modals/stakingProcessModal.tsx index 7db0c9963..85ecc74ed 100644 --- a/web-ui/components/Staking/modals/stakingProcessModal.tsx +++ b/web-ui/components/Staking/modals/stakingProcessModal.tsx @@ -85,7 +85,7 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo let newChainName: string | undefined; if (selectedOption?.chainId === 'provider') { - newChainName = 'rsprovidertestnet'; + newChainName = 'cosmoshub'; } else if (selectedOption?.chainId === 'elgafar-1') { newChainName = 'stargazetestnet'; } else if (selectedOption?.chainId === 'osmo-test-5') { diff --git a/web-ui/components/Staking/stakingBox.tsx b/web-ui/components/Staking/stakingBox.tsx index 16ee07057..3967a934c 100644 --- a/web-ui/components/Staking/stakingBox.tsx +++ b/web-ui/components/Staking/stakingBox.tsx @@ -54,7 +54,7 @@ export const StakingBox = ({ selectedOption, isModalOpen, setModalOpen, setBalan const [tokenAmount, setTokenAmount] = useState('0'); let newChainName: string | undefined; if (selectedOption?.chainId === 'provider') { - newChainName = 'rsprovidertestnet'; + newChainName = 'cosmoshub'; } else if (selectedOption?.chainId === 'elgafar-1') { newChainName = 'stargazetestnet'; } else if (selectedOption?.chainId === 'osmo-test-5') { diff --git a/web-ui/components/react/wallet-connect.tsx b/web-ui/components/react/wallet-connect.tsx index d475822f0..c274b36dd 100644 --- a/web-ui/components/react/wallet-connect.tsx +++ b/web-ui/components/react/wallet-connect.tsx @@ -15,7 +15,7 @@ export const ConnectWalletButton = ({ buttonText, isLoading, isDisabled, icon, o useEffect(() => { if (status === 'Done') { - client?.enable?.(['cosmoshub-4', 'osmosis-1', 'regen-1', 'sommelier-3', 'stargaze-1', 'quicksilver-1']); + client?.enable?.(['cosmoshub-4', 'osmosis-1', 'regen-1', 'sommelier-3', 'stargaze-1']); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [status]); diff --git a/web-ui/pages/staking/[chainId]/[valoperAddress].tsx b/web-ui/pages/staking/[chainId]/[valoperAddress].tsx index e69de29bb..cb0ff5c3b 100644 --- a/web-ui/pages/staking/[chainId]/[valoperAddress].tsx +++ b/web-ui/pages/staking/[chainId]/[valoperAddress].tsx @@ -0,0 +1 @@ +export {}; From 5dc10fa74783cf88993aaf6d87127e8263d4967e Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Mon, 1 Jan 2024 15:21:57 -0700 Subject: [PATCH 37/40] add filler to allow build --- web-ui/pages/staking/[chainId]/[valoperAddress].tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/web-ui/pages/staking/[chainId]/[valoperAddress].tsx b/web-ui/pages/staking/[chainId]/[valoperAddress].tsx index cb0ff5c3b..3b82535f8 100644 --- a/web-ui/pages/staking/[chainId]/[valoperAddress].tsx +++ b/web-ui/pages/staking/[chainId]/[valoperAddress].tsx @@ -1 +1,9 @@ -export {}; +import { Text } from '@interchain-ui/react'; + +export default function Home() { + return ( + <> + Hello world + + ); +} From 3279614221b29c39b28aae42e84dd51a0f08243c Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Mon, 1 Jan 2024 19:03:55 -0700 Subject: [PATCH 38/40] add more mobile resisizng --- web-ui/components/Defi/defiBox.tsx | 81 ++++++++++++++++++-------- web-ui/components/react/sideHeader.tsx | 25 ++++++-- web-ui/pages/assets.tsx | 11 +++- web-ui/pages/governance.tsx | 2 +- 4 files changed, 89 insertions(+), 30 deletions(-) diff --git a/web-ui/components/Defi/defiBox.tsx b/web-ui/components/Defi/defiBox.tsx index 7dd5fa601..9cfb5ffce 100644 --- a/web-ui/components/Defi/defiBox.tsx +++ b/web-ui/components/Defi/defiBox.tsx @@ -19,6 +19,7 @@ import { Link, Center, Spinner, + useBreakpointValue, } from '@chakra-ui/react'; import { ChevronDownIcon, ExternalLinkIcon } from '@chakra-ui/icons'; import { useDefiData } from '@/hooks/useQueries'; @@ -64,37 +65,71 @@ const DefiTable = () => { const { defi, isLoading, isError } = useDefiData(); const [activeFilter, setActiveFilter] = useState('All'); + const filterOptions = Object.keys(filterCategories); + + const handleFilterChange = (event: React.ChangeEvent) => { + setActiveFilter(event.target.value); + }; const handleFilterClick = (filter: string) => { setActiveFilter(filter); }; - + const isMobile = useBreakpointValue({ base: true, 1013: true, md: false }); const filteredData = defi ? defi.filter(filterCategories[activeFilter]) : []; return ( - - {Object.keys(filterCategories).map((filter) => ( - - ))} - + {isMobile ? ( + + ) : ( + + {filterOptions.map((filter) => ( + + ))} + + )} diff --git a/web-ui/components/react/sideHeader.tsx b/web-ui/components/react/sideHeader.tsx index 2cde7e36e..37fa021d7 100644 --- a/web-ui/components/react/sideHeader.tsx +++ b/web-ui/components/react/sideHeader.tsx @@ -44,7 +44,22 @@ export const SideHeader = () => { const commonBoxShadowColor = 'rgba(255, 128, 0, 0.25)'; const toggleSocialLinks = () => setShowSocialLinks(!showSocialLinks); - const isMobile = useBreakpointValue({ base: true, md: false }); + const [isMobile, setIsMobile] = useState(typeof window !== 'undefined' && window.innerWidth < 1274); + + // Handle window resize + useEffect(() => { + const handleResize = () => { + setIsMobile(window.innerWidth < 1274); + }; + + // Set up event listener + window.addEventListener('resize', handleResize); + + // Clean up + return () => { + window.removeEventListener('resize', handleResize); + }; + }, []); const transitionStyle = 'all 0.3s ease'; const { isOpen, onOpen, onClose } = useDisclosure(); @@ -77,19 +92,19 @@ export const SideHeader = () => { return ( - + - + Assets diff --git a/web-ui/pages/governance.tsx b/web-ui/pages/governance.tsx index 38819f1ec..40daead63 100644 --- a/web-ui/pages/governance.tsx +++ b/web-ui/pages/governance.tsx @@ -20,7 +20,7 @@ export default function Home() { - + Proposals From 6638a298f26e4361ac8f69b85a49f7fa9ff4beea Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 3 Jan 2024 00:07:19 -0700 Subject: [PATCH 39/40] update todo, misc ui updates --- web-ui/README.md | 12 +++ web-ui/components/react/sideHeader.tsx | 9 +-- web-ui/pages/assets.tsx | 2 +- web-ui/pages/staking/index.tsx | 2 +- web-ui/public/img/bgLogo.svg | 21 +++++ web-ui/public/img/textLogo.svg | 103 +++++++++++++++++++++++++ 6 files changed, 142 insertions(+), 7 deletions(-) create mode 100644 web-ui/public/img/bgLogo.svg create mode 100644 web-ui/public/img/textLogo.svg diff --git a/web-ui/README.md b/web-ui/README.md index d26ae96f2..1b5c9e277 100644 --- a/web-ui/README.md +++ b/web-ui/README.md @@ -41,12 +41,18 @@ Please ensure your IDE is configured to use Typescript v4.9.3 - Finish Mobile breakpoints +- focus on mobile landscape breakpoints, (mainly staking page) + - find different assets for side bar **Mobile Menu** - design +- connect wallet button + +- graphic elements + - font size / style / decorations **DevOps** @@ -57,8 +63,14 @@ Please ensure your IDE is configured to use Typescript v4.9.3 - claim rewards claim.test.quicksilver.zone/address/current \*/epoch +- intent query + +- unbonding query + **Staking Page** +- check memo intent creation + - validator route app.quicksilver.zone/staking/chainId/valoperAddress - fix succesful transaction on staking modal not taking you to final step diff --git a/web-ui/components/react/sideHeader.tsx b/web-ui/components/react/sideHeader.tsx index 37fa021d7..740f13962 100644 --- a/web-ui/components/react/sideHeader.tsx +++ b/web-ui/components/react/sideHeader.tsx @@ -101,10 +101,9 @@ export const SideHeader = () => { position="fixed" bgColor="rgba(214, 219, 220, 0.1)" > - + { - + - - Quicksilver + + QUICKSILVER {['Staking', 'Governance', 'Defi', 'Assets'].map((item) => ( diff --git a/web-ui/pages/assets.tsx b/web-ui/pages/assets.tsx index 66ef572e9..b4b4bd323 100644 --- a/web-ui/pages/assets.tsx +++ b/web-ui/pages/assets.tsx @@ -269,7 +269,7 @@ function Home() { {/* Unbonding Table */} - + diff --git a/web-ui/pages/staking/index.tsx b/web-ui/pages/staking/index.tsx index 7351f2b53..218422803 100644 --- a/web-ui/pages/staking/index.tsx +++ b/web-ui/pages/staking/index.tsx @@ -78,7 +78,7 @@ export default function Staking() { - + {/* + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web-ui/public/img/textLogo.svg b/web-ui/public/img/textLogo.svg new file mode 100644 index 000000000..dbb551644 --- /dev/null +++ b/web-ui/public/img/textLogo.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From a29317da02bcad746170f2756fdd17ba14bde98a Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 3 Jan 2024 00:17:41 -0700 Subject: [PATCH 40/40] make unbonding table header sticky --- web-ui/components/Assets/unbondingTable.tsx | 22 +++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/web-ui/components/Assets/unbondingTable.tsx b/web-ui/components/Assets/unbondingTable.tsx index a53c2b532..c49b4ff54 100644 --- a/web-ui/components/Assets/unbondingTable.tsx +++ b/web-ui/components/Assets/unbondingTable.tsx @@ -87,13 +87,23 @@ const UnbondingAssetsTable: React.FC = ({ address, ch
- + - - - - - + + + + +
AssetStatusRedemption AmountUnstaked OnCompletion Time + Asset + + Status + + Redemption Amount + + Unstaked On + + Completion Time +