From 491f1e0e3af41db9348baad932056c925b37f518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Miko=C5=82ajczyk?= Date: Wed, 8 Jan 2025 08:47:10 +0100 Subject: [PATCH] oct-2264: sablier ui update --- ...{userWinnings.ts => userSablierStreams.ts} | 8 ++- client/src/api/queryKeys/index.ts | 4 +- client/src/api/queryKeys/types.ts | 4 +- .../HomeGridCurrentGlmLock.tsx | 29 ++++++--- .../LockGlmBudgetBox.module.scss | 30 +++++++++ .../LockGlmBudgetBox/LockGlmBudgetBox.tsx | 44 ++++++++----- .../ModalLockGlm/LockGlmTabs/LockGlmTabs.tsx | 8 +-- .../RaffleWinnerBadge.module.scss | 33 +++++++--- .../RaffleWinnerBadge/RaffleWinnerBadge.tsx | 63 +++++++++++++------ client/src/constants/urls.ts | 1 + .../hooks/queries/useUserRaffleWinnings.ts | 28 --------- .../hooks/queries/useUserSablierStreams.ts | 34 ++++++++++ client/src/locales/en/translation.json | 14 ++--- 13 files changed, 202 insertions(+), 98 deletions(-) rename client/src/api/calls/{userWinnings.ts => userSablierStreams.ts} (54%) delete mode 100644 client/src/hooks/queries/useUserRaffleWinnings.ts create mode 100644 client/src/hooks/queries/useUserSablierStreams.ts diff --git a/client/src/api/calls/userWinnings.ts b/client/src/api/calls/userSablierStreams.ts similarity index 54% rename from client/src/api/calls/userWinnings.ts rename to client/src/api/calls/userSablierStreams.ts index 6c1af2e690..63524160bd 100644 --- a/client/src/api/calls/userWinnings.ts +++ b/client/src/api/calls/userSablierStreams.ts @@ -2,14 +2,16 @@ import env from 'env'; import apiService from 'services/apiService'; export type Response = { - winnings: { + sablierStreams: { amount: string; dateAvailableForWithdrawal: string; + isCancelled: boolean; + remainingAmount: string; }[]; }; -export async function apiGetUserRaffleWinnings(address: string): Promise { +export async function apiGetUserSablierStreams(address: string): Promise { return apiService - .get(`${env.serverEndpoint}user/${address}/raffle/winnings`) + .get(`${env.serverEndpoint}user/${address}/sablier-streams`) .then(({ data }) => data); } diff --git a/client/src/api/queryKeys/index.ts b/client/src/api/queryKeys/index.ts index fe480a2ff6..6b5e63f6ac 100644 --- a/client/src/api/queryKeys/index.ts +++ b/client/src/api/queryKeys/index.ts @@ -22,8 +22,8 @@ export const ROOTS: Root = { projectsDonors: 'projectsDonors', projectsEpoch: 'projectsEpoch', projectsIpfsResults: 'projectsIpfsResults', - raffleWinnings: 'raffleWinnings', rewardsRate: 'rewardsRate', + sablierStreams: 'sablierStreams', searchResultsDetails: 'searchResultsDetails', upcomingBudget: 'upcomingBudget', uqScore: 'uqScore', @@ -75,8 +75,8 @@ export const QUERY_KEYS: QueryKeys = { ], projectsMetadataAccumulateds: ['projectsMetadataAccumulateds'], projectsMetadataPerEpoches: ['projectsMetadataPerEpoches'], - raffleWinnings: userAddress => [ROOTS.raffleWinnings, userAddress], rewardsRate: epochNumber => [ROOTS.rewardsRate, epochNumber.toString()], + sablierStreams: userAddress => [ROOTS.sablierStreams, userAddress], searchResults: ['searchResults'], searchResultsDetails: (address, epoch) => [ROOTS.searchResultsDetails, address, epoch.toString()], syncStatus: ['syncStatus'], diff --git a/client/src/api/queryKeys/types.ts b/client/src/api/queryKeys/types.ts index 1fc076887a..590d47f0c3 100644 --- a/client/src/api/queryKeys/types.ts +++ b/client/src/api/queryKeys/types.ts @@ -22,8 +22,8 @@ export type Root = { projectsDonors: 'projectsDonors'; projectsEpoch: 'projectsEpoch'; projectsIpfsResults: 'projectsIpfsResults'; - raffleWinnings: 'raffleWinnings'; rewardsRate: 'rewardsRate'; + sablierStreams: 'sablierStreams'; searchResultsDetails: 'searchResultsDetails'; upcomingBudget: 'upcomingBudget'; uqScore: 'uqScore'; @@ -75,8 +75,8 @@ export type QueryKeys = { ) => [Root['projectsIpfsResults'], string, string]; projectsMetadataAccumulateds: ['projectsMetadataAccumulateds']; projectsMetadataPerEpoches: ['projectsMetadataPerEpoches']; - raffleWinnings: (userAddress: string) => [Root['raffleWinnings'], string]; rewardsRate: (epochNumber: number) => [Root['rewardsRate'], string]; + sablierStreams: (userAddress: string) => [Root['sablierStreams'], string]; searchResults: ['searchResults']; searchResultsDetails: ( address: string, diff --git a/client/src/components/Home/HomeGridCurrentGlmLock/HomeGridCurrentGlmLock.tsx b/client/src/components/Home/HomeGridCurrentGlmLock/HomeGridCurrentGlmLock.tsx index 8367a51ae5..d806c537b3 100644 --- a/client/src/components/Home/HomeGridCurrentGlmLock/HomeGridCurrentGlmLock.tsx +++ b/client/src/components/Home/HomeGridCurrentGlmLock/HomeGridCurrentGlmLock.tsx @@ -1,5 +1,5 @@ import _first from 'lodash/first'; -import React, { FC, useState } from 'react'; +import React, { FC, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useAccount } from 'wagmi'; @@ -12,7 +12,7 @@ import useMediaQuery from 'hooks/helpers/useMediaQuery'; import useCurrentEpoch from 'hooks/queries/useCurrentEpoch'; import useDepositValue from 'hooks/queries/useDepositValue'; import useEstimatedEffectiveDeposit from 'hooks/queries/useEstimatedEffectiveDeposit'; -import useUserRaffleWinnings from 'hooks/queries/useUserRaffleWinnings'; +import useUserSablierStreams from 'hooks/queries/useUserSablierStreams'; import useTransactionLocalStore from 'store/transactionLocal/store'; import getIsPreLaunch from 'utils/getIsPreLaunch'; @@ -38,11 +38,22 @@ const HomeGridCurrentGlmLock: FC = ({ className }) const { data: estimatedEffectiveDeposit, isFetching: isFetchingEstimatedEffectiveDeposit } = useEstimatedEffectiveDeposit(); const { data: depositsValue, isFetching: isFetchingDepositValue } = useDepositValue(); - const { data: userRaffleWinnings, isFetching: isFetchingUserRaffleWinnings } = - useUserRaffleWinnings(); + const { data: userSablierStreams, isFetching: isFetchinguserSablierStreams } = + useUserSablierStreams(); const isPreLaunch = getIsPreLaunch(currentEpoch); - const didUserWinAnyRaffles = !!userRaffleWinnings && userRaffleWinnings.sum > 0; + const didUserWinAnyRaffles = !!userSablierStreams && userSablierStreams.sum > 0; + + const buttonText = useMemo(() => { + if (userSablierStreams && userSablierStreams.sumAvailable > 0n) { + return t('editLockedGLM'); + } + if (!depositsValue || (!!depositsValue && depositsValue === 0n)) { + return i18n.t('common.lockGlm'); + } + return t('editLockedGLM'); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [depositsValue, userSablierStreams?.sumAvailable]); return ( <> @@ -59,12 +70,12 @@ const HomeGridCurrentGlmLock: FC = ({ className }) dataTest="HomeGridCurrentGlmLock--current" isFetching={ isFetchingDepositValue || - isFetchingUserRaffleWinnings || + isFetchinguserSablierStreams || (isAppWaitingForTransactionToBeIndexed && _first(transactionsPending)?.type !== 'withdrawal') } showCryptoSuffix - valueCrypto={(depositsValue || 0n) + (userRaffleWinnings?.sum || 0n)} + valueCrypto={(depositsValue || 0n) + (userSablierStreams?.sumAvailable || 0n)} variant={isMobile ? 'large' : 'extra-large'} />
@@ -104,9 +115,7 @@ const HomeGridCurrentGlmLock: FC = ({ className }) onClick={() => setIsModalLockGlmOpen(true)} variant="cta" > - {!depositsValue || (!!depositsValue && depositsValue === 0n) - ? i18n.t('common.lockGlm') - : t('editLockedGLM')} + {buttonText}
diff --git a/client/src/components/Home/HomeGridCurrentGlmLock/ModalLockGlm/LockGlmBudgetBox/LockGlmBudgetBox.module.scss b/client/src/components/Home/HomeGridCurrentGlmLock/ModalLockGlm/LockGlmBudgetBox/LockGlmBudgetBox.module.scss index aafbfc59d3..975ed2572d 100644 --- a/client/src/components/Home/HomeGridCurrentGlmLock/ModalLockGlm/LockGlmBudgetBox/LockGlmBudgetBox.module.scss +++ b/client/src/components/Home/HomeGridCurrentGlmLock/ModalLockGlm/LockGlmBudgetBox/LockGlmBudgetBox.module.scss @@ -36,3 +36,33 @@ } } } + +.timeLockedInSablier { + text-align: left; + position: relative; +} + +.tooltipWrapper { + left: 1rem; + top: -6.8rem; + + .tooltip { + position: initial; + } +} + +.svgWrapper { + width: 1.6rem; + height: 1.6rem; +} + +.tooltipBox { + margin: 0.1rem 0 0 0.4rem; +} + +.unlockInSablierButton { + position: absolute; + padding: 0; + font-size: 1rem; + bottom: -1.4rem; +} diff --git a/client/src/components/Home/HomeGridCurrentGlmLock/ModalLockGlm/LockGlmBudgetBox/LockGlmBudgetBox.tsx b/client/src/components/Home/HomeGridCurrentGlmLock/ModalLockGlm/LockGlmBudgetBox/LockGlmBudgetBox.tsx index 9924d1cf86..a8c63d8507 100644 --- a/client/src/components/Home/HomeGridCurrentGlmLock/ModalLockGlm/LockGlmBudgetBox/LockGlmBudgetBox.tsx +++ b/client/src/components/Home/HomeGridCurrentGlmLock/ModalLockGlm/LockGlmBudgetBox/LockGlmBudgetBox.tsx @@ -1,12 +1,13 @@ import cx from 'classnames'; -import { format } from 'date-fns'; import React, { FC, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import BoxRounded from 'components/ui/BoxRounded'; +import Button from 'components/ui/Button'; +import { SABLIER_APP_LINK } from 'constants/urls'; import useAvailableFundsGlm from 'hooks/helpers/useAvailableFundsGlm'; import useDepositValue from 'hooks/queries/useDepositValue'; -import useUserRaffleWinnings from 'hooks/queries/useUserRaffleWinnings'; +import useUserSablierStreams from 'hooks/queries/useUserSablierStreams'; import getFormattedGlmValue from 'utils/getFormattedGlmValue'; import AvailableFundsGlm from './AvailableFundsGlm'; @@ -22,41 +23,52 @@ const LockGlmBudgetBox: FC = ({ const { data: depositsValue, isFetching: isFetchingDepositValue } = useDepositValue(); const { data: availableFundsGlm, isFetching: isFetchingAvailableFundsGlm } = useAvailableFundsGlm(); - const { data: userRaffleWinnings, isFetching: isFetchingUserRaffleWinnings } = - useUserRaffleWinnings(); + const { data: userSablierStreams, isFetching: isFetchinguserSablierStreams } = + useUserSablierStreams(); const { t } = useTranslation('translation', { keyPrefix: 'components.home.homeGridCurrentGlmLock.modalLockGlm.lockGlmBudgetBox', }); const depositsValueString = useMemo( - () => getFormattedGlmValue({ value: depositsValue || BigInt(0) }).fullString, - [depositsValue], + () => + getFormattedGlmValue({ + value: + (depositsValue || 0n) + + ((currentMode === 'lock' && userSablierStreams?.sumAvailable) || 0n), + }).fullString, + [depositsValue, currentMode, userSablierStreams?.sumAvailable], ); const shouldRaffleWinningsBeDisplayed = - currentMode === 'unlock' && userRaffleWinnings && userRaffleWinnings.sum > 0; - const areFundsFetching = isFetchingAvailableFundsGlm || isFetchingUserRaffleWinnings; + currentMode === 'unlock' && userSablierStreams && userSablierStreams.sum > 0; + const areFundsFetching = isFetchingAvailableFundsGlm || isFetchinguserSablierStreams; const secondRowValue = getFormattedGlmValue({ value: shouldRaffleWinningsBeDisplayed - ? userRaffleWinnings?.sum + ? userSablierStreams?.sumAvailable : BigInt(availableFundsGlm ? availableFundsGlm!.value : 0), }).fullString; const secondRowLabel = useMemo(() => { if (shouldRaffleWinningsBeDisplayed) { - const date = format( - parseInt(userRaffleWinnings?.winnings[0].dateAvailableForWithdrawal, 10) * 1000, - 'd LLL y', + return ( +
+ {t('timeLockedInSablier')} + +
); - return userRaffleWinnings?.winnings.length > 1 - ? t('raffleWinnings.multipleWins') - : t('raffleWinnings.oneWin', { date }); } return t('walletBalance'); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [shouldRaffleWinningsBeDisplayed, userRaffleWinnings?.winnings.length]); + }, [shouldRaffleWinningsBeDisplayed, userSablierStreams?.sablierStreams.length]); return ( = ({ const { data: availableFundsGlm } = useAvailableFundsGlm(); const { data: depositsValue } = useDepositValue(); - const { data: userRaffleWinnings } = useUserRaffleWinnings(); + const { data: userSablierStreams } = useUserSablierStreams(); const isMaxDisabled = isLoading || step > 1; @@ -86,7 +86,7 @@ const LockGlmTabs: FC = ({ const isButtonDisabled = !formik.isValid || parseUnitsBigInt(formik.values.valueToDeposeOrWithdraw || '0') === 0n; - const didUserWinAnyRaffles = !!userRaffleWinnings && userRaffleWinnings.sum > 0; + const didUserWinAnyRaffles = !!userSablierStreams && userSablierStreams.sum > 0; const shouldRaffleLabelBeVisible = didUserWinAnyRaffles && currentMode === 'unlock'; return ( @@ -142,7 +142,7 @@ const LockGlmTabs: FC = ({ { getFormattedGlmValue({ value: shouldRaffleLabelBeVisible - ? userRaffleWinnings?.sum + ? userSablierStreams?.sum : depositsValue || BigInt(0), }).value } diff --git a/client/src/components/Home/HomeGridCurrentGlmLock/RaffleWinnerBadge/RaffleWinnerBadge.module.scss b/client/src/components/Home/HomeGridCurrentGlmLock/RaffleWinnerBadge/RaffleWinnerBadge.module.scss index 089fa62f07..bc16b5a503 100644 --- a/client/src/components/Home/HomeGridCurrentGlmLock/RaffleWinnerBadge/RaffleWinnerBadge.module.scss +++ b/client/src/components/Home/HomeGridCurrentGlmLock/RaffleWinnerBadge/RaffleWinnerBadge.module.scss @@ -15,6 +15,31 @@ $padding: 1.1rem; padding: 0 $padding; transition: opacity $transition-time-1; + &.isSablierStreamCancelled { + background: $color-octant-orange5; + color: $color-octant-orange; + + .img { + path { + stroke: $color-octant-orange; + + &:hover { + stroke: $color-octant-orange; + } + } + } + } + + &:not(.isSablierStreamCancelled) { + .tooltipWrapper { + &:hover { + path { + stroke: $color-white !important; + } + } + } + } + .img { margin-right: $padding; } @@ -28,14 +53,6 @@ $padding: 1.1rem; } } -.tooltipWrapper { - &:hover { - path { - stroke: $color-white !important; - } - } -} - .tooltip { white-space: pre-wrap; width: 29.2rem !important; diff --git a/client/src/components/Home/HomeGridCurrentGlmLock/RaffleWinnerBadge/RaffleWinnerBadge.tsx b/client/src/components/Home/HomeGridCurrentGlmLock/RaffleWinnerBadge/RaffleWinnerBadge.tsx index 3a80d68134..3fc68177ee 100644 --- a/client/src/components/Home/HomeGridCurrentGlmLock/RaffleWinnerBadge/RaffleWinnerBadge.tsx +++ b/client/src/components/Home/HomeGridCurrentGlmLock/RaffleWinnerBadge/RaffleWinnerBadge.tsx @@ -1,14 +1,14 @@ import cx from 'classnames'; import { format } from 'date-fns'; -import React, { FC } from 'react'; +import React, { FC, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import Svg from 'components/ui/Svg/Svg'; import Tooltip from 'components/ui/Tooltip'; import useGetValuesToDisplay from 'hooks/helpers/useGetValuesToDisplay'; import useDepositValue from 'hooks/queries/useDepositValue'; -import useUserRaffleWinnings from 'hooks/queries/useUserRaffleWinnings'; -import { gift } from 'svg/misc'; +import useUserSablierStreams from 'hooks/queries/useUserSablierStreams'; +import { cross, gift } from 'svg/misc'; import getFormattedValueWithSymbolSuffix from 'utils/getFormattedValueWithSymbolSuffix'; import { parseUnitsBigInt } from 'utils/parseUnitsBigInt'; @@ -22,26 +22,30 @@ const RaffleWinnerBadge: FC = ({ isVisible }) => { const getValuesToDisplay = useGetValuesToDisplay(); const { data: depositsValue } = useDepositValue(); - const { data: userRaffleWinnings } = useUserRaffleWinnings(); + const { data: userSablierStreams } = useUserSablierStreams(); - const userRaffleWinningsSumFormatted = userRaffleWinnings + const userSablierStreamsSumFormatted = userSablierStreams ? getValuesToDisplay({ cryptoCurrency: 'golem', showFiatPrefix: false, - valueCrypto: userRaffleWinnings.sum, + valueCrypto: userSablierStreams.sum, }) : undefined; - const userRaffleWinningsSumFloat = userRaffleWinningsSumFormatted - ? parseFloat(userRaffleWinningsSumFormatted.primary.replace(/\s/g, '')) + const isSablierStreamCancelled = userSablierStreams?.sablierStreams.some( + ({ isCancelled }) => isCancelled, + ); + + const userSablierStreamsSumFloat = userSablierStreamsSumFormatted + ? parseFloat(userSablierStreamsSumFormatted.primary.replace(/\s/g, '')) : 0; - const userRaffleWinningsSumFormattedWithSymbolSuffix = getFormattedValueWithSymbolSuffix({ + const userSablierStreamsSumFormattedWithSymbolSuffix = getFormattedValueWithSymbolSuffix({ format: 'thousands', precision: 0, - value: userRaffleWinningsSumFloat, + value: userSablierStreamsSumFloat, }); - const tooltipWinningsText = userRaffleWinnings?.winnings.reduce((acc, curr, index) => { + const tooltipWinningsText = userSablierStreams?.sablierStreams.reduce((acc, curr, index) => { const amountFormatted = getValuesToDisplay({ cryptoCurrency: 'golem', showCryptoSuffix: true, @@ -63,21 +67,44 @@ const RaffleWinnerBadge: FC = ({ isVisible }) => { }) : undefined; - const tooltipText = - depositsValue && depositsValue > 0n && depositsValueFormatted - ? `${tooltipWinningsText}\n${t('tooltipCurrentBalanceRow', { value: depositsValueFormatted.primary })}` - : tooltipWinningsText; + const tooltipText = useMemo(() => { + if (isSablierStreamCancelled) { + return t('tooltipStreamCancelled'); + } + if (depositsValue && depositsValue > 0n && depositsValueFormatted) { + return `${tooltipWinningsText}\n${t('tooltipCurrentBalanceRow', { value: depositsValueFormatted.primary })}`; + } + return tooltipWinningsText; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + depositsValue, + isSablierStreamCancelled, + tooltipWinningsText, + depositsValueFormatted?.primary, + ]); return ( -
+
- - {t('text', { value: userRaffleWinningsSumFormattedWithSymbolSuffix })} + + {t(isSablierStreamCancelled ? 'textCancelled' : 'text', { + value: userSablierStreamsSumFormattedWithSymbolSuffix, + })}
); diff --git a/client/src/constants/urls.ts b/client/src/constants/urls.ts index d84ff08244..f0ded3901a 100644 --- a/client/src/constants/urls.ts +++ b/client/src/constants/urls.ts @@ -16,3 +16,4 @@ export const TIME_OUT_LIST_DISPUTE_FORM = 'https://octant.fillout.com/t/wLNsbSGJ export const SYBIL_ATTACK_EXPLANATION = 'https://chain.link/education-hub/sybil-attack'; export const PRIVACY_POLICY = 'https://docs.octant.app/privacy-policy.html'; export const KARMA_GAP = 'https://gap.karmahq.xyz'; +export const SABLIER_APP_LINK = 'https://app.sablier.com/'; diff --git a/client/src/hooks/queries/useUserRaffleWinnings.ts b/client/src/hooks/queries/useUserRaffleWinnings.ts deleted file mode 100644 index 4c9c3787f3..0000000000 --- a/client/src/hooks/queries/useUserRaffleWinnings.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { useQuery, UseQueryResult } from '@tanstack/react-query'; -import { useAccount } from 'wagmi'; - -import { apiGetUserRaffleWinnings, Response } from 'api/calls/userWinnings'; -import { QUERY_KEYS } from 'api/queryKeys'; -import { parseUnitsBigInt } from 'utils/parseUnitsBigInt'; - -type ReturnType = { - sum: bigint; - winnings: Response['winnings']; -}; - -export default function useUserRaffleWinnings(): UseQueryResult { - const { address } = useAccount(); - - return useQuery({ - enabled: !!address, - queryFn: () => apiGetUserRaffleWinnings(address!), - queryKey: QUERY_KEYS.raffleWinnings(address!), - select: response => ({ - sum: response.winnings.reduce( - (acc, curr) => acc + parseUnitsBigInt(curr.amount, 'wei'), - BigInt(0), - ), - winnings: response.winnings, - }), - }); -} diff --git a/client/src/hooks/queries/useUserSablierStreams.ts b/client/src/hooks/queries/useUserSablierStreams.ts new file mode 100644 index 0000000000..c28ce7f92c --- /dev/null +++ b/client/src/hooks/queries/useUserSablierStreams.ts @@ -0,0 +1,34 @@ +import { useQuery, UseQueryResult } from '@tanstack/react-query'; +import { useAccount } from 'wagmi'; + +import { apiGetUserSablierStreams, Response } from 'api/calls/userSablierStreams'; +import { QUERY_KEYS } from 'api/queryKeys'; +import { parseUnitsBigInt } from 'utils/parseUnitsBigInt'; + +type ReturnType = { + sablierStreams: Response['sablierStreams']; + sum: bigint; + sumAvailable: bigint; +}; + +export default function useUserSablierStreams(): UseQueryResult { + const { address } = useAccount(); + + return useQuery({ + enabled: !!address, + queryFn: () => apiGetUserSablierStreams(address!), + queryKey: QUERY_KEYS.sablierStreams(address!), + select: response => ({ + sablierStreams: response.sablierStreams, + sum: response.sablierStreams.reduce((acc, curr) => { + return acc + parseUnitsBigInt(curr.amount, 'wei'); + }, BigInt(0)), + sumAvailable: response.sablierStreams.reduce((acc, curr) => { + if (curr.isCancelled) { + return acc; + } + return acc + parseUnitsBigInt(curr.remainingAmount, 'wei'); + }, BigInt(0)), + }), + }); +} diff --git a/client/src/locales/en/translation.json b/client/src/locales/en/translation.json index 8330c39bab..2eaf2c6f23 100644 --- a/client/src/locales/en/translation.json +++ b/client/src/locales/en/translation.json @@ -118,15 +118,15 @@ "availableToUnlock": "Available to unlock", "currentlyLocked": "Currently Locked", "walletBalance": "Wallet balance", - "raffleWinnings": { - "oneWin": "Locked until {{date}}", - "multipleWins": "Time locked winnings" - } + "timeLockedInSablier": "Time locked in Sablier", + "unlockInSablier": "Unlock in Sablier" } }, "raffleWinnerBadge": { - "text": "{{value}} GLM winnings", - "tooltipWinningRow": "{{value}} prize locked until {{date}}", + "text": "{{value}} GLM", + "textCancelled": "{{value}} GLM stream cancelled", + "tooltipWinningRow": "{{value}} GLM locked in Sablier until {{date}}", + "tooltipStreamCancelled": "Your Sablier stream was canceled due to your inactivity in the last allocation window. If you believe this is a mistake, please open a help ticket on Discord.", "tooltipCurrentBalanceRow": "{{value}} your locked balance" } }, @@ -586,4 +586,4 @@ "information": "We're synchronizing things to prepare the
next epoch, so the app will be unavailable
for a little while. Please check back soon." } } -} +} \ No newline at end of file